From a950e168027b7b94f1e4af84c49a8a2bcca6a7e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20Br=C3=B6ker?= Date: Wed, 12 Jun 2024 15:57:07 +0200 Subject: [PATCH] DN-34: Updated to map.apps 4.18.1 --- .eslintrc | 6 + .gitignore | 1 + .stylelintignore | 3 + .stylelintrc | 3 + LICENSE | 5 +- README.md | 25 +- RELEASE.md | 4 + build.properties | 4 +- gulpfile.js | 159 ++++- package.json | 34 +- pom.xml | 639 +++++++----------- src/main/config/assembly.xml | 2 +- src/main/js/apps/sample/app.json | 3 - src/main/js/apps/sample/nls/bundle.js | 4 +- src/main/js/apps/sample/nls/de/bundle.js | 4 +- .../bundles/dn_imprintprivacy/ToolHandler.js | 23 +- .../bundles/dn_imprintprivacy/css/styles.css | 2 +- src/main/js/bundles/dn_imprintprivacy/main.js | 4 +- .../js/bundles/dn_imprintprivacy/module.js | 2 +- .../bundles/dn_imprintprivacy/nls/bundle.js | 3 +- .../dn_imprintprivacy/nls/de/bundle.js | 4 +- .../dn_imprintprivacy/tests/all.js} | 3 +- src/main/types/mocha-global.d.ts | 1 + src/main/types/thirdparty.d.ts | 7 + src/main/types/vue-shim.d.ts | 4 + src/test/resources/application.properties | 64 +- src/test/webapp/WEB-INF/web.xml | 16 +- src/test/webapp/favicon.png | Bin 0 -> 45042 bytes src/test/webapp/index.html | 231 ++++--- src/test/webapp/init.css | 243 +++++-- src/test/webapp/js/tests/init-packs.js | 21 + src/test/webapp/js/tests/runTests.html | 24 +- src/test/webapp/js/tests/test-init.js | 45 +- src/test/webapp/login.css | 68 +- tsconfig.json | 19 + 35 files changed, 971 insertions(+), 709 deletions(-) create mode 100644 .eslintrc create mode 100644 .stylelintignore create mode 100644 .stylelintrc create mode 100644 RELEASE.md rename src/main/js/{apps/sample/app.js => bundles/dn_imprintprivacy/tests/all.js} (85%) create mode 100644 src/main/types/mocha-global.d.ts create mode 100644 src/main/types/thirdparty.d.ts create mode 100644 src/main/types/vue-shim.d.ts create mode 100644 src/test/webapp/favicon.png create mode 100644 src/test/webapp/js/tests/init-packs.js create mode 100644 tsconfig.json diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..ae8ae61 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,6 @@ +{ + "extends": "eslint-config-ct-prodeng", + "plugins": [ + "vue" + ] +} diff --git a/.gitignore b/.gitignore index cc762e4..e41ab5f 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ /.vscode/settings.json /.externalToolBuilders/ /package-lock.json +/gulpfile.overrides.js diff --git a/.stylelintignore b/.stylelintignore new file mode 100644 index 0000000..b07fa47 --- /dev/null +++ b/.stylelintignore @@ -0,0 +1,3 @@ +# add path patterns to ignore style files +**/external-libs/** +**/styles/dijit/** \ No newline at end of file diff --git a/.stylelintrc b/.stylelintrc new file mode 100644 index 0000000..57c90c1 --- /dev/null +++ b/.stylelintrc @@ -0,0 +1,3 @@ +{ + "extends": "stylelint-config-ct-prodeng" +} diff --git a/LICENSE b/LICENSE index 261eeb9..8f71f43 100644 --- a/LICENSE +++ b/LICENSE @@ -178,7 +178,7 @@ APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" + boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright {yyyy} {name of copyright owner} Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -199,3 +199,4 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + diff --git a/README.md b/README.md index 2e4dc0d..03ba08a 100644 --- a/README.md +++ b/README.md @@ -48,16 +48,19 @@ https://demos.conterra.de/mapapps/resources/apps/downloads_imprintprivacy/index. } ``` -Development Guide ------------------- -### Define the mapapps remote base -Before you can run the project you have to define the mapapps.remote.base property in the pom.xml-file: -`http://%YOURSERVER%/ct-mapapps-webapp-%VERSION%` +## Quick start + +Clone this project and ensure that you have all required dependencies installed correctly (see [Documentation](https://docs.conterra.de/en/mapapps/latest/developersguide/getting-started/set-up-development-environment.html)). + +Then run the following commands from the project root directory to start a local development server: -##### Other methods to to define the mapapps.remote.base property. -1. Goal parameters -`mvn install -Dmapapps.remote.base=http://%YOURSERVER%/ct-mapapps-webapp-%VERSION%` +```bash +# install all required node modules +$ mvn initialize -2. Build properties -Change the mapapps.remote.base in the build.properties file and run: -`mvn install -Denv=dev -Dlocal.configfile=%ABSOLUTEPATHTOPROJECTROOT%/build.properties` +# start dev server +$ mvn compile -Denv=dev -Pinclude-mapapps-deps + +# run unit tests +$ mvn test -P run-js-tests,include-mapapps-deps +``` diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 0000000..b14d54e --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,4 @@ +✅ Tested for map.apps 4.18.1 / Linie 4 + +#### Release Notes +- autogenerated SNAPSHOT-Release diff --git a/build.properties b/build.properties index 844e46b..e97229c 100644 --- a/build.properties +++ b/build.properties @@ -1,5 +1,5 @@ # -# Copyright (C) 2020 con terra GmbH (info@conterra.de) +# Copyright (C) 2023 con terra GmbH (info@conterra.de) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,4 +15,4 @@ # # URL to the remote map.apps instance -mapapps.remote.base=http://%YOURSERVER%/ct-mapapps-webapp-%VERSION% +# mapapps.remote.base=http://%YOURSERVER%/ct-mapapps-webapp-%VERSION% diff --git a/gulpfile.js b/gulpfile.js index 843efda..b63c63c 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020 con terra GmbH (info@conterra.de) + * Copyright (C) 2023 con terra GmbH (info@conterra.de) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,26 +15,165 @@ */ const gulp = require("gulp"); const mapapps = require('ct-mapapps-gulp-js'); +const mapappsBrowserSync = require("ct-mapapps-browser-sync"); + +const isProduction = process.env.NODE_ENV === "production"; +console.info(`Configuring gulp build for ${isProduction ? "production" : "development"}`); + +const localOverrides = (function () { + if (isProduction) { + // Never override defaults in production mode + return undefined; + } + + try { + return require("./gulpfile.overrides"); + } catch (e) { + // File may not exist + return undefined; + } +})(); + +// used to transport test urls in "run-browser-tests-local" task +const runBrowserTests = []; mapapps.registerTasks({ + /** Enable debug logging */ + debug: localOverrides?.debug ?? false, + /** enable linting */ + lintOnWatch: localOverrides?.lintOnWatch ?? true, + /** enable es6 by default */ + forceTranspile: true, /* A detailed description of available setting is available at https://www.npmjs.com/package/ct-mapapps-gulp-js */ + compress: isProduction, + + /* build source maps as e.g. ".js.map" */ + sourceMaps: "file", + + /** Build Unit-Tests only in dev mode */ + rollupBuildTests: !isProduction, + /** Amount of Threads used to build the bundles, if there are only a few bundles 1 is ok. + * More as 3 is normally not required. + */ + rollupBuildMaxWorkers: localOverrides?.rollupBuildMaxWorkers ?? 1, + + /** List of build time flags, usage like: import { debug } from "build-config!". + */ + rollupConfig: { + debug: !isProduction + }, + /* a list of themes inside this project */ - themes: [/*"sample-theme"*/], + themes: [], /* state that the custom theme will be dependant from map.apps everlasting theme that provides the base styles */ hasBaseThemes: true, - /* state that we want to support vuetify components and therefore need the the vuetify core styles*/ + /* state that we want to support vuetify components and therefore need the vuetify core styles*/ hasVuetify: true, - /*themeChangeTargets: { - "vuetify": [ - "sample_theme" + themeChangeTargets: { + "vuetify": [] + }, + /* A list oft target browser versions. This should be streamlined with Esri JS API requirements. */ + transpileTargets: { + firefox: 102, + edge: 104, + chrome: 104, + safari: 15 + }, + runBrowserTests, + watchFinishedReceiver() { + if (localOverrides?.autoReload ?? true) { + mapappsBrowserSync.state.reload(); + } + } +}, gulp); + +mapappsBrowserSync.registerTask({ + // on which port to listen + port: localOverrides?.port ?? 9090, + // activate https protocol, generates a self signed certificate for "localhost" + // https://browsersync.io/docs/options#option-https + https: localOverrides?.https ?? false, + + // to prevent auto open of browser, set this to false + urlToOpen: localOverrides?.openBrowser ?? true, + properties: { + paths: [ + // Ensure @@key@@ expressions filtered in tests files + /^\/js\/tests\/(runTests.html|test-init.js|init-packs.js)$/ ] - }*/ -}); + }, + jsreg: { + //npmDir : __dirname + "/node_modules/", + npmModules: [ + "mocha", + "chai", + "@conterra/mapapps-mocha-runner" + ] + }, + // prevent reload by browser sync (reload triggered on watch end) + externalReloadTrigger: true +}, gulp); -gulp.task("default", +gulp.task("build", gulp.series( "copy-resources", "themes-copy", - gulp.parallel("js-transpile", "themes-compile") + gulp.parallel( + "js-transpile", + "rollup-build", + "themes-compile" + ) + ) +); + +gulp.task("lint", + gulp.parallel( + "js-lint" + /*, comment in to lint .css/.less files + "style-lint" + */ + )); + +gulp.task("preview", + gulp.series( + "build", + gulp.parallel( + "watch", + "browser-sync" + ) + )); + +gulp.task("run-tests", + gulp.series( + "browser-sync-start", + function transportTestUrls() { + // transport test url to run-browser-tests + // eslint-disable-next-line max-len + const testsAt = mapappsBrowserSync.state.url + "/resources/jsregistry/root/@conterra/mapapps-mocha-runner/latest/mocha.html?boot=/js/tests/test-init.js&timeout=5000&test=dn_imprintprivacy/tests/all&reporter=tap"; + runBrowserTests.push(testsAt); + return Promise.resolve(); + }, + "run-browser-tests", + "browser-sync-stop" + )); + +gulp.task("test", + gulp.series( + "build", + "lint", + "run-tests" + )); + +gulp.task("compress", + gulp.series( + "build", + "themes-compress", + "lint" ) ); + +gulp.task("default", + gulp.series( + "build", + "lint" + )); diff --git a/package.json b/package.json index a675a5e..6c71dea 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,36 @@ { - "name": "test", + "name": "mapapps-4-developers", "description": "test build", "version": "0.0.1", + "license": "CC0-1.0", + "scripts": { + "check-licenses": "tsx ./src/support/js/check-licenses.ts", + "check-types": "tsc --noEmit", + "watch-types": "tsc -w --noEmit" + }, "devDependencies": { - "ct-mapapps-gulp-js": "^0.3.6", - "vue-template-compiler": "2.6.6", - "@types/arcgis-js-api": "4.13.0" + "@conterra/ct-mapapps-typings": "~4.18.1", + "@conterra/mapapps-mocha-runner": "1.1.1", + "@conterra/reactivity-core": "^0.4.0", + "@types/chai": "4.3.10", + "@types/license-checker": "^25.0.6", + "@types/mocha": "10.0.4", + "arcgis-js-api": "4.29.10", + "chai": "4.3.10", + "ct-mapapps-browser-sync": "0.0.39", + "ct-mapapps-gulp-js": "0.10.3", + "eslint-config-ct-prodeng": "1.4.0", + "license-checker": "25.0.1", + "mocha": "10.2.0", + "puppeteer": "21.5.2", + "stylelint": "15.11.0", + "stylelint-config-ct-prodeng": "2.0.0", + "stylelint-config-recommended": "13.0.0", + "stylelint-config-recommended-less": "2.0.0", + "ts-node": "^10.9.1", + "tsx": "^4.6.0", + "typescript": "5.4.5", + "vue": "2.7.15", + "vue-template-compiler": "2.7.15" } } diff --git a/pom.xml b/pom.xml index 3db450f..4fa2d8b 100644 --- a/pom.xml +++ b/pom.xml @@ -1,7 +1,7 @@ - + 4.0.0 de.conterra.devnet - mapapps-imprint-privacy - 1.0.4-SNAPSHOT + mapapps-devnet-blueprint + 4.18.1 jar @@ -40,7 +41,6 @@ - de.conterra.mapapps ct-mapapps ${mapapps.version} @@ -50,16 +50,6 @@ - - de.conterra.jsregistry - ct-jsregistry-embedded - test - - - de.conterra.mapapps - ct-mapapps-proxy - test - org.vuejs @@ -67,7 +57,6 @@ dev test - org.vuetifyjs vuetify @@ -88,7 +77,6 @@ ${ct.jsrt-test.version} test - @@ -103,6 +91,10 @@ ct-jsregistry-maven-plugin ${ct.jsregistry.version} + + maven-deploy-plugin + 2.8.2 + org.apache.maven.plugins maven-resources-plugin @@ -114,12 +106,12 @@ org.apache.maven.plugins maven-source-plugin - 3.0.1 + 3.2.1 org.apache.maven.plugins maven-jar-plugin - 3.1.1 + 3.2.0 ${js.build.outputPath} @@ -128,27 +120,14 @@ apps/** **/tests/** + **/sample_tests/** + **/theme-common/** maven-war-plugin - 3.2.2 - - - org.codehaus.mojo - exec-maven-plugin - 1.6.0 - - - org.eclipse.jetty - jetty-maven-plugin - 9.4.17.v20190418 - - - jar - - + 3.2.3 org.codehaus.mojo @@ -163,26 +142,20 @@ com.github.eirslett frontend-maven-plugin - 1.6 + 1.14.2 - v12.13.0 - 6.12.0 + v20.9.0 org.codehaus.mojo build-helper-maven-plugin - 3.0.0 + 3.1.0 maven-release-plugin 2.5.3 - - de.jutzig - github-release-plugin - 1.1.1 - maven-assembly-plugin 3.0.0 @@ -197,25 +170,9 @@ setproperties-maven-plugin 1.0.2 - - de.conterra.jsrt - ct-jsrt-test-maven-plugin - ${ct.jsrt-test.version} - - - maven-scm-plugin - 1.9.5 - src/main/js - - - src/main/js - ${js.build.outputPath} - false - - src/test/resources @@ -238,10 +195,33 @@ + + org.apache.maven.plugins + maven-enforcer-plugin + 3.4.1 + + + enforce-versions + + enforce + + + + + [3.8.0,) + + + [17,) + + + + + + de.conterra.maven setproperties-maven-plugin - 1.0.2 + 1.0.3 @@ -250,9 +230,7 @@ - - . @@ -260,7 +238,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.0 + 3.11.0 true @@ -268,7 +246,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.1.0 + 3.5.0 true @@ -276,6 +254,7 @@ org.apache.maven.plugins maven-dependency-plugin + 3.5.0 unpack-themes-src @@ -288,8 +267,7 @@ de.conterra.mapapps - ct-mapapps-js-api - ${mapapps.version} + ct-mapapps-js src ${project.build.directory}/unpacked layout/theme-everlasting/**,layout/theme-common/** @@ -307,61 +285,32 @@ + + copy js-libs into 'bundle-imports' + generate-resources + + copy-dependencies + + + ${project.build.directory}/bundle-imports + + org.apache.maven.plugins maven-resources-plugin - - UTF-8 - - - - de.conterra.jsregistry - ct-jsregistry-maven-plugin - build-jsregistry.properties - process-resources + - buildPacksProperties + testResources + process-resources - ${js.build.outputPath} - ${js.build.outputPath} - - - - org.eclipse.jetty - jetty-maven-plugin - - - ${jetty.port} - - 9966 - jetty-stop - 60000 - 0 - manual - ${basedir}/src/test/webapp/WEB-INF/web.xml - true - - / - - ${root.build.outputPath},${basedir}/src/test/webapp - - - .*/ct-jsregistry-embedded-[^/]*\.jar$ - - - - - catalina.base - ${project.build.directory} - - + UTF-8 @@ -369,23 +318,17 @@ frontend-maven-plugin + run gulp ${gulp.task} gulp + process-resources ${gulp.task} - - - - - watch-changes - - gulp - - none - - watch + + ${gulp.node.env} + @@ -398,17 +341,25 @@ con terra GmbH info@conterra.de - 2020 + 2023 src/main/js/**/*.js + src/main/js/**/*.ts src/main/js/**/*.vue src/main/js/**/*.css + src/test/**/*.js + src/test/**/*.html + src/test/**/*.css + src/test/**/application.properties src/main/config/assembly.xml **/build.properties **/gulpfile.js **/pom.xml + + src/main/js/**/*.min.js + XML_STYLE @@ -441,19 +392,55 @@ - \s*"bundleLocations"\s*:\s*\[\s*"localbundles"\s*,\s*"bundles"\s*\]\s*,\s* - - + + \s*"bundleLocations"\s*:\s*\[\s*"localbundles"\s*,\s*"bundles"\s*\]\s*,\s* + + + de.conterra.jsregistry + ct-jsregistry-maven-plugin + + + build-jsregistry.properties + process-resources + + buildPacksProperties + + + + apps/**,bundles/sample_tests + + + + + ${js.build.outputPath} + ${js.build.outputPath} + + de.conterra.mapapps mapapps-maven-plugin + + + true + false + ${js.build.outputPath}/apps + ${project.build.directory} + + + + create-app-zips + + deployApps + + build-app-template prepare-package @@ -473,10 +460,6 @@ - - true - false - maven-assembly-plugin @@ -502,142 +485,80 @@ @{project.version} clean - compress,github-release + compress true - - -Dusername=${scm.username} -Dpassword=${scm.password} - ${scm.username} - ${scm.password} - scm:git:https://github.com/conterra/mapapps-imprint-privacy.git - scm:git:https://github.com/conterra/mapapps-imprint-privacy.git - https://github.com/conterra/mapapps-imprint-privacy + scm:git:https://github.com/conterra/mapapps-devnet-blueprint.git + scm:git:https://github.com/conterra/mapapps-devnet-blueprint.git + + https://github.com/conterra/mapapps-devnet-blueprint HEAD - ct-dist-releases-file - repository for sdi.suite releases - ${release.deployment.url} + ${dist.releases.id} + ${dist.releases.url} - ct-dist-snapshots-file - repository for sdi.suite snapshots - ${snapshot.deployment.url} + ${dist.snapshots.id} + ${dist.snapshots.url} UTF-8 - ${project.build.directory}/webapp ${root.build.outputPath}/js - 4.8.3 + 4.18.1 + 1.5.30 ${mapapps.version} - 1.3.6 - 1.1.5 + 2.1.1 + 2.0.2 sample - + *://*:*/**; * - 9090 + $\{mapapps.remote.base\} + mvn + development - - false - ${env.USER_NAME} - ${env.USER_PW} + + + + + + + + + true + + false + + false - - run-js-tests - - - - org.codehaus.mojo - build-helper-maven-plugin - - - reserve-jetty-port - - reserve-network-port - - process-test-classes - - - jetty.server.port - - - - - - - org.eclipse.jetty - jetty-maven-plugin - - - jetty-start - process-test-classes - - start - - - - ${jetty.server.port} - - 0 - true - - - - jetty-stop - prepare-package - - stop - - - - - - com.github.eirslett - frontend-maven-plugin - - - run gulp js tests - test - - gulp - - - run-browser-tests --tests - http://localhost:${jetty.server.port}/js/tests/runTests.html - - - - - - - - include-mapapps-deps de.conterra.mapapps - ct-mapapps-js-api + ct-mapapps-js test @@ -660,6 +581,11 @@ ags-js-api4 test + + com.esri + terraformer-js + test + moment-js moment-js @@ -670,6 +596,11 @@ apprt-polyfill test + + de.conterra.js + reactivity + test + @@ -711,8 +642,8 @@ env-dev @@ -722,9 +653,8 @@ ${basedir}/build.properties - + + preview @@ -750,68 +680,93 @@ - watch-all - - - env - dev - - + run-js-tests + + test + + + + compress + + compress + production + - org.codehaus.mojo - exec-maven-plugin + maven-deploy-plugin + + true + + + + de.conterra.jsregistry + ct-jsregistry-maven-plugin - trigger-watch-changes - test-compile + calculate js dependencies + + calculateDependencies + + + - github-release + upload - de.jutzig - github-release-plugin + de.conterra.mapapps + mapapps-maven-plugin + + ${skip.apps.upload} + true + ${project.artifactId} + ${project.artifactId}-${project.version} + PUBLISHED + ${mapapps.remote.base}/resources + ${mapapps.user} + ${mapapps.pw} + ${mapapps.token} + ${mapapps.useChunkedRequestEncoding} + ${triggerPreOptimization} + + + + de.conterra.jsregistry + ct-jsregistry-maven-plugin - github-upload - deploy + deploy-bundles - release + deployJSPackage - ${project.version} - ${project.build.directory}/${project.artifactId}-${project.version}.jar - - - - ${project.build.directory} - - ${project.artifactId}-bundle.zip - ${project.artifactId}-sample-app.zip - - ${project.artifactId}*.zip - - - + ${mapapps.remote.base}/resources/jsregistry + ${mapapps.user} + ${mapapps.pw} + ${mapapps.token} + ${mapapps.useChunkedRequestEncoding} @@ -843,7 +798,6 @@ ${basedir} src/main/js/**/manifest.json - src/main/js/**/package.json src/main/js/**/tests/** @@ -858,6 +812,10 @@ "~${replace.source.version}" "~${replace.target.version}" + + ^${replace.source.version} + ^${replace.target.version} + @@ -866,146 +824,5 @@ - - commit-release-versions - - - - maven-scm-plugin - - - validate - - checkin - - - [update-bundle-package-versions] from ${replace.source.version} to - ${replace.target.version} - - ${basedir}/src/main/js - ${scm.push} - ${scm.username} - ${scm.password} - - - - - - - - - compress - - - - de.conterra.jsregistry - ct-jsregistry-maven-plugin - - - calculate js dependencies - - calculateDependencies - - - - optimize js - - optimizeJS - - - - false - - - - apps/** - **/tests/** - - - - - - optimize CSS - - optimizeCSS - - compile - - - - bundles/*/*/*.css - - - **/themeSettings.css - - - - - - - - - - - upload - - - - de.conterra.mapapps - mapapps-maven-plugin - - - false - true - ${project.artifactId} - ${project.artifactId}-${project.version} - PUBLISHED - ${mapapps.remote.base}/resources - admin - admin - - - - de.conterra.jsregistry - ct-jsregistry-maven-plugin - - - deploy bundles - - deployJSPackage - - - ${mapapps.remote.base}/resources/jsregistry - admin - admin - - - - - - - - - windows - - - Windows - - - - mvn.cmd - - - - unix - - - unix - - - - mvn - - diff --git a/src/main/config/assembly.xml b/src/main/config/assembly.xml index 8d9db64..0441c06 100644 --- a/src/main/config/assembly.xml +++ b/src/main/config/assembly.xml @@ -1,6 +1,6 @@ ProxyServlet ProxyServlet - de.conterra.mapapps.proxy.ProxyServlet + de.conterra.proxy.servlet.ProxyServlet 0 @@ -19,4 +19,16 @@ /proxy + + + + default + + useFileMappedBuffer + false + + + diff --git a/src/test/webapp/favicon.png b/src/test/webapp/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..899ca557bfbbd79efe37f425a2bac85cf7fa23d4 GIT binary patch literal 45042 zcmeGCWo#Y6+bDR(5Hm9~``C`zF~-bx%*@Qp%rVEz%*@Qp%*@Pme9W8s{`bB!(r7+h z&CF_7+Lo%TtDovtsXtVy>-U8JmJ>&W!-M}X=(Y++|hqHJMf^6dv3 z6EhbRGiTCI)9HUb2>wS8B|B4RHv>nLZ-T~lh9)Fp7LF!vc8*p~B*ID@r=9gt-@ZXT z+B>SMxo2K!O2=<-pd^V=P{ibsBJGM+|4mPtiMvP5FTcDj&olzI_Y;swGby$Y5s+}g zEYt}6QX(%)1V5sUg^h%WAX{_)@Gxh4f9~=7XaLoNSP%vbxClZ&z-)R(%vuC^ujgFf zJ`S#HcL-fO1`d#R+&VrEezdf8r8I-4ZIT5ha*k&1&0ZSbH9i4;|JBs9t)TpZ&nuG0 zep?O8{+jJu3EXzzd2#o72AkjDFI=r*_VA)YuzN1gZAX@gJ=<~U3 zW{XdT`n8h6GKfE>$AI6N4H?%h`NZq*RVNIC?40GR$5C-KbqMc!+KvcLJbYu=|9#j` z`t9Hr3t%rtei!0Z?e6Rhdt!i7_r_QBmqMaZ#SMS zZx20swDxX!L2Em{{$IY4o1E{xi6D<}R^d&fVdvSM0?_%_OPvm>7q`;hkS0Tz}3rSH;L zvMfW4xG$3_=ZLhRXZ!FzbstmW!bFA&4%9C`;?MMFLCA9ZJ6x7_MgB;;e}g^}`UwED z#IBJFA2JsrObn{3Ls~wnqux5Xb9yFlS5L4I( zH1rLP-DqPstob#{h0*D6GOIxfncllVFepOvysMc~ z+{^UP7Mk+>d0JftJed2o`kC}e-6jWo#OQj4M?bouUHBUeTWsvvD#u@>qBBu?A2o6+ z-bL0!EFM&7>~gOasvm0V`wVchd$2DSa)8`S;Ub4KGygY;%oWdLG%mg~8|HRpDi{IOGMu@t`%Lj3*kp~UixD{VXL z5wyr?^2sIlyA^4pjcJFP%xKumpEPV|2dNU3dvY^g7{8pIzVBpxc8>QC0^VOINgy6kp8ecQ=({KD(z#wq z9HN?d;>B>vNtO@e6#>Q0tc+)2l_pTaL~DB>mV++_>XA0OX|qI6J9Jb z0=RnW37Ue~b%u5GsxgmF}Us8v>n^S*jL95{k^)Kx;Tt4X1!hz=sIu3-V7|DX^5vCd73(&g|sJZ8<3XNX=99jDdlFRxiV%MIr7So6k5z=^j!>voJ{G?@A`I?wK z0pvaSa7adQmI@R=Ua3#3a7SS$!uKvLEcx+$4j*~)-!Y1+IVs@Y41zM66EipK$)m@K z^CQNdiH*Mj6ibMm*lD!i6d`-izFO>dLTmJTkmTj%zs$bSF;Op@*XDl#{XFDvUqAFl zL%i`v*zeU85r;ar&(AsN&>f3l6Bjm}zf#zHA3Rqpe{y0s*qOZj+;sg?a^uvRhD}3c zyBh%BP$@Q3V%}_A_0&T_(p3SB2hg#;eUbnLavYT>^dvbjU}%qAwDDj(z6A1@-3mVR zY%IS>Lb`aNM?VElJX^NDa_ad61dy4SnEvv3zk}{NCdA(hXrJFvzP?QUO~HOl_X0kz zgN}1d+dn?HH9u!8zcfB)77?4SJKeZ9pOT>ACvE>@6Bh7TNei8k$?)j#c?SKr>t=`O1DT~a#0V7axusP zR7`HR0;+E|cW?W#LphJnDMK}^aq?JS=6_HlStA)DE!bM1MpvS#y$SX?zZefNypGdB z&(9ii;J9C41j|IhaL4nZ|JF$f8!I8P*X{Aof7g)z%KxQGCN&GW-~93PEylp^z_-DmPSb0t|En~qzNJ*u%6P+yBDl^z5X)U*rd(#id>Qk}LV8-9I+lwr=lbrqEg&5bHorZ9mIW%UL(%n7qy=SQXGC)9KZv zwwx9p$h-!5x@0_pMOkdztEfaKQE8P&RW9(VONYh-hO*>$K5b3zqxuVVrUTj|&zo?i zqfe}*ZWtCmI<>h=b6rxEj(IyWzUSZM4ngWR9Xh8L^M&=ipsJNdi<>(*j`qhcf!u_4 zhS%k*1=CnUXRnckV!}qKO8Z_*;?_&5j!ORKHQf=_YlDi#+=d!LdBW9Gby>5WTv=?S z^V+$!;a=I_FljyGe-%`dT(~^JcJ%tTVXgU&2&9Hr!qZ$uCmT%+fPajd%QC?j^^#(L zyXMIp8yc}#Q#sWt6s<;y!CEi=T#X_Kjm}FE6KBQcB?=lby5&M33hO(7w7ntRG{I?Q z+yMf?*e8M@yi0KWnYjFIj^Jrlu>Db$;S(8sO$lU5Q)d^eJj^}6&tkCI5TyqedqiGk zLFU;=lQ?@ZsP5O>5X?gp%ws)`7?})$`3!@(fXNU$JE)uuY;$sPOkXuA0@!!7t$WzT zFyE@wns-bM9#f4PzmLpFY`Nw>I%|A12NTi+M7I-IXBXAB<$nTJ6}NeXVwLzR>w$lK zDxy9&?RVg4yM#}@DYo=MmG<7;{xjb-2ds>;+6eer=!FVc%$1>{$8!~M+314A7+|Ir zVA4yCmzRzM3wNaM=Z}|+#A_G)I`~H4x&4viG_IkJ3Q-cAn9)DIPhqcOThKCyZO3(>K zos*r-fDcD2cr3AbQ0*Mx;2Sy7l2F^&&`(~Zh~4|Ltf)hY-YYqhGxxVQ7R$BP75R4c zK}%po7!vm`P@@<7W42D(I~y(GFz{nlQCr zLtxCHB~)VG#C;W-5yM~DkwP`$hDqV0H1`^lOWe$w2S5pp4=B(FZn@z=lr`H@nZt+oVxWC)>S z69sFKGMBbHH5DC&78>|kEIyHGMEw$L;V`4DNN+$g7}a&K_A6FfJaL=!OB~=e&3Q64 z6E{#@wiMtLph!pmR2?oGIZUxF)FrNk6Uc<5lFGOpPNJ#eI=1dD6+r2^PHwR;m2+S| zBO~>Fpp&99p3mJhNr8Hdjwb=Gd}R;Ev>>f7$>g=!R5pU5wijZ-b2SU6Z=2fh{K$MKz{3=1MdNi)9q8)LDNb8_TblC6sqysmihmhHE ztkDTL+IY8jApggAxpT>nQ*d2U?n#*d#x;a`l7%-8rTa9Xr=tBh(Ni|@;M%pmGq|&H) z0-Q#vd$L%{rlI*57KRFtT*~e{^hh@Ysl~)f9OQPj)AZ71q|K*<$92J^wIZjQp=k(? z_=+*@sw7`Q;vL#+9WraM>h}aIxaNPD0$N3ZvA-7Y*Y=BelZHpiBl6Zu|5%c;4ndIY zptEdddQTaED=R@+N_3N{se9u^4xQBXa{TNZ@qXej&}*3iJJ~@spGpD$2!{Abeti!< zVK)yfLBYVxXe5cs5hL=dGccVLPIiVOQzcPsQ@mE>cHxj3mBK=GXqx$XMyFrZ>Y_OrPiaA-WOy4folSIlLtq%9x${idDV2>kej>9_R2 z>J|+8rK$sEl2=tIf<(G!Ci_o~z}ovEF%r@xK+5!K9%nrY7wx_M}IE? z67npmJ6hE8-8K}pRcNad<11Kf$QH*B%OSEVC~XkeS;QKDQbv6I#BY34n2c#qJgLYf zRT4DV)T<7%bnuen07Ng%PRg5#)g|Tznm48*oo|8-5t`0r!M2>XF2FN83xB^1a}E0` zKlB4}#H!@?Q-Fp z+F?D_?vy%#5l{9K;URL#wIe}YC7qWyD#S&_?nIMC%K%DKB+tS;G&5OCI4~yQxTj_< zjwAf0Tw+|&qhKk55DeS{eJ=`pI6knNm(#VT(nwutjPSaW1ULXyh?4h4V|)L^P@t?E z^2=lPB9IKKm?UUt>m?(lCL^y(j7O}CEC)3S3BKf$c;R^j>XG~w(X&r_AAZ=x^wVVV z%*$Iwdk`Q8O?ty?dyvwmuYyl}j#d$|QyfGlq7_5z$>C4~-Ft?`jn@j)#jzI%JQUs0 z62LX@W5-wMSkyr*=-F@fg{i@Kv&wi=NW!*&lwecmOUSbs`+d5ap8L=)pNaa1fo>FhQF8JG@B#Ntn z)Zc6xMU^a%3X3n|V_obDZI{r1bo}wDxl;%~OTYP&^2j??8LoOcu9z!&10)}piq7$e zc|Xii$O-ok1z%ai9ubd%#2bGcXX-}#S5s9h>t&sJdf2Z8x8(0iVe*V21fq*tMl>jhjSsB4dp5ss*) zzEZ^Sc^dSZp)CrU!eWc3fX$m6uA6WP4*v zQw>QYu}GJ*OPa|BPMI#|W6x$QJc36suM9`7zF|z0k5~+jMEr#j8>hC{9avFu=G^&q z>t&<*!f|N_yu}3Q03$GyKEKzIF#z^&^!n<_0ZKKxv8r_uwJ_c2&VoYDv8|`;jVKn7 zgdh>JZhmOyDuugv%YD{VP?V-O=HPQ;WDWAS=-oW#$a_JQ{RIi-dM6~fOeNV`BJ@f% z_~t-;VzCdjgf$$Mkpv81z#L&R;UsMZ)vpBD*~;(kA=zV)4uait8Za5NtVbsV7+fb( zi4_)2#`F@d$G#qq;I(Vsra7@^AtT5vF=`3vLxrYGLLGs#o`<$EhVWHBMDbz&6+zbw zf~``3zk(CGK>Kk3ll+^j;Q$(Uqyl!zK*-55PX%Qiov{(IJNt<~PIuGKqko8k=YZrn z%96~6C62=?P8H?MhjAV&dMI0*ywSI@^b&9$v_EILkH_o~ZRwzbvLc0nVK`%8_lSD% zq7jZWGb2?VZaXQ$SuN`JJ@Pr3%1=%a%g*(kr% z0~2Vc@p9N%Gw?@rL@xr11rc02!uU~fyi=GkUg0a$31r9d3UB+%jf$m3p9Z*bM7}qEa#5RH%iOt~UE3JNbOg-YTxfm=HBxllZGh zLy;!?-N?WkSJf`(Lh#U2w3MR9Xc3y%7i8kpq2WaO_Zia-*ZVdXYJiKf_)rWn6MGd5 zX2zUQ=VG?b`5R(ht-*I@vAQGweG^}DhJ}umcddM6A5E9}e8CNEtNv?7J5?o>Fi$}% z#ma1au~Ss>QA#BIx$;rF@soFcat?$E-}3{^9Ht7 z8+Pj0s$@F7oUJ-=9I_E63+920W^u7)2YOg92vvE^i!8H^S8Nqiqh`E)0<>5X?s5t$ ztxHoq1~%@f4$6nFcA6TEd$MBX$)fmY5$tuMA?i1(oL`|X2Nr;8{CHFCSxb|+o5J4m^1VNw zeF*BeMCrQZ@am_^K!P1I9}A=DqV&~#Ay0>j48H--yQqur(~9px3GGaYKA%u=$S=$x z+sb?uX_yR>9oLxWZItTFZ9|H9KdWqS{UGRmV^!vS=T*pe>pGHh8wF(XYx&x@_o#`q887s}~ zorBn8d$AuZn%GTAT+gP2Hl)Jzo^r;OEq<3(nctSswco=5#qA-VZ&y=&HD>~h5NQ<7 zX7X9_Z_5N>ec{pEbkg$vzR5JKbX1`q;TqexP=l z-2^}HO9Z{FJtz55TZ3}!i=^SBhl5)#rCfm2ymOapJM%)J@JHl5*U*FNzanZ3WwPk` zCmMn&S_J2fl|Ma@@0N%f8DS+Q6BWXVuBrF4l+oKcctp;4u8?5((V)|FsTH z3Gf9E-F}X;q<3^-oKvC^3QP>^VZsChoXJf~?h73)opl^sS3w4L*B5654la-5i>-09Ob8#KYyA6mqfMQNw&?$K{;#L({k;a{(Hm!`&Heh$Dg!QoA2J5I=`M`r5)OIojj(F*i%-tb)8-mTeZnjJVSF6n}$mB z|L34O2&{T!YJus!%S5{$J!*y*o~HU!%j{Y!);bMOHl`PzV)|37>_#h5I;=n)gG)~; z{i!u}vz1I8C*aoJr6<(?E^2h?d93%}oo&o6J%{zC_SnN#2y~r5HYc}8n_xva7YF^D zsMWEw&C@4J$exNy%zJhS49-~nB@b&7iT(^x;kqF|v#G8DD}2W6X+>}~bS&g7yeVDO zF3Sm-Ke-C8Lckd6ss-OrFf)xjg^Y+#8i_w46+E)MhFxrd$6!cyjR&WxnU;i{3qZfk(Fye<4^(9fuI*Tq4^gK7WC`mIRQaUR7!)4*J_)KC|~A9v%D3je?zq4^1j zHPZN5%H@~kwDlrzR1n-j1Thmsx(pJV>A4Ajs zqgDwivLI{s+{+91UFJkpC1aQW!~E)YCe~+KK0~7~z)*bcOUm_z>v5G550uJs2pWw0 zA|oM~a7~==BR+WGrZeBbVH*LDUTB5tB4hGHP!*d@=8C%sS`YpF!uhNytXRpjnTR`q z-~y(t2Ag~zUylr{)9cVWvf+sXHEXotr6qMD&pad{?H}E7rSGP-jJnOtNr0Stjm?1QBryi&p?lk2h=0x4MvZcnOAVlUL+QL;WYGD zF`>Q>o~C~iz$^?>5CAeSf3cZo(VqFeMgw~=^*KcDS-rc%+WBb)q7dc=2GfK?KK4uB zH^sx91ZehZ1SV#%HhzSg+=$#9WnK>8nhbB#6SqA{?i|Dp`X}pG)mO{$%f?xy)i8K9 zU(~Akg|j_jYDZ#SV4KqK>Z(IGpP@I@2xW_WVn|L7A#9}r-b63G6<*8jQ`Rs|eoWiy zXwx@nadxP^dmOq+2`FV#3gwqRC9YyOMg0zm9uwflMZyR^GEd?Mnz$->W3)w4wTdlZ7-@r<$Gfm(2-gBagpfx?2_ocpT0|2^Iq)!Pi#dw?TR0-lG=aMeR< za*~O@;+q~nM5g3NRiF_Y=tHlOB~^ z;YT5}Z`7dm_+KOgp1jPH)Ye53-%g}5-Y}kxvlx zVyD$?NKYUnwRhu{I_yeDw%TG?3B{WICUp)x|HyO zGxJ#TYof`DxoWs*gEUp420G0EE3fEeDU%f>Cw%myOvW+0$0vhlvLu_TtDM#_UXKu> zy^SSMLX-M6b1BWIhfbb^C-zr4*UmV_jbzCyVLVODloo};p?QumH`RnKTF%?xPJvb2 z>BMOEUP8*voq&n1Ua(a%dp=%@sY`LHPtAT!9ux=zGj)zeCUx!YYU73)c5r}i%})7G zX^lviUD98^gi08i$ez!RfiEUDZ1|TO^ye&JTAJ85Z__Q@seS(F&eFj-`mul8qp|#= zE!LsG5<1Jpq&W7h+jo+!KMAH1-bCUi|Bzp(#ZR)f4$xNd=~GtBUGlX(y{2u9+`d02 zn(>x2wPAl(V@bU7J7&1{V>;O-Z7@joAL_ioMx|$rBt{}*3P0PnT(mtl8WAIdGtYBx zkq@&|sqx8dOy(WyXcqBdF?*H{~&H7U*Svg&k6r4FBShl|Q+pA!%~sB9yxS ziV$Tkp7^FTrsX3_Da=1G@=e16qocNM7H30_Mo6p%==oYLF8@LF8!qRS&&1ZAe)@7o z6AYxSDIM3{Q|VFWlkK;U%jkX|n<)C8avyDq>yx^`vlcON$P2pNBG!6**Yka*2Mo11 ze`TwxCwnO^xYUTCh&SG^s9W}9dRPINLm4`@Nj-eio{;3=dOVYk?97smVx5*lM$@>w zpU;T4Ao!{uH@DNHtvHe!?)FuyR5h?&c~-f)IO=qtbRQh}iN9cMcu8Y@5!x}TTZA^% zqXGM(FEv!tmCfL$LRRZGe}csZb5b{Qs{Y#3`1UJg7NhBXMSl5kKYI>4C6kAcl~Um% zd%d|y4u-Dp6q=)%@vwd8ClY-!(OWBYz%1}*e0LWuGb$Tcc`c`KNiephDvbFVIgD8I zs;j!w!FT@=Zo1)pqB*i0>KEpda1di<&C$Afkc=Y!naWVge}95eb%d4vHJ6qJrw;?=(Zj{@qOf+dq%&0+y_*W$8n2*i;6T)}>5MIL= z^`=^89*2tZ{!i^l#oA<${go|<=ns*oH1=RPF|Dqh{otqHFw79%gbW&3K4QzPy%*~D=zy^H^(u+Y*hbVz zTQ<>qUMmh;v2$&4cyPm>xzq3H>qe?=@9AIwcPSA!zcx7F*dpX@J|NmH9^l|%%-eBw zyQ`0Gjzn&7JKS#}OzE~kbghf80xJkWn!_$XWNIu5f9W$wndaLp0wTXE6KaQN3`}#Y zZ1V-fCF>C>ua*FlHl{8+~sCqQBA41tD0_svf%`-yKn3J zgrzTdMP>+lqcE7aAf0BqMzU3JX_gdZxx6l~b!A>VLw_pkGz9kf#$G+Pyu>Z@@4&8y zK|0iSKu>LKUHs1K12V#vv~&${xPt`D;Up6J4HD$t#e$eAq*yHaGev_$xVe4vADTydR$S|9e0e@c zY|e*Zm(~d{()=J&nD=k;_VZ`Bx#^QU7#;;?EJI?v&E|BoC_@8d^yOQka#ybN-8~tx zETY+kTkxl#yhqU4jH(Py%Wa{%5c9l+X>Q<-bn-gC%U(D6OSI@1_9k}(MRI%boz_!f zgh}%tHrFn|#(37wEjEQ#rMcQ4_H$avauQ4+tbcH-f9KO~_{r@5jr+5)?l`sGVngtP zaI@kmrZusf2v-o1wtqM9qM*!X8jicE|mVb%`xn%$L%&6U}L=QFdYfkI0TA zy~QAX__a@>xtcAdTxUE=Z~+%@n+jWkioFH_$ICc%ixprI18QPI~b(!UWs}yIS zgz7w-%@zPwRH&y`n4MvQV|<(<&oI5&6gSy~W4v5kXoSrNvAy}6%Y?m&bkVQ^afx=# zgdh*8$Auk7^xpH?h!P=emgFJXI*<&@SJ!hzkU2vPr1lG>(wh4JGvON8U zowiKde0;<_uGiUG!5Q3l?G5Wv4sV_aKO@wraz$QrYgg^ocHy}>(-W6U^M;0yI?oft zSA#c3QHnRlp<=LK9k-=Z*e%R}D4=Lx^df5BlU_jh{ zhqebMPr*)Q#OB~aqtj8bxmf+%9Rp+gE}IcnoNKXd=tV6EV_<_P)Usko$+$60>eEYV zqu|G@DmJ$ZfMCn4ZYqC#8GLcDtw}O0dpS0It70x+wd<&01^-DEBz zNSU{jUJXE7EuH8))_}{PKc5L?IGQ4V~BPGFys(mn2w#6?|*~DXYwKVd*3|Z%6rJ?vyxU2%~{OT0tT- zQwTHFu5S@#8}O1Irr5+tC2kRkZ0FmPAf_wbo`V%MX86Mcfhx9-!i{m^2VY7*TdpLc zo`uk$jxx2;-Z{lcnXs#$yP3m0{r+R>K_il;qu2t~jQPunIO*{~_>V8;Rd|L6>rB$` z;SsEY^XUXsK3q(<1t>L^r_?TS&QM9yxh%NKRR0h^E~l6?A&;0JZivA?7ax5ur)6A5=lwADhIEBk@@WSRx7(tS$ws2k%GP`w3R7+(h{N6r}#4(*Ai*zWeB_{1V{gD_P{s}!w9t%6Vrk}msLE26k1RoBv#e|N>8b#t)6Pa#wT7FyV?6e$8+rtF*h-&I@>$wsby0}=<0~W9>7^G5bCFxNJ7oUhf^;l_y?M%voRBt=Z4?CNT+IvM0ThL<=DVeipoR9Lax}SNF`?EUbJ8};CGCdX$66BrSC}x1Ou1LaBd(wewJabj51GV3_V<<_wRgH_ z4}<+Ji(5+i5}|EyX92*<83Eroyd`>AdW-Vi;)l-k6VGMWgL_0rdej2G3S_VR`AR$r z8uejfu@J-&h~@N3{$+dOvU02kJkOnMpJN|6ji;FO=nLPJWy0sFxNKHH`bG&GVU>%3qk~k_ zCHoI_d^;y%5-i}vpPQg=wh@O*NfY9`b_|uZ5Ef?34DH~C+)8q_TmZr<4KktSS(n?o z;oCOS4k|^hic;0%jp4uP6Dp9LtCJhq%_nf?juUBsC)Tsq;>Dp)%h?9Q@jl z%7?CguGO-s3bP8N;SMPV!sX8ya+f+mW4NV?x>0TBAILEc&LU#g60Z{;^I{IL5!77G zBST64KP~rrGliM)Ri9#IsLUvaOm}>=KZx}bT<;B8$ND>qRW_~U4Z|C1?rRameIdo1 zDFSA(9z4pwnSLX!7PAx8Yf>Z39V5q5n}(jMEwmJEW~dLa!`!TF`S5&NzBf|727gfpFRY z4P$b)$xhn{j(k;ISWGD=V7V`(Q(ob=V;ol2nUUvR0qkAKHTzg|sP_4=dae+p9)DUP zy~G*i@j6E$#yvO|^k{}e>y>f-2WvQUp#s(P<~`cEi?`LfUrWKhC?d-ksxLgBO+m9t zS|O-U$p%V~6+%nV>Kc78?%E-iByN%dn>1O%HQvMc@j2*P?!?jaLN|FeTHK*h(7TUG z%vva6pAtHaaw)yAfvV4x)p8Ere1^soY$(<0K=jfF?j-JjZQn>#0+Rd)ovUW=g04No z?wh;!cUskM#J3C(k;1B7183K64~c4Fi0JzVy}E0#$@$X79GxmER-aoSqr{(URBW9L zEVAg+FoXI1$PeWvl5TfN_B&h|Z!v~$xP7njp_P-HG}9jY9E|^UfXDr`UBkZ5;<6T+ zNz8Hjy_-p|P+hzfUq!N(_I5M}-)s7i=EGl%O(ZbNr7LTRm5{FTU(6oY@iT&<5$GX7 z^q+`1B2}XpLnA#*)r4;kb08(g^d(4e_|8(uDRnke(;PDx7z}R%GomR(1p5X?W1~|3lX8#)J1ft2=};&Ox)A(d=69Rd zsivAoURDNnlkz$1)aK(M6=5A#vJbqNthgkAbH1Wiq5SQ$H^u*F1)k=eZwB5oZ1evQ z@c%y!@OLGc2P?ebdXptf%c%jYMV#<9^n|`kesoGjfA`gT42(pt`~NQ0T5G(0Y2V(fc6F^Ulw zZFdB-OEm~EgBHIDCE4KdG4ejbxT@l}?@?Tc#T(v4n_1>M%+jVXfd@V>zw2w%*!zeE z>j?pFLG1pB%iztDp#R9KRN}nl;T#gzy3gDdcukN>e(`=ts4HU5JeJdE7S?k$ToC?C zBmFkY5Y796XA#L~j+_wts69T>N~(Fr(8nd^ct`h^*yLw%rkuN-Y-=lN zz-70*VVB5fr(fYVy>63e`VLw6?yJq(!?5SK$7W+DcPS2`Kn#&+6`US|(|Bd=r zw=|!Fkn2;_^Qceh9V95AYvh!bEqk#B8 z7oElWE4AUCw%{7Ba;t=!Khe;p;=iTa^vcTgD(O#Cj{;9^SdxM5fAjml3oFy>u*|j{ z)a#qvY2*mqh>ofM=J)gtyU~jn2RGVdj{m*1lODV7Wxo#v7o}=d{7-)WkK~uIIXygB zxPUDQFb*Ag{!f1Y=kU^dj^WzpxPgkxSOpRP$qD$E9N<{_!P2*G1+L}g|NNyJUUiWc z@E?A6nObg1tGd7q_z%CkPOZ9y)Lo?c|A*gQr`FuU8ZL1C|F>xLzo_4TH(RpmE^z(+ z!|(1>do5W5JoeCuhLy4KPU5Zn#jD&o@_eU~vO~c=%#E`eFgep^MQE*U4&b(W7tjoxYlvllhw9glbaHe*9I4z@#G2`k&joWVx>WG?uE&_#}1u5nk| z*0i{HsHfW_xldv7>Z}RhgXY!aq0-%SA#xlMqqKg_x%u?EpmeF+l3x6rE{l4;8I#8( zk6o9}x+$WXYqw=mLAS5$THM$#GQ1fCdIwrfC+dM^*s+nfaSJ@>eHt0g?C=Og5}8fS zunX+S`Bpc;v?S%^%-%Tv*!*ZC_yEkss=;ysJ0z*=B(5E-`9SCYeupC)3gzGb0M`8l z(5I1K7XA6&vxqvy|6~XwTq+%gReCnzOl#t}Ei!9szGaUzQZA-?IA}8ydW!+vgDe|pVUzxe1HM|*z|(aE-2Lgtu1Qy(&=4(jCj8f}9&Z9rck zv!l(p?(zU5m@{)0Z~TIIntq}2kA*uNd7ZC}rmRl*1>9iAVJNtLVe&omwLj4LQd#=s zM!_FpolQ8Bcrm;ETCK4+%;4|iUj}g=H7T=5b`ip!81swL>Ue-L^zXoY z;6G9vcH1cn>_@q2MTJI@BhJ}nh4Mm9fy7QuE(V<#Tk6{%!KbB-yqq*aW)aP^uXTS2 zO}^;Yx(;TIQp|Ua#{V9mi+@J?+XFTfq@ewxW-dx|ZH#6K;MwF3@E#*N-eWon;T z0W=8Bz^3tb?iV)EYLo8f%eCqO-4Dw7MKyZ{%}Tx0Dt|8n!hfj`lihG0XfH|>%-F2X zM)jB2bq}Iv75zGZ-Fu*k)nF%ZDqCu~8(<+>O*gbjZx6ZQB-z9?ES@96-|leX{V1L%QdZ5B*wgk+ zx@iq!l*21%;%rY2-|qnU$0l%%d8>X^VG|ZIl)8+mQ||Az(1kWqN%gNu-1FJ8#f{k4 z*QK1|Lf4VbxbgL@N6E)g>N?AuLZBqpte@_&2U$G7${Tr;fFt%toY$;8BMmyCI68$c`G!d4_z3ycH#S2qd{#9{qExLm4fyuX7la

)>@;{k^pZ$=OS4^NB) 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 literal 0 HcmV?d00001 diff --git a/src/test/webapp/index.html b/src/test/webapp/index.html index d169aba..3095995 100644 --- a/src/test/webapp/index.html +++ b/src/test/webapp/index.html @@ -1,111 +1,134 @@ + - - - - - - - - - - - - - - - - map.apps remote sample - - + - - - -

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ var url = rule[1] || proxyUrl; + proxyrules.push({ + origin: origin, + proxyUrl: url + }); + }); + var trustedServers = "@@cors.request.trustedServers@@".split(/\s*,\s*/) + .filter(function(item){ return item && item.match(/^[^@.].*$/)}); + $apprt.changeConfig({ + isDebug: true, + has: { + "ct-debug": true, + "ct-log-deprecations": true + }, + ct: { + amdPackages: ["apprt@^@@apprt.version@@"], + preFetchBundles: false + }, + apprt: { + request: { + trustedServers: trustedServers, + proxyUrl: proxyUrl, + proxyRules: proxyrules + } + }, + packages: [ + // add local apps directory as amd package + { name: "localapps", location: "@@applicationURL.noscheme@@/js/apps" }, + // add local bundles directory as amd package + { name: "localbundles", location: "@@jsregistry.root.url@@" } + ] + }); + $apprt.startApp({ + configLocation: "localapps", + param: "app", + defaultApp: "@@default.app.name@@" + }); + + + +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ +

+
+
+

 

+
+
+
+
-
-
-

- -

-
-
-

 

-
-
- - + diff --git a/src/test/webapp/init.css b/src/test/webapp/init.css index f0d4822..9f5144e 100644 --- a/src/test/webapp/init.css +++ b/src/test/webapp/init.css @@ -1,51 +1,112 @@ +/** + * Copyright (C) 2023 con terra GmbH (info@conterra.de) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ /* Styles for progress on startup function */ @import url("login.css"); -.start .splashScreen .anim_bg .progress { - background-color: #3C3C3C; /*<<--- put here ur main color.*/ +html, +body { + margin: 0; + padding: 0; + height: 100%; } -.start { - background: #fff !important; +.ct-splashscreen { + /* splashscreen colors*/ + --light-bg-color: #f3f5f8; + --light-secondary-bg-color: #f3f3f3; + --light-normal-text-color: #3c3c3c; + --dark-bg-color: #29292b; + --dark-secondary-bg-color: #48484b; + --dark-normal-text-color: #fff; + --header-expanded-height: 42px; + --footer-expanded-height: var(--header-expanded-height); + + position: absolute; + top: 0; left: 0; right:0; bottom: 0; + display: flex; + flex-direction: column; + background: var(--light-bg-color); + font-size: 15px; /*Set base font-size to prevent jiggling when theme comes in*/ + font-family: sans-serif; +} +.ct-splashscreen, +.ct-splashscreen-header, +.ct-splashscreen-footer { + transition: background-color .8s ease-in-out; } -.started { - background-color: white; - background-image: none +/* in and out of loader */ +.ct-splashscreen { + z-index: 1; /*ensure Splash is above app and can fade in and out properly*/ + animation: splashscreen-appear ease .3s 1 forwards; } -.started .splashScreen { - /*hide splashscreen as soon as application is started*/ - display: none !important; +.started .ct-splashscreen, +.ct-splashscreen--disappearing { + animation: splashscreen-disappear .8s linear 1 forwards; +} +/* ensure splashscreen is hidden when app is started even without splashscreen bundle*/ +.started .ct-splashscreen:not(.ct-splashscreen--disappearing){ + display: none; } -html, -body, -.splashScreen { - margin: 0; - padding: 0; - height: 100%; +.ct-splashscreen-header, +.ct-splashscreen-footer { + flex: 0 0 0; + opacity: 0; + display: flex; + align-items: center; + background-color: var(--light-secondary-bg-color); + box-shadow: rgba(0, 0, 0, 0.12) 0 1px 6px, rgba(0, 0, 0, 0.12) 0 1px 4px; + animation: .5s ease-in-out 2s forwards; +} +.ct-splashscreen-header { + animation-name: header-appear; +} +.ct-splashscreen-footer { + animation-name: footer-appear; + border-bottom: 3px solid #2980b9; } -.splashScreen { - color: #fff; - background: #2c2d2e; +.ct-splashscreen-main { + flex: 1 1 auto; display: flex; flex-direction: column; align-items: center; justify-content: center; - overflow: hidden; - font-size: 15px; /*Set base font-size to prevent jiggling when theme comes in*/ + opacity: 0; + animation: splashscreen-appear .5s ease-in-out 1 forwards; } -.splashScreen { - font-family: sans-serif; +.ct-splashscreen-stage { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + overflow: hidden; + padding-top: 15px; + color: var(--light-normal-text-color); + position: absolute; + top: 0; + width: 100%; + height: 100%; + } -.splashScreen .splashHeader { - font-size: 1.2em; - margin-top: 1em; - font-weight: 100; +.ct-splashscreen-stage .splashHeader { font-weight: normal; font-size: 1.07rem; min-height: 1em; @@ -54,25 +115,24 @@ body, } /*.splashHeader,*/ -.splashScreen .launchLog { +.ct-splashscreen-stage .launchLog{ transition: opacity .5s ease-in-out; } -.splashScreen .launchLog--error { +.ct-splashscreen-stage .launchLog--error{ color: #e74c3c; } -.splashScreen .launch__bundles { +.ct-splashscreen-stage .launch__bundles{ font-size: .8rem; padding-left: .8rem; - color: rgba(94, 94, 94, .7); + color: rgba(94,94,94,.6); position: absolute; - bottom: 0; - left: 0; - + bottom: 55px; + left: 3px; } -.splashScreen .launch__animation { +.ct-splashscreen-stage .launch__animation { position: relative; width: 600px; height: 60px; @@ -80,11 +140,38 @@ body, animation-duration: 6s; } -.splashScreen .dot-outer { +.everlasting .ct-splashscreen, + /* --dark Fuzzy-Selector for dark themes other than everlasting*/ +.ctAppRoot[class*=" --dark"] .ct-splashscreen, +.ct-splashscreen--dark{ + background: var(--dark-bg-color); +} +.everlasting .ct-splashscreen-header, +.everlasting .ct-splashscreen-footer, +.ctAppRoot[class*=" --dark"] .ct-splashscreen-header, +.ctAppRoot[class*=" --dark"] .ct-splashscreen-footer, +.ct-splashscreen--dark .ct-splashscreen-header, +.ct-splashscreen--dark .ct-splashscreen-footer { + background: var(--dark-secondary-bg-color); +} + +.everlasting .ct-splashscreen-stage, +.ctAppRoot[class*=" --dark"] .ct-splashscreen-stage, +.ct-splashscreen--dark .ct-splashscreen-stage { + color: #fff +} + +.everlasting .ct-splashscreen-footer, +.ctAppRoot[class*=" --dark"] .ct-splashscreen-footer, +.ct-splashscreen--dark .ct-splashscreen-footer { + border-bottom: 3px solid #2a2a2a; +} +/* Animated Dots */ +.ct-splashscreen-stage .dot-outer { display: inline-block; } -.splashScreen .dot { +.ct-splashscreen-stage .dot { display: inline-block; width: 30px; height: 30px; @@ -96,54 +183,33 @@ body, animation: bring-in-small-dots 3s infinite ease-in-out; } -.splashScreen--error .dot { +.splashScreen--error .dot{ animation-play-state: paused; } - -.splashScreen .dot-outer:first-child .dot { +.ct-splashscreen-stage .dot-outer:first-child .dot { animation-name: bring-in-and-scale-first-dot; } - -.splashScreen .dot-outer:last-child .dot { +.ct-splashscreen-stage.dot-outer:last-child .dot { animation-name: bring-in-and-scale-last-dot; } - -.splashScreen .dot-1 { +.ct-splashscreen-stage .dot-1 { animation-delay: 0s; } - -.splashScreen .dot-2 { +.ct-splashscreen-stage .dot-2 { animation-delay: 0.21s; } - -.splashScreen .dot-3 { +.ct-splashscreen-stage .dot-3 { animation-delay: 0.42s; } - -.splashScreen .dot-4 { +.ct-splashscreen-stage .dot-4 { animation-delay: 0.63s; } - -.splashScreen .dot-5 { +.ct-splashscreen-stage .dot-5 { animation-delay: 0.84s; } - -.splashScreen .dot-6 { +.ct-splashscreen-stage .dot-6 { animation-delay: 1.05s; } - -@keyframes splashscreen-fadeout { - from { - opacity: 1; - } - 99% { - opacity: 0; - } - to { - display: none; - } -} - @keyframes bring-in-small-dots { from { opacity: 0; @@ -166,7 +232,6 @@ body, transform: translateX(585px); } } - @keyframes bring-in-and-scale-first-dot { from { opacity: 0; @@ -190,7 +255,6 @@ body, transform: translateX(585px) scale(1); } } - @keyframes bring-in-and-scale-last-dot { from { opacity: 0; @@ -219,3 +283,44 @@ body, transform: translateX(585px); } } + +@keyframes splashscreen-appear { + 0% { opacity: 0 } + 100% { opacity: 1 } +} +@keyframes splashscreen-disappear { + from { opacity: 1 } + to { opacity: 0 } +} + +@keyframes header-appear { + from { + opacity: 0; + flex-basis: 0; + } + to { + opacity: 1; + flex-basis: var(--header-expanded-height); + } +} +@keyframes footer-appear { + from { + opacity: 0; + flex-basis: 0; + } + to { + opacity: 1; + flex-basis: var(--footer-expanded-height); + } +} + +/* hide mocked header and footer in mobile layouts*/ +@media (max-width: 768px) { + .ct-splashscreen-header, + .ct-splashscreen-footer{ + display: none; + } + .ct-splashscreen-stage .launch__bundles{ + bottom: 5px; + } +} diff --git a/src/test/webapp/js/tests/init-packs.js b/src/test/webapp/js/tests/init-packs.js new file mode 100644 index 0000000..77ddfb9 --- /dev/null +++ b/src/test/webapp/js/tests/init-packs.js @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2023 con terra GmbH (info@conterra.de) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +if (require.packs["@vue/test-utils"]) { + require.packs["@vue/test-utils"].main = "dist/vue-test-utils.umd"; +} +if (require.packs["chai"]) { + require.packs["chai"].main = "chai"; +} diff --git a/src/test/webapp/js/tests/runTests.html b/src/test/webapp/js/tests/runTests.html index 84422de..afe4f9d 100644 --- a/src/test/webapp/js/tests/runTests.html +++ b/src/test/webapp/js/tests/runTests.html @@ -1,11 +1,27 @@ + - Intern Tests - + Tests + - Redirecting to Intern runner. + Redirecting to test runner. diff --git a/src/test/webapp/js/tests/test-init.js b/src/test/webapp/js/tests/test-init.js index fe44fc0..2c86832 100644 --- a/src/test/webapp/js/tests/test-init.js +++ b/src/test/webapp/js/tests/test-init.js @@ -1,25 +1,42 @@ +/* + * Copyright (C) 2023 con terra GmbH (info@conterra.de) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// eslint-disable-next-line no-undef testConfig({ jsregistry: [{ //root: "url to registry..", packages: [ // register all self hosted packages "*" - ] - } + ]} //uncomment, if project runs in remote mode - , { - root: "@@mapapps.remote.base@@/resources/jsregistry/root", - packages: [ - "apprt-polyfill", - "apprt@4.x", - "apprt-vue@4.x", - "vuetify@~0.14.7", - "esri@4.x" - ] - } + // ,{ + // root: "@@mapapps.remote.base@@/resources/jsregistry/root", + // packages: [ + // "apprt-polyfill", + // "apprt@4.x", + // "apprt-vue@4.x", + // "vuetify@~0.14.7", + // "esri@4.x" + // ] + // } ], - // ensure apprt polyfill is loaded during test execution + // ensure babel polyfill is loaded during test execution deps: [ - "apprt-polyfill" + "apprt-polyfill", + // Needed for import { assert } from "chai" + "/js/tests/init-packs.js" ] }); diff --git a/src/test/webapp/login.css b/src/test/webapp/login.css index 734b4ca..3976a7d 100644 --- a/src/test/webapp/login.css +++ b/src/test/webapp/login.css @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2023 con terra GmbH (info@conterra.de) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ /* * *styles for login window @@ -8,102 +23,86 @@ background-color: #48484B; border: none; color: #fff; - -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.25); - -moz-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.25); - box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.25); + -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.25) ; + -moz-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.25) ; + box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.25) ; font-size: .688em; padding: 0; } - -.start.notheme .esriSignInDialog .dijitDialogTitleBar { +.start.notheme .esriSignInDialog .dijitDialogTitleBar{ background-color: #2C2D2E; font-size: 1.5em; padding: 5px 8px; cursor: move; } - -.start.notheme .esriSignInDialog .dijitDialogCloseIcon { +.start.notheme .esriSignInDialog .dijitDialogCloseIcon{ float: right; cursor: pointer; position: relative; top: -2px; right: 1px; } - -.start.notheme .esriSignInDialog .dijitDialogPaneContentArea { +.start.notheme .esriSignInDialog .dijitDialogPaneContentArea{ padding: 5px 7px 4px 7px; } - -.start.notheme .esriSignInDialog .dijitDialogPaneActionBar { +.start.notheme .esriSignInDialog .dijitDialogPaneActionBar{ padding: 5px 8px 14px; text-align: right; } - -.start.notheme .esriSignInDialog .dijitButtonNode { +.start.notheme .esriSignInDialog .dijitButtonNode{ padding: 4px 12px; color: #fff; font-weight: bold; background-color: #12A5F4; } - -.start.notheme .dijitDialogPaneActionBar .dijitButton:last-child .dijitButtonNode { +.start.notheme .dijitDialogPaneActionBar .dijitButton:last-child .dijitButtonNode{ background: #7C7C7C; } - -.start.notheme .esriSignInDialog .dijitButtonHover .dijitButtonNode { +.start.notheme .esriSignInDialog .dijitButtonHover .dijitButtonNode{ background-color: #2AAEF5; } - .start.notheme .esriSignInDialog .dijitTextBox { background-color: #FFF; - -webkit-box-sizing: border-box; + -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; border: 1px solid #48484B; color: #000; margin-top: 3px; } - .start.notheme .esriSignInDialog .dijitTextBox .dijitInputField { padding-left: 5px; } - .start.notheme .esriSignInDialog .dijitInputInner { border: 0 !important; vertical-align: middle !important; background-color: transparent !important; width: 100% !important; } - -.start.notheme .esriSignInDialog .dijitTextBox .dijitInputInner { +.start.notheme .esriSignInDialog .dijitTextBox .dijitInputInner{ padding: 1px 2px 1px 0; outline: none; } - .start.notheme .esriSignInDialog .dijitTextBox .dijitValidationContainer, .start.notheme .esriSignInDialog .dijitToggleButtonIconChar { display: none !important; } - -.start.notheme .dijitButton { +.start.notheme .dijitButton{ margin: 0.2em; vertical-align: middle; cursor: pointer; } - .start.notheme .dijitOffScreen { position: absolute; left: 50%; top: -10000px; } - -.start.notheme .esriSignInDialog .esriErrorMsg { +.start.notheme .esriSignInDialog .esriErrorMsg{ background: #C0392B; padding: 3px; } - -.start.notheme .esriSignInDialog .dijitTextBoxHover, -.start.notheme .esriSignInDialog .dijitTextBoxFocused { +.start.notheme .esriSignInDialog .dijitTextBoxHover, +.start.notheme .esriSignInDialog .dijitTextBoxFocused{ border-color: #12A5F4; -ms-transition-duration: .1s; -moz-transition-duration: .1s; @@ -112,12 +111,11 @@ transition-duration: .1s; } -.start.notheme .esriSignInDialog .dijitTextBoxError { +.start.notheme .esriSignInDialog .dijitTextBoxError{ border-color: #C0392B; border-right-width: 10px; position: relative; } - .start.notheme .esriSignInDialog .dijitTextBoxError:after { content: '!'; position: absolute; @@ -129,6 +127,6 @@ /*IE and FF calculates the textbox input smaller so that the surround error container doesn't fit'*/ .dj_ie .start.notheme .dijitInputInner, -.dj_gecko .start.notheme .dijitInputInner { +.dj_gecko .start.notheme .dijitInputInner{ height: 22px; } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..ff7e3ae --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "bundler", + "baseUrl": ".", + "paths": { + "*": ["./src/main/js/bundles/*", "./node_modules/@conterra/ct-mapapps-typings/*"] + }, + "allowJs": true, + "noEmit": true, + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "skipLibCheck": true, + "esModuleInterop": true + }, + "include": ["src"] +}