diff --git a/Dockerfile b/Dockerfile
index 2e766bb..c4e5f72 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -27,7 +27,7 @@ COPY nginx.conf /etc/nginx/sites-available/default
RUN rm -rf /usr/share/nginx/html/*
# Copy frontend dist folder to nginx html directory
-COPY --from=build-frontend /app/dist /usr/share/nginx/html
+COPY --from=build-frontend /app/dist/browser /usr/share/nginx/html
# Copy backend from the correct build stage
COPY --from=build-backend /app/publish /app
diff --git a/Front/skydivelogs-app/angular.json b/Front/skydivelogs-app/angular.json
index 80b4071..43fa29c 100644
--- a/Front/skydivelogs-app/angular.json
+++ b/Front/skydivelogs-app/angular.json
@@ -4,25 +4,33 @@
"newProjectRoot": "projects",
"projects": {
"skydivelogs-app": {
+ "projectType": "application",
+ "schematics": {
+ "@schematics/angular:component": {
+ "style": "scss"
+ }
+ },
"root": "",
"sourceRoot": "src",
- "projectType": "application",
+ "prefix": "app",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:application",
"options": {
- "outputPath": {
- "base": "dist"
- },
+ "outputPath": "dist",
"index": "src/index.html",
- "tsConfig": "src/tsconfig.app.json",
- "polyfills": [
- "src/polyfills.ts"
- ],
+ "browser": "src/main.ts",
+ "polyfills": ["zone.js"],
+ "tsConfig": "tsconfig.app.json",
+ "inlineStyleLanguage": "scss",
"assets": [
"src/assets",
"src/config",
- "src/favicon.ico"
+ "src/favicon.ico",
+ {
+ "glob": "**/*",
+ "input": "public"
+ }
],
"styles": [
"src/assets/css/styles-app-loading.scss",
@@ -30,118 +38,86 @@
"src/assets/css/new-theme.scss",
"@angular/material/prebuilt-themes/pink-bluegrey.css"
],
- "scripts": [],
- "extractLicenses": false,
- "sourceMap": true,
- "optimization": false,
- "namedChunks": true,
- "browser": "src/main.ts"
+ "scripts": []
},
"configurations": {
"production": {
"budgets": [
+ {
+ "type": "initial",
+ "maximumWarning": "2mb",
+ "maximumError": "5mb"
+ },
+ {
+ "type": "bundle",
+ "name": "main",
+ "baseline": "1mb",
+ "maximumWarning": "1.5mb",
+ "maximumError": "2mb"
+ },
{
"type": "anyComponentStyle",
- "maximumWarning": "6kb"
+ "maximumWarning": "2kb",
+ "maximumError": "4kb"
}
],
- "optimization": true,
"outputHashing": "all",
- "sourceMap": false,
- "namedChunks": false,
+ "optimization": true,
"extractLicenses": true,
+ "sourceMap": false,
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
]
+ },
+ "development": {
+ "optimization": false,
+ "extractLicenses": false,
+ "sourceMap": true,
+ "fileReplacements": [
+ {
+ "replace": "src/environments/environment.ts",
+ "with": "src/environments/environment.dev.ts"
+ }
+ ]
}
- }
+ },
+ "defaultConfiguration": "production"
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
- "options": {
- "buildTarget": "skydivelogs-app:build"
- },
"configurations": {
"production": {
"buildTarget": "skydivelogs-app:build:production"
+ },
+ "development": {
+ "buildTarget": "skydivelogs-app:build:development"
}
- }
+ },
+ "defaultConfiguration": "development"
},
"extract-i18n": {
- "builder": "@angular-devkit/build-angular:extract-i18n",
- "options": {
- "buildTarget": "skydivelogs-app:build"
- }
+ "builder": "@angular-devkit/build-angular:extract-i18n"
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
- "main": "src/test.ts",
- "karmaConfig": "./karma.conf.js",
- "polyfills": "src/polyfills.ts",
- "tsConfig": "src/tsconfig.spec.json",
- "scripts": [],
- "styles": [
- "src/styles.css"
- ],
+ "polyfills": ["zone.js", "zone.js/testing"],
+ "tsConfig": "tsconfig.spec.json",
+ "inlineStyleLanguage": "scss",
"assets": [
- "src/assets",
- "src/favicon.ico"
- ]
- }
- },
- "lint": {
- "builder": "@angular-devkit/build-angular:tslint",
- "options": {
- "tsConfig": [
- "src/tsconfig.app.json",
- "src/tsconfig.spec.json"
+ {
+ "glob": "**/*",
+ "input": "public"
+ }
],
- "exclude": [
- "**/node_modules/**"
- ]
- }
- }
- }
- },
- "skydivelogs-app-e2e": {
- "root": "e2e",
- "sourceRoot": "e2e",
- "projectType": "application",
- "architect": {
- "e2e": {
- "builder": "@angular-devkit/build-angular:protractor",
- "options": {
- "protractorConfig": "./protractor.conf.js",
- "devServerTarget": "skydivelogs-app:serve"
- }
- },
- "lint": {
- "builder": "@angular-devkit/build-angular:tslint",
- "options": {
- "tsConfig": [
- "e2e/tsconfig.e2e.json"
- ],
- "exclude": [
- "**/node_modules/**"
- ]
+ "styles": ["src/styles.scss"],
+ "scripts": []
}
}
}
}
- },
- "schematics": {
- "@schematics/angular:component": {
- "prefix": "app"
- },
- "@schematics/angular:directive": {
- "prefix": "app"
- }
- },
- "cli": {
- "analytics": false
}
}
diff --git a/Front/skydivelogs-app/package-lock.json b/Front/skydivelogs-app/package-lock.json
index 46c223f..23ece89 100644
--- a/Front/skydivelogs-app/package-lock.json
+++ b/Front/skydivelogs-app/package-lock.json
@@ -19,10 +19,10 @@
"@angular/platform-browser": "^19.2.6",
"@angular/platform-browser-dynamic": "^19.2.6",
"@angular/router": "^19.2.6",
- "@ngx-translate/core": "^15.0.0",
- "@ngx-translate/http-loader": "^8.0.0",
+ "@ngx-translate/core": "^17.0.0",
+ "@ngx-translate/http-loader": "^17.0.0",
"chart.js": "^4.3.0",
- "ng2-charts": "^5.0.2",
+ "ng2-charts": "^8.0.0",
"rxjs": "~7.8.0",
"tslib": "^2.3.0",
"zone.js": "~0.15.0"
@@ -680,13 +680,13 @@
}
},
"node_modules/@babel/code-frame": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
- "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz",
+ "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5",
"js-tokens": "^4.0.0",
"picocolors": "^1.1.1"
},
@@ -695,9 +695,9 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz",
- "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz",
+ "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -783,13 +783,13 @@
}
},
"node_modules/@babel/helper-compilation-targets": {
- "version": "7.27.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
- "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
+ "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/compat-data": "^7.27.2",
+ "@babel/compat-data": "^7.28.6",
"@babel/helper-validator-option": "^7.27.1",
"browserslist": "^4.24.0",
"lru-cache": "^5.1.1",
@@ -810,18 +810,18 @@
}
},
"node_modules/@babel/helper-create-class-features-plugin": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz",
- "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz",
+ "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.27.3",
"@babel/helper-member-expression-to-functions": "^7.28.5",
"@babel/helper-optimise-call-expression": "^7.27.1",
- "@babel/helper-replace-supers": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.28.6",
"@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
- "@babel/traverse": "^7.28.5",
+ "@babel/traverse": "^7.28.6",
"semver": "^6.3.1"
},
"engines": {
@@ -937,29 +937,29 @@
}
},
"node_modules/@babel/helper-module-imports": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
- "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
+ "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/traverse": "^7.27.1",
- "@babel/types": "^7.27.1"
+ "@babel/traverse": "^7.28.6",
+ "@babel/types": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
- "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
+ "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-module-imports": "^7.27.1",
- "@babel/helper-validator-identifier": "^7.27.1",
- "@babel/traverse": "^7.28.3"
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "@babel/traverse": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -982,9 +982,9 @@
}
},
"node_modules/@babel/helper-plugin-utils": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
- "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz",
+ "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1023,15 +1023,15 @@
}
},
"node_modules/@babel/helper-replace-supers": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz",
- "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz",
+ "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-member-expression-to-functions": "^7.27.1",
+ "@babel/helper-member-expression-to-functions": "^7.28.5",
"@babel/helper-optimise-call-expression": "^7.27.1",
- "@babel/traverse": "^7.27.1"
+ "@babel/traverse": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1098,42 +1098,42 @@
}
},
"node_modules/@babel/helper-wrap-function": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz",
- "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz",
+ "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/template": "^7.27.2",
- "@babel/traverse": "^7.28.3",
- "@babel/types": "^7.28.2"
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.28.6",
+ "@babel/types": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helpers": {
- "version": "7.28.4",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
- "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz",
+ "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/template": "^7.27.2",
- "@babel/types": "^7.28.4"
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz",
- "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz",
+ "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.28.5"
+ "@babel/types": "^7.28.6"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -1210,14 +1210,14 @@
}
},
"node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz",
- "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz",
+ "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/traverse": "^7.28.3"
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/traverse": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1240,13 +1240,13 @@
}
},
"node_modules/@babel/plugin-syntax-import-assertions": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz",
- "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz",
+ "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1357,13 +1357,13 @@
}
},
"node_modules/@babel/plugin-transform-block-scoping": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz",
- "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz",
+ "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1373,14 +1373,14 @@
}
},
"node_modules/@babel/plugin-transform-class-properties": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz",
- "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz",
+ "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-create-class-features-plugin": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1390,14 +1390,14 @@
}
},
"node_modules/@babel/plugin-transform-class-static-block": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz",
- "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz",
+ "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.28.3",
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-create-class-features-plugin": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1407,18 +1407,18 @@
}
},
"node_modules/@babel/plugin-transform-classes": {
- "version": "7.28.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz",
- "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz",
+ "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.27.3",
- "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-compilation-targets": "^7.28.6",
"@babel/helper-globals": "^7.28.0",
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/helper-replace-supers": "^7.27.1",
- "@babel/traverse": "^7.28.4"
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/helper-replace-supers": "^7.28.6",
+ "@babel/traverse": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1441,14 +1441,14 @@
}
},
"node_modules/@babel/plugin-transform-computed-properties": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz",
- "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz",
+ "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/template": "^7.27.1"
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/template": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1475,14 +1475,14 @@
}
},
"node_modules/@babel/plugin-transform-dotall-regex": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz",
- "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz",
+ "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1508,14 +1508,14 @@
}
},
"node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz",
- "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.28.6.tgz",
+ "integrity": "sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1541,13 +1541,13 @@
}
},
"node_modules/@babel/plugin-transform-exponentiation-operator": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz",
- "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz",
+ "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1608,13 +1608,13 @@
}
},
"node_modules/@babel/plugin-transform-json-strings": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz",
- "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz",
+ "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1640,13 +1640,13 @@
}
},
"node_modules/@babel/plugin-transform-logical-assignment-operators": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz",
- "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz",
+ "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1689,14 +1689,14 @@
}
},
"node_modules/@babel/plugin-transform-modules-commonjs": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz",
- "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz",
+ "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-module-transforms": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-module-transforms": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1775,13 +1775,13 @@
}
},
"node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz",
- "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz",
+ "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1791,13 +1791,13 @@
}
},
"node_modules/@babel/plugin-transform-numeric-separator": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz",
- "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz",
+ "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1807,17 +1807,17 @@
}
},
"node_modules/@babel/plugin-transform-object-rest-spread": {
- "version": "7.28.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz",
- "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz",
+ "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-compilation-targets": "^7.27.2",
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/plugin-transform-destructuring": "^7.28.0",
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/plugin-transform-destructuring": "^7.28.5",
"@babel/plugin-transform-parameters": "^7.27.7",
- "@babel/traverse": "^7.28.4"
+ "@babel/traverse": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1844,13 +1844,13 @@
}
},
"node_modules/@babel/plugin-transform-optional-catch-binding": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz",
- "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz",
+ "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1860,13 +1860,13 @@
}
},
"node_modules/@babel/plugin-transform-optional-chaining": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz",
- "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz",
+ "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.28.6",
"@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
},
"engines": {
@@ -1893,14 +1893,14 @@
}
},
"node_modules/@babel/plugin-transform-private-methods": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz",
- "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz",
+ "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-create-class-features-plugin": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1910,15 +1910,15 @@
}
},
"node_modules/@babel/plugin-transform-private-property-in-object": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz",
- "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz",
+ "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.27.1",
- "@babel/helper-create-class-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-create-class-features-plugin": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1957,13 +1957,13 @@
}
},
"node_modules/@babel/plugin-transform-regenerator": {
- "version": "7.28.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz",
- "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.6.tgz",
+ "integrity": "sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1973,14 +1973,14 @@
}
},
"node_modules/@babel/plugin-transform-regexp-modifiers": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz",
- "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz",
+ "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -2053,13 +2053,13 @@
}
},
"node_modules/@babel/plugin-transform-spread": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz",
- "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz",
+ "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.28.6",
"@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
},
"engines": {
@@ -2134,14 +2134,14 @@
}
},
"node_modules/@babel/plugin-transform-unicode-property-regex": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz",
- "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz",
+ "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -2168,14 +2168,14 @@
}
},
"node_modules/@babel/plugin-transform-unicode-sets-regex": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz",
- "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz",
+ "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -2307,33 +2307,33 @@
}
},
"node_modules/@babel/template": {
- "version": "7.27.2",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
- "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
+ "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.27.1",
- "@babel/parser": "^7.27.2",
- "@babel/types": "^7.27.1"
+ "@babel/code-frame": "^7.28.6",
+ "@babel/parser": "^7.28.6",
+ "@babel/types": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz",
- "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz",
+ "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.27.1",
- "@babel/generator": "^7.28.5",
+ "@babel/code-frame": "^7.28.6",
+ "@babel/generator": "^7.28.6",
"@babel/helper-globals": "^7.28.0",
- "@babel/parser": "^7.28.5",
- "@babel/template": "^7.27.2",
- "@babel/types": "^7.28.5",
+ "@babel/parser": "^7.28.6",
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.28.6",
"debug": "^4.3.1"
},
"engines": {
@@ -2341,14 +2341,14 @@
}
},
"node_modules/@babel/traverse/node_modules/@babel/generator": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz",
- "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz",
+ "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.28.5",
- "@babel/types": "^7.28.5",
+ "@babel/parser": "^7.28.6",
+ "@babel/types": "^7.28.6",
"@jridgewell/gen-mapping": "^0.3.12",
"@jridgewell/trace-mapping": "^0.3.28",
"jsesc": "^3.0.2"
@@ -2358,9 +2358,9 @@
}
},
"node_modules/@babel/types": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz",
- "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz",
+ "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3994,32 +3994,29 @@
}
},
"node_modules/@ngx-translate/core": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-15.0.0.tgz",
- "integrity": "sha512-Am5uiuR0bOOxyoercDnAA3rJVizo4RRqJHo8N3RqJ+XfzVP/I845yEnMADykOHvM6HkVm4SZSnJBOiz0Anx5BA==",
- "license": "SEE LICENSE IN LICENSE",
- "engines": {
- "node": "^16.13.0 || >=18.10.0"
+ "version": "17.0.0",
+ "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-17.0.0.tgz",
+ "integrity": "sha512-Rft2D5ns2pq4orLZjEtx1uhNuEBerUdpFUG1IcqtGuipj6SavgB8SkxtNQALNDA+EVlvsNCCjC2ewZVtUeN6rg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.3.0"
},
"peerDependencies": {
- "@angular/common": ">=16.0.0",
- "@angular/core": ">=16.0.0",
- "rxjs": "^6.5.5 || ^7.4.0"
+ "@angular/common": ">=16",
+ "@angular/core": ">=16"
}
},
"node_modules/@ngx-translate/http-loader": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-8.0.0.tgz",
- "integrity": "sha512-SFMsdUcmHF5OdZkL1CHEoSAwbP5EbAOPTLLboOCRRoOg21P4GJx+51jxGdJeGve6LSKLf4Pay7BkTwmE6vxYlg==",
- "license": "SEE LICENSE IN LICENSE",
- "engines": {
- "node": "^16.13.0 || >=18.10.0"
+ "version": "17.0.0",
+ "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-17.0.0.tgz",
+ "integrity": "sha512-hgS8sa0ARjH9ll3PhkLTufeVXNI2DNR2uFKDhBgq13siUXzzVr/a31M6zgecrtwbA34iaBV01hsTMbMS8V7iIw==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.3.0"
},
"peerDependencies": {
- "@angular/common": ">=16.0.0",
- "@angular/core": ">=16.0.0",
- "@ngx-translate/core": ">=15.0.0",
- "rxjs": "^6.5.5 || ^7.4.0"
+ "@angular/common": ">=16",
+ "@angular/core": ">=16"
}
},
"node_modules/@nodelib/fs.scandir": {
@@ -5370,9 +5367,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "25.0.6",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.6.tgz",
- "integrity": "sha512-NNu0sjyNxpoiW3YuVFfNz7mxSQ+S4X2G28uqg2s+CzoqoQjLPsWSbsFFyztIAqt2vb8kfEAsJNepMGPTxFDx3Q==",
+ "version": "25.0.8",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.8.tgz",
+ "integrity": "sha512-powIePYMmC3ibL0UJ2i2s0WIbq6cg6UyVFQxSCpaPxxzAaziRfimGivjdF943sSGV6RADVbk0Nvlm5P/FB44Zg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10714,19 +10711,19 @@
"license": "MIT"
},
"node_modules/ng2-charts": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-5.0.4.tgz",
- "integrity": "sha512-AnOZ2KSRw7QjiMMNtXz9tdnO+XrIKP/2MX1TfqEEo2fwFU5c8LFJIYqmkMPkIzAEm/U9y/1psA5TDNmxxjEdgA==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-8.0.0.tgz",
+ "integrity": "sha512-nofsNHI2Zt+EAwT+BJBVg0kgOhNo9ukO4CxULlaIi7VwZSr7I1km38kWSoU41Oq6os6qqIh5srnL+CcV+RFPFA==",
"license": "MIT",
"dependencies": {
"lodash-es": "^4.17.15",
"tslib": "^2.3.0"
},
"peerDependencies": {
- "@angular/cdk": ">=16.0.0",
- "@angular/common": ">=16.0.0",
- "@angular/core": ">=16.0.0",
- "@angular/platform-browser": ">=16.0.0",
+ "@angular/cdk": ">=19.0.0",
+ "@angular/common": ">=19.0.0",
+ "@angular/core": ">=19.0.0",
+ "@angular/platform-browser": ">=19.0.0",
"chart.js": "^3.4.0 || ^4.0.0",
"rxjs": "^6.5.3 || ^7.4.0"
}
diff --git a/Front/skydivelogs-app/package.json b/Front/skydivelogs-app/package.json
index 3ed2027..9b65578 100644
--- a/Front/skydivelogs-app/package.json
+++ b/Front/skydivelogs-app/package.json
@@ -5,7 +5,7 @@
"scripts": {
"ng": "ng",
"start": "ng serve",
- "build": "ng build --configuration production --build-optimizer=true --aot=true --optimization=true --progress=true",
+ "build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
@@ -22,10 +22,10 @@
"@angular/platform-browser": "^19.2.6",
"@angular/platform-browser-dynamic": "^19.2.6",
"@angular/router": "^19.2.6",
- "@ngx-translate/core": "^15.0.0",
- "@ngx-translate/http-loader": "^8.0.0",
+ "@ngx-translate/core": "^17.0.0",
+ "@ngx-translate/http-loader": "^17.0.0",
"chart.js": "^4.3.0",
- "ng2-charts": "^5.0.2",
+ "ng2-charts": "^8.0.0",
"rxjs": "~7.8.0",
"tslib": "^2.3.0",
"zone.js": "~0.15.0"
@@ -43,4 +43,4 @@
"karma-jasmine-html-reporter": "~2.1.0",
"typescript": "~5.5.4"
}
-}
\ No newline at end of file
+}
diff --git a/Front/skydivelogs-app/src/app/app.base.component.ts b/Front/skydivelogs-app/src/app/app.base.component.ts
new file mode 100644
index 0000000..4673b50
--- /dev/null
+++ b/Front/skydivelogs-app/src/app/app.base.component.ts
@@ -0,0 +1,33 @@
+import { inject, OnInit } from "@angular/core";
+import { IconResolver, MatIconRegistry } from "@angular/material/icon";
+import { DomSanitizer } from "@angular/platform-browser";
+import { TranslateService } from "@ngx-translate/core";
+import { ServiceComm } from "../services/service-comm.service";
+
+@decorator
+export class BaseComponent implements OnInit {
+ private titleId: string = "???";
+ protected serviceComm: ServiceComm;
+ protected translateService: TranslateService;
+
+ constructor(titleId: string) {
+ let iconRegistry = inject(MatIconRegistry);
+ let sanitizer = inject(DomSanitizer);
+ const resolver: IconResolver = (name) =>
+ sanitizer.bypassSecurityTrustResourceUrl(`/assets/icon/${name}.svg`);
+ iconRegistry.addSvgIconResolver(resolver);
+
+ this.serviceComm = inject(ServiceComm);
+ this.translateService = inject(TranslateService);
+ this.titleId = titleId;
+ }
+
+ ngOnInit() {
+ this.translateService.get(this.titleId).subscribe((data) => {
+ this.serviceComm.updatedComponentTitle(data);
+ // this.serviceComm.componentTitle.subscribe((title) => (this.title = data));
+ });
+ }
+}
+
+function decorator(target: typeof BaseComponent): void | typeof BaseComponent {}
diff --git a/Front/skydivelogs-app/src/app/app.component.css b/Front/skydivelogs-app/src/app/app.component.css
index 8742655..f506723 100644
--- a/Front/skydivelogs-app/src/app/app.component.css
+++ b/Front/skydivelogs-app/src/app/app.component.css
@@ -1,4 +1,4 @@
-.hamburger__icon {
+/* .hamburger__icon {
position: relative;
height: 1rem;
margin-right: 1rem;
@@ -8,7 +8,7 @@
.hamburger__icon__fill {
fill: #424242
-}
+} */
.navigation.side-menu-active {
left: 0px;
@@ -53,4 +53,4 @@
.mat-icon {
margin-right: 15px;
-}
\ No newline at end of file
+}
diff --git a/Front/skydivelogs-app/src/app/app.component.html b/Front/skydivelogs-app/src/app/app.component.html
index 6c61f30..de07832 100644
--- a/Front/skydivelogs-app/src/app/app.component.html
+++ b/Front/skydivelogs-app/src/app/app.component.html
@@ -1,76 +1,190 @@
-
- {{ title }}
-
+
+ {{ translatedTitle }}
+
+
-
+
-
+
-
+
-
+
- timeline
- {{ 'App_Nav_Summary' | translate }}
-
+
+ {{ "App_Nav_Summary" | translate }}
+
- list_alt
- {{ 'App_Nav_Jumps' | translate }}
+
+ {{ "App_Nav_Jumps" | translate }}
- add_circle
- {{ 'App_Nav_NewJump' | translate }}
-
+
+ {{ "App_Nav_NewJump" | translate }}
+
- list_alt
- {{ 'App_Nav_TunnelFlights' | translate }}
+
+ {{ "App_Nav_TunnelFlights" | translate }}
- add_circle
- {{ 'App_Nav_NewTunnelFlight' | translate }}
-
+
+ {{ "App_Nav_NewTunnelFlight" | translate }}
+
- store
- {{ 'App_Nav_Dzs' | translate }}
+
+ {{ "App_Nav_Dzs" | translate }}
- airplanemode_active
- {{ 'App_Nav_Aircrafts' | translate }}
+
+ {{ "App_Nav_Aircrafts" | translate }}
- flight_land
- {{ 'App_Nav_JumpTypes' | translate }}
+
+ {{ "App_Nav_JumpTypes" | translate }}
- settings_input_antenna
- {{ 'App_Nav_Gears' | translate }}
+
+ {{ "App_Nav_Gears" | translate }}
-
- account_box
-
+
+
+
{{ this.currentUser.firstName }} {{ this.currentUser.lastName }}
- logout
- {{ 'App_Nav_Logout' | translate }}
+
+ {{
+ "App_Nav_Logout" | translate
+ }}
-
+
-
\ No newline at end of file
+
diff --git a/Front/skydivelogs-app/src/app/app.component.ts b/Front/skydivelogs-app/src/app/app.component.ts
index 5769b5e..fe08a5e 100644
--- a/Front/skydivelogs-app/src/app/app.component.ts
+++ b/Front/skydivelogs-app/src/app/app.component.ts
@@ -1,6 +1,22 @@
-import { Component, OnInit } from "@angular/core";
-import { Router } from "@angular/router";
-import { TranslateService } from "@ngx-translate/core";
+import { Component, inject, OnInit } from "@angular/core";
+import { Router, RouterLink, RouterOutlet } from "@angular/router";
+import { CommonModule } from "@angular/common";
+import { DomSanitizer } from "@angular/platform-browser";
+import { MatToolbarModule } from "@angular/material/toolbar";
+import {
+ IconResolver,
+ MatIconModule,
+ MatIconRegistry,
+} from "@angular/material/icon";
+import { MatSelectModule } from "@angular/material/select";
+import { MatOptionModule } from "@angular/material/core";
+import { MatSidenavModule } from "@angular/material/sidenav";
+import { MatListModule } from "@angular/material/list";
+import {
+ TranslateService,
+ TranslateModule,
+ TranslatePipe,
+} from "@ngx-translate/core";
import { User } from "../models/user";
import { CacheApiKey } from "../models/cache-api-key.enum";
@@ -11,42 +27,62 @@ import { ConfigurationHelper } from "../services/configuration-helper";
import { ServiceCacheApi } from "../services/service-cache-api.service";
@Component({
- selector: "app-root",
- templateUrl: "./app.component.html",
- styleUrls: ["./app.component.css"],
- standalone: false
+ selector: "app-root",
+ templateUrl: "./app.component.html",
+ styleUrls: ["./app.component.css"],
+ imports: [
+ CommonModule,
+ MatToolbarModule,
+ MatIconModule,
+ MatSelectModule,
+ MatOptionModule,
+ MatSidenavModule,
+ MatListModule,
+ RouterOutlet,
+ RouterLink,
+ TranslateModule,
+ TranslatePipe,
+ ],
})
export class AppComponent implements OnInit {
- public title = "app";
+ public translatedTitle = "???";
public currentUser: User;
public version: string;
public selectedLanguageFlag: string;
- constructor(private router: Router,
- private authenticationService: AuthenticationService,
- private serviceComm: ServiceComm,
- private serviceCacheApi : ServiceCacheApi,
- private translateService: TranslateService)
- {
- this.authenticationService.currentUser.subscribe(user => {
+ constructor(
+ private router: Router,
+ private authenticationService: AuthenticationService,
+ private serviceComm: ServiceComm,
+ private serviceCacheApi: ServiceCacheApi,
+ private translateService: TranslateService,
+ ) {
+ const sanitizer = inject(DomSanitizer);
+ const resolver: IconResolver = (name) =>
+ sanitizer.bypassSecurityTrustResourceUrl(`/assets/icon/${name}.svg`);
+ const iconRegistry = inject(MatIconRegistry);
+ iconRegistry.addSvgIconResolver(resolver);
+
+ this.authenticationService.currentUser.subscribe((user) => {
if (user) {
this.currentUser = user;
- this.translateService.addLangs(['en', 'fr']);
+ this.translateService.addLangs(["en", "fr"]);
this.translateService.use(user.language);
this.selectedLanguageFlag = user.language;
}
});
- ConfigurationHelper.settings.subscribe(settings =>
- {
- if (settings != null) {
- this.version = settings.version;
- }
+ ConfigurationHelper.settings.subscribe((settings) => {
+ if (settings != null) {
+ this.version = settings.version;
+ }
});
}
ngOnInit() {
- this.serviceComm.componentTitle.subscribe(title => (this.title = title));
+ this.serviceComm.componentTitle.subscribe(
+ (title) => (this.translatedTitle = title),
+ );
}
public show() {
diff --git a/Front/skydivelogs-app/src/app/app.config.ts b/Front/skydivelogs-app/src/app/app.config.ts
new file mode 100644
index 0000000..46428cd
--- /dev/null
+++ b/Front/skydivelogs-app/src/app/app.config.ts
@@ -0,0 +1,73 @@
+import { inject, provideAppInitializer } from "@angular/core";
+import { ApplicationConfig, provideZoneChangeDetection } from "@angular/core";
+import { provideRouter } from "@angular/router";
+import { DatePipe } from "@angular/common";
+import { provideHttpClient, withInterceptors } from "@angular/common/http";
+
+import { DateService } from "../services/date.service";
+import { AircraftService } from "../services/aircraft.service";
+import { DropzoneService } from "../services/dropzone.service";
+import { GearService } from "../services/gear.service";
+import { JumpService } from "../services/jump.service";
+import { JumpTypeService } from "../services/jump-type.service";
+import { StatsService } from "../services/stats.service";
+import { ServiceComm } from "../services/service-comm.service";
+import { RequestCache } from "../services/request-cache.service";
+import { ImageService } from "../services/image.service";
+import { ConfigurationHelper } from "../services/configuration-helper";
+import { ServiceCacheApi } from "../services/service-cache-api.service";
+import { TunnelService } from "../services/tunnel.service";
+import { TunnelFlightService } from "../services/tunnel-flight.service";
+
+import { provideCharts, withDefaultRegisterables } from "ng2-charts";
+
+import { JwtAuthInterceptor } from "../interceptor/jwt-auth.interceptor";
+import { ErrorInterceptor } from "../interceptor/error.interceptor";
+import { environment } from "../environments/environment";
+
+import { routes } from "./app.routes";
+
+import { provideTranslateService } from "@ngx-translate/core";
+import { provideTranslateHttpLoader } from "@ngx-translate/http-loader";
+
+// Déclaration de la fonction d'initialisation de la configuration
+export function initConfig(configService: ConfigurationHelper) {
+ return () => configService.load(environment.env);
+}
+
+export const appConfig: ApplicationConfig = {
+ providers: [
+ TunnelService,
+ TunnelFlightService,
+ ImageService,
+ AircraftService,
+ DropzoneService,
+ GearService,
+ JumpService,
+ JumpTypeService,
+ StatsService,
+ ServiceComm,
+ DateService,
+ RequestCache,
+ ConfigurationHelper,
+ DatePipe,
+ ServiceCacheApi,
+ provideAppInitializer(() => {
+ const initializerFn = initConfig(inject(ConfigurationHelper));
+ return initializerFn();
+ }),
+ provideHttpClient(withInterceptors([JwtAuthInterceptor, ErrorInterceptor])),
+ provideCharts(withDefaultRegisterables()),
+ provideZoneChangeDetection({ eventCoalescing: true }),
+ provideRouter(routes),
+ provideHttpClient(),
+ provideTranslateService({
+ loader: provideTranslateHttpLoader({
+ prefix: "/assets/i18n/",
+ suffix: ".json",
+ }),
+ fallbackLang: "en",
+ lang: "en",
+ }),
+ ],
+};
diff --git a/Front/skydivelogs-app/src/app/app.module.ts b/Front/skydivelogs-app/src/app/app.module.ts
deleted file mode 100644
index 9afb822..0000000
--- a/Front/skydivelogs-app/src/app/app.module.ts
+++ /dev/null
@@ -1,240 +0,0 @@
-import { BrowserModule } from "@angular/platform-browser";
-import { NgModule, inject, provideAppInitializer } from "@angular/core";
-import { RouterModule, Routes } from "@angular/router";
-import {
- HttpClient,
- HttpClientModule,
- HTTP_INTERCEPTORS,
-} from "@angular/common/http";
-import { DatePipe } from "@angular/common";
-import { TranslateLoader, TranslateModule } from "@ngx-translate/core";
-import { TranslateHttpLoader } from "@ngx-translate/http-loader";
-
-import { AppComponent } from "./app.component";
-import { environment } from "../environments/environment";
-
-import { SummaryComponent } from "./summary/summary.component";
-import { ListOfJumpsComponent } from "./list-of-jumps/list-of-jumps.component";
-import { ListOfDzsComponent } from "./list-of-dzs/list-of-dzs.component";
-import { NewJumpComponent } from "./new-jump/new-jump.component";
-import { ListOfAircraftsComponent } from "./list-of-aircrafts/list-of-aircrafts.component";
-import { ListOfJumpTypesComponent } from "./list-of-jump-types/list-of-jump-types.component";
-import { ListOfGearsComponent } from "./list-of-gears/list-of-gears.component";
-import { NewAircraftComponent } from "./new-aircraft/new-aircraft.component";
-import { NewGearComponent } from "./new-gear/new-gear.component";
-import { NewDropZoneComponent } from "./new-drop-zone/new-drop-zone.component";
-import { NewJumpTypeComponent } from "./new-jump-type/new-jump-type.component";
-import { DefaultComponent } from "./default/default.component";
-import { LoginComponent } from "./login/login.component";
-import { CreateUserComponent } from "./create-user/create-user.component";
-import { LoginUserComponent } from "./login-user/login-user.component";
-import { UserProfileComponent } from "./user-profile/user-profile.component";
-import { ListOfImagesComponent } from "./list-of-images/list-of-images.component";
-import { JumpInfosComponent } from "./jump-infos/jump-infos.component";
-import { NewTunnelFlightComponent } from "./new-tunnel-flight/new-tunnel-flight.component";
-import { ListOfTunnelFlightsComponent } from "./list-of-tunnel-flights/list-of-tunnel-flights.component";
-
-import { DateService } from "../services/date.service";
-import { AircraftService } from "../services/aircraft.service";
-import { DropzoneService } from "../services/dropzone.service";
-import { GearService } from "../services/gear.service";
-import { JumpService } from "../services/jump.service";
-import { JumpTypeService } from "../services/jump-type.service";
-import { StatsService } from "../services/stats.service";
-import { ServiceComm } from "../services/service-comm.service";
-import { RequestCache } from "../services/request-cache.service";
-import { AuthGuardService } from "../services/auth-guard.service";
-import { ImageService } from "../services/image.service";
-import { ConfigurationHelper } from "../services/configuration-helper";
-import { ServiceCacheApi } from "../services/service-cache-api.service";
-import { TunnelService } from "../services/tunnel.service";
-import { TunnelFlightService } from "../services/tunnel-flight.service";
-
-import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
-import { FormsModule, ReactiveFormsModule } from "@angular/forms";
-import { MatAutocompleteModule } from "@angular/material/autocomplete";
-import { MatButtonModule } from "@angular/material/button";
-import { MatCheckboxModule } from "@angular/material/checkbox";
-import { MatOptionModule, MatNativeDateModule } from "@angular/material/core";
-import { MatDatepickerModule } from "@angular/material/datepicker";
-import { MatFormFieldModule } from "@angular/material/form-field";
-import { MatIconModule } from "@angular/material/icon";
-import { MatInputModule } from "@angular/material/input";
-import { MatPaginatorModule } from "@angular/material/paginator";
-import { MatProgressSpinnerModule } from "@angular/material/progress-spinner";
-import { MatProgressBarModule } from "@angular/material/progress-bar";
-import { MatSelectModule } from "@angular/material/select";
-import { MatTableModule } from "@angular/material/table";
-import { MatTabsModule } from "@angular/material/tabs";
-import { MatDialogModule } from "@angular/material/dialog";
-import { MatCardModule } from "@angular/material/card";
-import { MatRadioModule } from "@angular/material/radio";
-import { MatSidenavModule } from "@angular/material/sidenav";
-import { MatListModule } from "@angular/material/list";
-import { MatToolbarModule } from "@angular/material/toolbar";
-import { NgChartsModule } from "ng2-charts";
-
-import { JwtAuthInterceptor } from "../interceptor/jwt-auth.interceptor";
-import { ErrorInterceptor } from "../interceptor/error.interceptor";
-
-const appRoutes: Routes = [
- {
- path: "",
- component: DefaultComponent,
- canActivate: [AuthGuardService],
- },
- {
- path: "summary",
- component: SummaryComponent,
- canActivate: [AuthGuardService],
- },
- {
- path: "jumps",
- component: ListOfJumpsComponent,
- canActivate: [AuthGuardService],
- },
- {
- path: "dzs",
- component: ListOfDzsComponent,
- canActivate: [AuthGuardService],
- },
- {
- path: "newjump",
- component: NewJumpComponent,
- canActivate: [AuthGuardService],
- },
- {
- path: "aircrafts",
- component: ListOfAircraftsComponent,
- canActivate: [AuthGuardService],
- },
- {
- path: "jumpTypes",
- component: ListOfJumpTypesComponent,
- canActivate: [AuthGuardService],
- },
- {
- path: "gears",
- component: ListOfGearsComponent,
- canActivate: [AuthGuardService],
- },
- {
- path: "user",
- component: UserProfileComponent,
- canActivate: [AuthGuardService],
- },
- {
- path: "newTunnelFlight",
- component: NewTunnelFlightComponent,
- canActivate: [AuthGuardService],
- },
- {
- path: "tunnelFlights",
- component: ListOfTunnelFlightsComponent,
- canActivate: [AuthGuardService],
- },
-
- { path: "login", component: LoginComponent },
-];
-
-// AOT compilation support
-export function httpTranslateLoader(http: HttpClient) {
- return new TranslateHttpLoader(http);
-}
-
-// Déclaration de la fonction d'initialisation de la configuration
-export function initConfig(configService: ConfigurationHelper) {
- return () => configService.load(environment.env);
-}
-
-@NgModule({
- declarations: [
- AppComponent,
- SummaryComponent,
- ListOfJumpsComponent,
- ListOfDzsComponent,
- NewJumpComponent,
- ListOfAircraftsComponent,
- ListOfJumpTypesComponent,
- ListOfGearsComponent,
- NewAircraftComponent,
- NewGearComponent,
- NewDropZoneComponent,
- NewJumpTypeComponent,
- DefaultComponent,
- LoginComponent,
- CreateUserComponent,
- LoginUserComponent,
- UserProfileComponent,
- ListOfImagesComponent,
- JumpInfosComponent,
- NewTunnelFlightComponent,
- ListOfTunnelFlightsComponent,
- ],
- imports: [
- RouterModule.forRoot(
- appRoutes,
- { enableTracing: !environment.production } // <-- debugging purposes only
- // { enableTracing: !environment.production, relativeLinkResolution: 'legacy' } // <-- debugging purposes only
- ),
- TranslateModule.forRoot({
- loader: {
- provide: TranslateLoader,
- useFactory: httpTranslateLoader,
- deps: [HttpClient],
- },
- }),
- ReactiveFormsModule,
- FormsModule,
- BrowserModule,
- BrowserAnimationsModule,
- MatPaginatorModule,
- MatTableModule,
- MatSelectModule,
- MatOptionModule,
- MatFormFieldModule,
- MatCheckboxModule,
- MatDatepickerModule,
- MatNativeDateModule,
- MatInputModule,
- MatButtonModule,
- MatIconModule,
- MatAutocompleteModule,
- MatProgressSpinnerModule,
- MatProgressBarModule,
- MatTabsModule,
- MatDialogModule,
- MatCardModule,
- MatRadioModule,
- MatSidenavModule,
- MatListModule,
- MatToolbarModule,
- NgChartsModule,
- ],
- exports: [HttpClientModule],
- providers: [
- TunnelService,
- TunnelFlightService,
- ImageService,
- AircraftService,
- DropzoneService,
- GearService,
- JumpService,
- JumpTypeService,
- StatsService,
- ServiceComm,
- DateService,
- RequestCache,
- ConfigurationHelper,
- DatePipe,
- ServiceCacheApi,
- provideAppInitializer(() => {
- const initializerFn = (initConfig)(inject(ConfigurationHelper));
- return initializerFn();
- }),
- { provide: HTTP_INTERCEPTORS, useClass: JwtAuthInterceptor, multi: true },
- { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true },
- ],
- bootstrap: [AppComponent],
-})
-export class AppModule {}
diff --git a/Front/skydivelogs-app/src/app/app.routes.ts b/Front/skydivelogs-app/src/app/app.routes.ts
new file mode 100644
index 0000000..cfcb433
--- /dev/null
+++ b/Front/skydivelogs-app/src/app/app.routes.ts
@@ -0,0 +1,93 @@
+import { Routes } from "@angular/router";
+
+import { AuthGuardService } from "../services/auth-guard.service";
+
+export const routes: Routes = [
+ {
+ path: "",
+ loadComponent: () =>
+ import("./default/default.component").then((m) => m.DefaultComponent),
+ canActivate: [AuthGuardService],
+ },
+ {
+ path: "summary",
+ loadComponent: () =>
+ import("./summary/summary.component").then((m) => m.SummaryComponent),
+ canActivate: [AuthGuardService],
+ },
+ {
+ path: "jumps",
+ loadComponent: () =>
+ import("./list-of-jumps/list-of-jumps.component").then(
+ (m) => m.ListOfJumpsComponent,
+ ),
+ canActivate: [AuthGuardService],
+ },
+ {
+ path: "dzs",
+ loadComponent: () =>
+ import("./list-of-dzs/list-of-dzs.component").then(
+ (m) => m.ListOfDzsComponent,
+ ),
+ canActivate: [AuthGuardService],
+ },
+ {
+ path: "newjump",
+ loadComponent: () =>
+ import("./new-jump/new-jump.component").then((m) => m.NewJumpComponent),
+ canActivate: [AuthGuardService],
+ },
+ {
+ path: "aircrafts",
+ loadComponent: () =>
+ import("./list-of-aircrafts/list-of-aircrafts.component").then(
+ (m) => m.ListOfAircraftsComponent,
+ ),
+ canActivate: [AuthGuardService],
+ },
+ {
+ path: "jumpTypes",
+ loadComponent: () =>
+ import("./list-of-jump-types/list-of-jump-types.component").then(
+ (m) => m.ListOfJumpTypesComponent,
+ ),
+ canActivate: [AuthGuardService],
+ },
+ {
+ path: "gears",
+ loadComponent: () =>
+ import("./list-of-gears/list-of-gears.component").then(
+ (m) => m.ListOfGearsComponent,
+ ),
+ canActivate: [AuthGuardService],
+ },
+ {
+ path: "user",
+ loadComponent: () =>
+ import("./user-profile/user-profile.component").then(
+ (m) => m.UserProfileComponent,
+ ),
+ canActivate: [AuthGuardService],
+ },
+ {
+ path: "newTunnelFlight",
+ loadComponent: () =>
+ import("./new-tunnel-flight/new-tunnel-flight.component").then(
+ (m) => m.NewTunnelFlightComponent,
+ ),
+ canActivate: [AuthGuardService],
+ },
+ {
+ path: "tunnelFlights",
+ loadComponent: () =>
+ import("./list-of-tunnel-flights/list-of-tunnel-flights.component").then(
+ (m) => m.ListOfTunnelFlightsComponent,
+ ),
+ canActivate: [AuthGuardService],
+ },
+ {
+ path: "login",
+ loadComponent: () =>
+ import("./login/login.component").then((m) => m.LoginComponent),
+ },
+];
diff --git a/Front/skydivelogs-app/src/app/create-user/create-user.component.html b/Front/skydivelogs-app/src/app/create-user/create-user.component.html
index 9628b7c..1ea23d3 100644
--- a/Front/skydivelogs-app/src/app/create-user/create-user.component.html
+++ b/Front/skydivelogs-app/src/app/create-user/create-user.component.html
@@ -1,72 +1,104 @@
-
diff --git a/Front/skydivelogs-app/src/app/create-user/create-user.component.ts b/Front/skydivelogs-app/src/app/create-user/create-user.component.ts
index cef19b9..90b5cf5 100644
--- a/Front/skydivelogs-app/src/app/create-user/create-user.component.ts
+++ b/Front/skydivelogs-app/src/app/create-user/create-user.component.ts
@@ -1,7 +1,20 @@
-import { Component, OnInit } from "@angular/core";
+import { Component, OnInit, ViewChild } from "@angular/core";
import { Router, ActivatedRoute } from "@angular/router";
-import { FormBuilder, FormGroup, Validators } from "@angular/forms";
-import { TranslateService } from "@ngx-translate/core";
+import {
+ FormBuilder,
+ FormGroup,
+ ReactiveFormsModule,
+ Validators,
+} from "@angular/forms";
+import {
+ TranslateModule,
+ TranslatePipe,
+ TranslateService,
+} from "@ngx-translate/core";
+import { CommonModule } from "@angular/common";
+import { MatFormFieldModule } from "@angular/material/form-field";
+import { MatInputModule } from "@angular/material/input";
+import { MatButtonModule } from "@angular/material/button";
import { first } from "rxjs/operators";
@@ -9,23 +22,33 @@ import { AuthenticationService } from "../../services/authentication.service";
import { User } from "../../models/user";
@Component({
- selector: "app-create-user",
- templateUrl: "./create-user.component.html",
- styleUrls: ["./create-user.component.css"],
- standalone: false
+ selector: "app-create-user",
+ templateUrl: "./create-user.component.html",
+ styleUrls: ["./create-user.component.css"],
+ imports: [
+ CommonModule,
+ MatFormFieldModule,
+ ReactiveFormsModule,
+ MatInputModule,
+ MatButtonModule,
+ TranslateModule,
+ TranslatePipe,
+ ],
})
export class CreateUserComponent implements OnInit {
- createForm: FormGroup;
- invalidForm = true;
- submitted = false;
- returnUrl: string;
- error = "";
+ public createForm: FormGroup;
+ public invalidForm = true;
+ public submitted = false;
+ public returnUrl: string;
+ public error: string = "";
- constructor(private formBuilder: FormBuilder,
- private route: ActivatedRoute,
- private router: Router,
- private authenticationService: AuthenticationService,
- private translateService: TranslateService) {
+ constructor(
+ private formBuilder: FormBuilder,
+ private route: ActivatedRoute,
+ private router: Router,
+ private authenticationService: AuthenticationService,
+ private translateService: TranslateService,
+ ) {
// redirect to home if already logged in
if (this.authenticationService.currentUserValue) {
this.router.navigate(["/"]);
@@ -35,16 +58,21 @@ export class CreateUserComponent implements OnInit {
ngOnInit() {
this.createForm = this.formBuilder.group(
{
+ firstname: ["", [Validators.required, Validators.minLength(3)]],
+ lastname: ["", [Validators.required, Validators.minLength(3)]],
+ email: ["", [Validators.required, Validators.email]],
username: ["", [Validators.required, Validators.minLength(3)]],
password: [
"",
- [Validators.required, Validators.pattern("^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[@$!%*#?&\-_|]).{8,}$")]
+ [
+ Validators.required,
+ Validators.pattern(
+ "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[@$!%*#?&-_|]).{8,}$",
+ ),
+ ],
],
- firstname: ["", [Validators.required, Validators.minLength(3)]],
- lastname: ["", [Validators.required, Validators.minLength(3)]],
- email: ["", [Validators.required, Validators.email]]
},
- { updateOn: "blur" }
+ { updateOn: "blur" },
);
// get return url from route parameters or default to '/'
@@ -58,30 +86,26 @@ export class CreateUserComponent implements OnInit {
onCreateSubmit() {
this.invalidForm = false;
this.submitted = true;
-
if (this.createForm.invalid) {
this.invalidForm = true;
return;
}
-
let createUser = new User();
- createUser.login = this.formCtrls.username.value;
- createUser.password = this.formCtrls.password.value;
- createUser.firstName = this.formCtrls.firstname.value;
- createUser.lastName = this.formCtrls.lastname.value;
- createUser.email = this.formCtrls.email.value;
- createUser.language = this.translateService.currentLang;
-
- this.authenticationService.create(createUser)
- .pipe(first())
- .subscribe(
- data => {
- this.router.navigate([this.returnUrl]);
- },
- error => {
- this.error = error;
- this.invalidForm = false;
- }
- );
+ createUser.login = this.formCtrls["username"].value;
+ createUser.password = this.formCtrls["password"].value;
+ createUser.firstName = this.formCtrls["firstname"].value;
+ createUser.lastName = this.formCtrls["lastname"].value;
+ createUser.email = this.formCtrls["email"].value;
+ createUser.language = this.translateService.getCurrentLang();
+ this.authenticationService
+ .create(createUser)
+ .pipe(first())
+ .subscribe({
+ complete: () => this.router.navigate([this.returnUrl]),
+ error: (error) => {
+ this.error = error.message;
+ this.invalidForm = false;
+ },
+ });
}
}
diff --git a/Front/skydivelogs-app/src/app/default/default.component.html b/Front/skydivelogs-app/src/app/default/default.component.html
index be75a6e..fb7fe86 100644
--- a/Front/skydivelogs-app/src/app/default/default.component.html
+++ b/Front/skydivelogs-app/src/app/default/default.component.html
@@ -1,23 +1,62 @@
-
-
- timeline
-
-
-
-
- add_circle
-
-
-
-
- list_alt
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
\ No newline at end of file
diff --git a/Front/skydivelogs-app/src/app/default/default.component.ts b/Front/skydivelogs-app/src/app/default/default.component.ts
index 7c8ff93..7a28d1b 100644
--- a/Front/skydivelogs-app/src/app/default/default.component.ts
+++ b/Front/skydivelogs-app/src/app/default/default.component.ts
@@ -1,6 +1,8 @@
import { Component, OnInit } from "@angular/core";
-import { TranslateService } from "@ngx-translate/core";
+import { RouterLink } from "@angular/router";
+import { TranslateModule, TranslateService } from "@ngx-translate/core";
import { Observable, forkJoin } from "rxjs";
+import { MatIconModule } from "@angular/material/icon";
import { AircraftService } from "../../services/aircraft.service";
import { AuthenticationService } from "../../services/authentication.service";
@@ -10,27 +12,31 @@ import { JumpTypeService } from "../../services/jump-type.service";
import { ServiceComm } from "../../services/service-comm.service";
@Component({
- selector: "app-default",
- templateUrl: "./default.component.html",
- styleUrls: ["./default.component.css"],
- standalone: false
+ selector: "app-default",
+ templateUrl: "./default.component.html",
+ styleUrls: ["./default.component.css"],
+ imports: [TranslateModule, MatIconModule, RouterLink],
})
export class DefaultComponent implements OnInit {
- constructor(private serviceComm: ServiceComm,
- private translateService: TranslateService,
- private authenticationService: AuthenticationService,
- private serviceApiAircraft : AircraftService,
- private serviceApiJumpType : JumpTypeService,
- private serviceApiDropzone : DropzoneService,
- private serviceApiGear : GearService) {}
+ constructor(
+ private serviceComm: ServiceComm,
+ private translateService: TranslateService,
+ private authenticationService: AuthenticationService,
+ private serviceApiAircraft: AircraftService,
+ private serviceApiJumpType: JumpTypeService,
+ private serviceApiDropzone: DropzoneService,
+ private serviceApiGear: GearService,
+ ) {}
ngOnInit() {
this.authenticationService.alwaysLogin();
- this.putToCacheRefDatas().subscribe(() => { console.log("Push to cache the referentiel datas"); });
+ this.putToCacheRefDatas().subscribe(() => {
+ console.log("Push to cache the referentiel datas");
+ });
this.updateTitle();
- this.serviceComm.forceTranslateTitle.subscribe((data)=> {
- if (data === true){
+ this.serviceComm.forceTranslateTitle.subscribe((data) => {
+ if (data === true) {
this.updateTitle();
}
});
@@ -46,8 +52,8 @@ export class DefaultComponent implements OnInit {
}
private updateTitle() {
- this.translateService.get("Default_Title").subscribe(
- data => { this.serviceComm.updatedComponentTitle(data); }
- );
+ this.translateService.get("Default_Title").subscribe((data) => {
+ this.serviceComm.updatedComponentTitle(data);
+ });
}
-}
\ No newline at end of file
+}
diff --git a/Front/skydivelogs-app/src/app/jump-infos/jump-infos.component.html b/Front/skydivelogs-app/src/app/jump-infos/jump-infos.component.html
index 2f1f54d..ba26a16 100644
--- a/Front/skydivelogs-app/src/app/jump-infos/jump-infos.component.html
+++ b/Front/skydivelogs-app/src/app/jump-infos/jump-infos.component.html
@@ -1,11 +1,34 @@
\ No newline at end of file
+
+
+
diff --git a/Front/skydivelogs-app/src/app/jump-infos/jump-infos.component.ts b/Front/skydivelogs-app/src/app/jump-infos/jump-infos.component.ts
index ee73f15..c995166 100644
--- a/Front/skydivelogs-app/src/app/jump-infos/jump-infos.component.ts
+++ b/Front/skydivelogs-app/src/app/jump-infos/jump-infos.component.ts
@@ -1,24 +1,43 @@
-import { Component, Inject, OnInit } from '@angular/core';
-import { MAT_DIALOG_DATA } from '@angular/material/dialog';
+import { Component, Inject, OnInit } from "@angular/core";
+import { CommonModule } from "@angular/common";
+import { MAT_DIALOG_DATA } from "@angular/material/dialog";
+import { TranslateModule } from "@ngx-translate/core";
+import { MatCheckboxModule } from "@angular/material/checkbox";
+import { MatFormFieldModule } from "@angular/material/form-field";
+import { FormsModule, ReactiveFormsModule } from "@angular/forms";
+import { MatInputModule } from "@angular/material/input";
+import { MatButtonModule } from "@angular/material/button";
-import { AddAction } from '../../models/add-action.enum';
-import { JumpResp } from '../../models/jump';
-import { JumpService } from '../../services/jump.service';
-import { ServiceComm } from '../../services/service-comm.service';
+import { AddAction } from "../../models/add-action.enum";
+import { JumpResp } from "../../models/jump";
+
+import { JumpService } from "../../services/jump.service";
+import { ServiceComm } from "../../services/service-comm.service";
@Component({
- selector: 'app-jump-infos',
- templateUrl: './jump-infos.component.html',
- styleUrls: ['./jump-infos.component.css'],
- standalone: false
+ selector: "app-jump-infos",
+ templateUrl: "./jump-infos.component.html",
+ styleUrls: ["./jump-infos.component.css"],
+ imports: [
+ TranslateModule,
+ CommonModule,
+ FormsModule,
+ MatCheckboxModule,
+ MatFormFieldModule,
+ ReactiveFormsModule,
+ MatInputModule,
+ MatButtonModule,
+ ],
})
export class JumpInfosComponent implements OnInit {
public editMode: boolean;
- public jump: JumpResp
+ public jump: JumpResp;
- constructor(@Inject(MAT_DIALOG_DATA) public data: any,
- private serviceJump: JumpService,
- private serviceComm: ServiceComm) {
+ constructor(
+ @Inject(MAT_DIALOG_DATA) public data: any,
+ private serviceJump: JumpService,
+ private serviceComm: ServiceComm
+ ) {
this.jump = new JumpResp(data.jump);
this.editMode = data.editMode;
}
@@ -26,12 +45,15 @@ export class JumpInfosComponent implements OnInit {
ngOnInit(): void {}
public updateJump() {
- this.serviceJump.updateJump(this.jump.id,
- this.jump.isSpecial,
- this.jump.withCutaway,
- this.jump.notes)
- .subscribe(() => {
- this.serviceComm.refreshData(AddAction.Jump);
- });
+ this.serviceJump
+ .updateJump(
+ this.jump.id,
+ this.jump.isSpecial,
+ this.jump.withCutaway,
+ this.jump.notes
+ )
+ .subscribe(() => {
+ this.serviceComm.refreshData(AddAction.Jump);
+ });
}
}
diff --git a/Front/skydivelogs-app/src/app/list-of-aircrafts/list-of-aircrafts.component.html b/Front/skydivelogs-app/src/app/list-of-aircrafts/list-of-aircrafts.component.html
index 80f7c19..b990242 100644
--- a/Front/skydivelogs-app/src/app/list-of-aircrafts/list-of-aircrafts.component.html
+++ b/Front/skydivelogs-app/src/app/list-of-aircrafts/list-of-aircrafts.component.html
@@ -1,25 +1,44 @@
-
-
+
+
- | {{ 'List_Aircrafts_Header_Id' | translate }} |
- {{element.id}} |
+
+ {{ "ListAircrafts_Header_Id" | translate }}
+ |
+ {{ element.id }} |
- {{ 'List_Aircrafts_Header_Name' | translate }} |
- {{element.name}} |
+
+ {{ "ListAircrafts_Header_Name" | translate }}
+ |
+ {{ element.name }} |
- {{ 'List_Aircrafts_Header_Image' | translate }} |
-  |
+
+ {{ "ListAircrafts_Header_Image" | translate }}
+ |
+
+
+ |
-
+
diff --git a/Front/skydivelogs-app/src/app/list-of-aircrafts/list-of-aircrafts.component.ts b/Front/skydivelogs-app/src/app/list-of-aircrafts/list-of-aircrafts.component.ts
index b791c91..a793ecd 100644
--- a/Front/skydivelogs-app/src/app/list-of-aircrafts/list-of-aircrafts.component.ts
+++ b/Front/skydivelogs-app/src/app/list-of-aircrafts/list-of-aircrafts.component.ts
@@ -1,56 +1,69 @@
-import { Component, OnInit, ViewChild } from '@angular/core';
-import { MatPaginator } from '@angular/material/paginator';
-import { MatTableDataSource } from '@angular/material/table';
-import { MatDialog } from '@angular/material/dialog';
-import { TranslateService } from '@ngx-translate/core';
+import { Component, OnInit, ViewChild } from "@angular/core";
+import { MatPaginator, MatPaginatorModule } from "@angular/material/paginator";
+import { MatTableDataSource, MatTableModule } from "@angular/material/table";
+import { MatDialog } from "@angular/material/dialog";
+import { TranslateModule, TranslateService } from "@ngx-translate/core";
+import { CommonModule } from "@angular/common";
+import { MatProgressSpinnerModule } from "@angular/material/progress-spinner";
+import { MatButtonModule } from "@angular/material/button";
-import { AircraftService } from '../../services/aircraft.service';
-import { ServiceComm } from '../../services/service-comm.service';
-import { AuthenticationService } from '../../services/authentication.service';
-import { NewAircraftComponent } from '../new-aircraft/new-aircraft.component';
-import { AddAction } from '../../models/add-action.enum';
-import { AircraftResp } from '../../models/aircraft';
+import { AircraftService } from "../../services/aircraft.service";
+import { ServiceComm } from "../../services/service-comm.service";
+import { AuthenticationService } from "../../services/authentication.service";
+import { NewAircraftComponent } from "../new-aircraft/new-aircraft.component";
+import { AddAction } from "../../models/add-action.enum";
+import { AircraftResp } from "../../models/aircraft";
@Component({
- selector: 'app-list-of-aircrafts',
- templateUrl: './list-of-aircrafts.component.html',
- styleUrls: ['./list-of-aircrafts.component.css'],
- standalone: false
+ selector: "app-list-of-aircrafts",
+ templateUrl: "./list-of-aircrafts.component.html",
+ styleUrls: ["./list-of-aircrafts.component.css"],
+ imports: [
+ TranslateModule,
+ CommonModule,
+ MatPaginatorModule,
+ MatProgressSpinnerModule,
+ MatTableModule,
+ MatButtonModule,
+ ],
})
export class ListOfAircraftsComponent implements OnInit {
- public displayedColumns: Array
= ['name', 'imageData'];
+ public displayedColumns: Array = ["name", "imageData"];
public dataSourceTable: MatTableDataSource;
public resultsLength = 0;
public isUserAdmin: boolean;
@ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;
- constructor(private serviceApi: AircraftService,
- private serviceComm: ServiceComm,
- private authenticationService: AuthenticationService,
- public dialog: MatDialog,
- private translateService: TranslateService) {
- this.isUserAdmin = this.authenticationService.currentUserValue.roles === "admin";
+ constructor(
+ private serviceApi: AircraftService,
+ private serviceComm: ServiceComm,
+ private authenticationService: AuthenticationService,
+ public dialog: MatDialog,
+ private translateService: TranslateService
+ ) {
+ this.isUserAdmin =
+ this.authenticationService.currentUserValue.roles === "admin";
}
ngOnInit() {
- this.serviceComm.refreshRequest.subscribe(action => {
+ this.serviceComm.refreshRequest.subscribe((action) => {
if (action === AddAction.Aircraft) {
this.dialog.closeAll();
this.getListOfAircrafts();
}
});
- this.serviceComm.forceTranslateTitle.subscribe((data)=> {
- if (data === true){
+ this.serviceComm.forceTranslateTitle.subscribe((data) => {
+ if (data === true) {
this.updateTitle();
}
});
-
+
this.updateTitle();
this.getListOfAircrafts();
}
private getListOfAircrafts() {
- this.serviceApi.getListOfAircrafts().subscribe(data => {
+ this.serviceApi.getListOfAircrafts().subscribe((data) => {
setTimeout(() => {
data.sort((a, b) => a.name.localeCompare(b.name));
this.dataSourceTable = new MatTableDataSource(data);
@@ -65,8 +78,8 @@ export class ListOfAircraftsComponent implements OnInit {
}
private updateTitle() {
- this.translateService.get("ListAircrafts_Title").subscribe(
- data => { this.serviceComm.updatedComponentTitle(data); }
- );
+ this.translateService.get("ListAircrafts_Title").subscribe((data) => {
+ this.serviceComm.updatedComponentTitle(data);
+ });
}
}
diff --git a/Front/skydivelogs-app/src/app/list-of-dzs/list-of-dzs.component.html b/Front/skydivelogs-app/src/app/list-of-dzs/list-of-dzs.component.html
index d9ac87c..912a252 100644
--- a/Front/skydivelogs-app/src/app/list-of-dzs/list-of-dzs.component.html
+++ b/Front/skydivelogs-app/src/app/list-of-dzs/list-of-dzs.component.html
@@ -1,59 +1,113 @@
-
-
+
diff --git a/Front/skydivelogs-app/src/app/list-of-dzs/list-of-dzs.component.ts b/Front/skydivelogs-app/src/app/list-of-dzs/list-of-dzs.component.ts
index 1c9b165..117b8ce 100644
--- a/Front/skydivelogs-app/src/app/list-of-dzs/list-of-dzs.component.ts
+++ b/Front/skydivelogs-app/src/app/list-of-dzs/list-of-dzs.component.ts
@@ -1,40 +1,61 @@
-import { Component, OnInit, ViewChild } from '@angular/core';
-import { MatPaginator } from '@angular/material/paginator';
-import { MatTableDataSource } from '@angular/material/table';
-import { MatDialog } from '@angular/material/dialog';
-import { TranslateService } from '@ngx-translate/core';
+import { Component, OnInit, ViewChild } from "@angular/core";
+import { MatPaginator, MatPaginatorModule } from "@angular/material/paginator";
+import { MatTableDataSource, MatTableModule } from "@angular/material/table";
+import { MatDialog } from "@angular/material/dialog";
+import { TranslateModule, TranslateService } from "@ngx-translate/core";
+import { CommonModule } from "@angular/common";
+import { MatIconModule } from "@angular/material/icon";
+import { MatProgressSpinnerModule } from "@angular/material/progress-spinner";
+import { MatFormFieldModule } from "@angular/material/form-field";
+import { MatButtonModule } from "@angular/material/button";
+import { MatInputModule } from "@angular/material/input";
+import { ReactiveFormsModule } from "@angular/forms";
-import { AddAction } from '../../models/add-action.enum';
-import { DropZoneResp } from '../../models/dropzone';
-import { DropzoneService } from '../../services/dropzone.service';
-import { ServiceComm } from '../../services/service-comm.service';
-import { AuthenticationService } from '../../services/authentication.service';
-import { NewDropZoneComponent } from '../new-drop-zone/new-drop-zone.component';
+import { AddAction } from "../../models/add-action.enum";
+import { DropZoneResp } from "../../models/dropzone";
+import { DropzoneService } from "../../services/dropzone.service";
+import { ServiceComm } from "../../services/service-comm.service";
+import { AuthenticationService } from "../../services/authentication.service";
+import { NewDropZoneComponent } from "../new-drop-zone/new-drop-zone.component";
@Component({
- selector: 'app-list-of-dzs',
- templateUrl: './list-of-dzs.component.html',
- styleUrls: ['./list-of-dzs.component.css'],
- standalone: false
+ selector: "app-list-of-dzs",
+ templateUrl: "./list-of-dzs.component.html",
+ styleUrls: ["./list-of-dzs.component.css"],
+ imports: [
+ TranslateModule,
+ CommonModule,
+ MatIconModule,
+ MatPaginatorModule,
+ MatProgressSpinnerModule,
+ MatTableModule,
+ MatFormFieldModule,
+ ReactiveFormsModule,
+ MatInputModule,
+ MatButtonModule,
+ ],
})
export class ListOfDzsComponent implements OnInit {
public displayedColumns: Array
= [
- 'isfavorite',
- 'name',
- 'address',
- 'type',
+ "isfavorite",
+ "name",
+ "address",
+ "type",
];
public dataSourceTable: MatTableDataSource;
public isUserAdmin: boolean;
public resultsLength = 0;
@ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;
- constructor(private serviceApi: DropzoneService,
- private serviceComm: ServiceComm,
- private authenticationService: AuthenticationService,
- public dialog: MatDialog,
- private translateService: TranslateService) {
- this.isUserAdmin = this.authenticationService.currentUserValue.roles === "admin";
+ constructor(
+ private serviceApi: DropzoneService,
+ private serviceComm: ServiceComm,
+ private authenticationService: AuthenticationService,
+ public dialog: MatDialog,
+ private translateService: TranslateService
+ ) {
+ this.isUserAdmin =
+ this.authenticationService.currentUserValue.roles === "admin";
}
ngOnInit() {
@@ -44,32 +65,35 @@ export class ListOfDzsComponent implements OnInit {
this.getListOfDropZones();
}
});
- this.serviceComm.forceTranslateTitle.subscribe((data)=> {
- if (data === true){
+ this.serviceComm.forceTranslateTitle.subscribe((data) => {
+ if (data === true) {
this.updateTitle();
}
});
-
+
this.updateTitle();
this.getListOfDropZones();
}
private getListOfDropZones() {
- this.serviceApi.getListOfDropZones()
- .subscribe((data) => {
- setTimeout(() => {
- data.sort((a, b) => (b.isFavorite ? 1 : 0) - (a.isFavorite ? 1 : 0) || a.name.localeCompare(b.name));
- this.dataSourceTable = new MatTableDataSource(data);
- this.dataSourceTable.paginator = this.paginator;
- this.resultsLength = data.length;
- }, 500);
- });
+ this.serviceApi.getListOfDropZones().subscribe((data) => {
+ setTimeout(() => {
+ data.sort(
+ (a, b) =>
+ (b.isFavorite ? 1 : 0) - (a.isFavorite ? 1 : 0) ||
+ a.name.localeCompare(b.name)
+ );
+ this.dataSourceTable = new MatTableDataSource(data);
+ this.dataSourceTable.paginator = this.paginator;
+ this.resultsLength = data.length;
+ }, 500);
+ });
}
public setToFavorite(dropzone: DropZoneResp) {
dropzone.isFavorite = true;
this.serviceApi.setFavoriteDropZone(dropzone);
-
+
const data = this.dataSourceTable.data;
data.sort((a, b) => (b.isFavorite ? 1 : 0) - (a.isFavorite ? 1 : 0));
this.dataSourceTable = new MatTableDataSource(data);
@@ -88,8 +112,8 @@ export class ListOfDzsComponent implements OnInit {
openDialogToAdd() {
this.dialog.open(NewDropZoneComponent, {
- height: '400px',
- width: '600px',
+ height: "400px",
+ width: "600px",
});
}
@@ -99,8 +123,8 @@ export class ListOfDzsComponent implements OnInit {
}
private updateTitle() {
- this.translateService.get("ListDz_Title").subscribe(
- data => { this.serviceComm.updatedComponentTitle(data); }
- );
+ this.translateService.get("ListDz_Title").subscribe((data) => {
+ this.serviceComm.updatedComponentTitle(data);
+ });
}
}
diff --git a/Front/skydivelogs-app/src/app/list-of-gears/list-of-gears.component.html b/Front/skydivelogs-app/src/app/list-of-gears/list-of-gears.component.html
index 6ffcadc..9f60c58 100644
--- a/Front/skydivelogs-app/src/app/list-of-gears/list-of-gears.component.html
+++ b/Front/skydivelogs-app/src/app/list-of-gears/list-of-gears.component.html
@@ -1,45 +1,63 @@
-
-
+
+
- | {{ 'List_Gears_Header_Id' | translate }} |
- {{element.id}} |
+
+ {{ "ListGears_Header_Id" | translate }}
+ |
+ {{ element.id }} |
- {{ 'List_Gears_Header_Name' | translate }} |
- {{element.name}} |
+
+ {{ "ListGears_Header_Name" | translate }}
+ |
+ {{ element.name }} |
- {{ 'List_Gears_Header_Manufacturer' | translate }} |
- {{element.manufacturer}} |
+
+ {{ "ListGears_Header_Manufacturer" | translate }}
+ |
+ {{ element.manufacturer }} |
- {{ 'List_Gears_Header_CanopySize' | translate }} |
- {{element.minSize}} - {{element.maxSize}} |
+
+ {{ "ListGears_Header_CanopySize" | translate }}
+ |
+
+ {{ element.minSize }} - {{ element.maxSize }}
+ |
- {{ 'List_Gears_Header_Aad' | translate }} |
- {{element.aad}} |
+
+ {{ "ListGears_Header_Aad" | translate }}
+ |
+ {{ element.aad }} |
- {{ 'List_Gears_Header_Main' | translate }} |
- {{element.mainCanopy}} |
+
+ {{ "ListGears_Header_Main" | translate }}
+ |
+ {{ element.mainCanopy }} |
- {{ 'List_Gears_Header_Reserve' | translate }} |
- {{element.reserveCanopy}} |
+
+ {{ "ListGears_Header_Reserve" | translate }}
+ |
+ {{ element.reserveCanopy }} |
-
+
diff --git a/Front/skydivelogs-app/src/app/list-of-gears/list-of-gears.component.ts b/Front/skydivelogs-app/src/app/list-of-gears/list-of-gears.component.ts
index 053e9b6..0dd0353 100644
--- a/Front/skydivelogs-app/src/app/list-of-gears/list-of-gears.component.ts
+++ b/Front/skydivelogs-app/src/app/list-of-gears/list-of-gears.component.ts
@@ -1,8 +1,11 @@
import { Component, OnInit, ViewChild } from "@angular/core";
-import { MatPaginator } from "@angular/material/paginator";
-import { MatTableDataSource } from "@angular/material/table";
+import { MatPaginator, MatPaginatorModule } from "@angular/material/paginator";
+import { MatTableDataSource, MatTableModule } from "@angular/material/table";
import { MatDialog } from "@angular/material/dialog";
-import { TranslateService } from '@ngx-translate/core';
+import { TranslateModule, TranslateService } from "@ngx-translate/core";
+import { CommonModule } from "@angular/common";
+import { MatProgressSpinnerModule } from "@angular/material/progress-spinner";
+import { MatButtonModule } from "@angular/material/button";
import { GearService } from "../../services/gear.service";
import { ServiceComm } from "../../services/service-comm.service";
@@ -11,10 +14,17 @@ import { AddAction } from "../../models/add-action.enum";
import { NewGearComponent } from "../new-gear/new-gear.component";
@Component({
- selector: "app-list-of-gears",
- templateUrl: "./list-of-gears.component.html",
- styleUrls: ["./list-of-gears.component.css"],
- standalone: false
+ selector: "app-list-of-gears",
+ templateUrl: "./list-of-gears.component.html",
+ styleUrls: ["./list-of-gears.component.css"],
+ imports: [
+ TranslateModule,
+ CommonModule,
+ MatPaginatorModule,
+ MatProgressSpinnerModule,
+ MatTableModule,
+ MatButtonModule,
+ ],
})
export class ListOfGearsComponent implements OnInit {
public displayedColumns: Array
= [
@@ -23,37 +33,38 @@ export class ListOfGearsComponent implements OnInit {
"maxSize",
"aad",
"mainCanopy",
- "reserveCanopy"
+ "reserveCanopy",
];
public dataSourceTable: MatTableDataSource;
public resultsLength = 0;
@ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;
- constructor(private serviceApi: GearService,
- private serviceComm: ServiceComm,
- public dialog: MatDialog,
- private translateService: TranslateService) {}
+ constructor(
+ private serviceApi: GearService,
+ private serviceComm: ServiceComm,
+ public dialog: MatDialog,
+ private translateService: TranslateService
+ ) {}
ngOnInit() {
- this.serviceComm.refreshRequest.subscribe(action => {
+ this.serviceComm.refreshRequest.subscribe((action) => {
if (action === AddAction.Gear) {
this.dialog.closeAll();
this.getListOfGears();
}
});
- this.serviceComm.forceTranslateTitle.subscribe((data)=> {
- if (data === true){
+ this.serviceComm.forceTranslateTitle.subscribe((data) => {
+ if (data === true) {
this.updateTitle();
}
});
-
+
this.updateTitle();
this.getListOfGears();
}
getListOfGears() {
- this.serviceApi.getListOfGears()
- .subscribe(data => {
+ this.serviceApi.getListOfGears().subscribe((data) => {
setTimeout(() => {
data.sort((a, b) => b.id - a.id);
this.dataSourceTable = new MatTableDataSource(data);
@@ -66,13 +77,13 @@ export class ListOfGearsComponent implements OnInit {
openDialogToAdd() {
this.dialog.open(NewGearComponent, {
height: "400px",
- width: "600px"
+ width: "600px",
});
}
private updateTitle() {
- this.translateService.get("ListGears_Title").subscribe(
- data => { this.serviceComm.updatedComponentTitle(data); }
- );
+ this.translateService.get("ListGears_Title").subscribe((data) => {
+ this.serviceComm.updatedComponentTitle(data);
+ });
}
}
diff --git a/Front/skydivelogs-app/src/app/list-of-images/list-of-images.component.html b/Front/skydivelogs-app/src/app/list-of-images/list-of-images.component.html
index d189843..2d5e7db 100644
--- a/Front/skydivelogs-app/src/app/list-of-images/list-of-images.component.html
+++ b/Front/skydivelogs-app/src/app/list-of-images/list-of-images.component.html
@@ -1,8 +1,20 @@
-