From 137b2ab1fc236b447f3e083462cd04cc3eb75aca Mon Sep 17 00:00:00 2001 From: sandre Date: Tue, 20 Jan 2026 10:56:31 +0000 Subject: [PATCH] Update to Angular v19 and fixing (#3) Reviewed-on: https://home.git.sebastienandre.com/sandre/SkydiveLogs/pulls/3 Co-authored-by: sandre Co-committed-by: sandre --- Dockerfile | 2 +- Front/skydivelogs-app/angular.json | 148 +++--- Front/skydivelogs-app/package-lock.json | 443 ++++++++--------- Front/skydivelogs-app/package.json | 10 +- .../src/app/app.base.component.ts | 33 ++ .../skydivelogs-app/src/app/app.component.css | 6 +- .../src/app/app.component.html | 186 +++++-- .../skydivelogs-app/src/app/app.component.ts | 80 ++- Front/skydivelogs-app/src/app/app.config.ts | 73 +++ Front/skydivelogs-app/src/app/app.module.ts | 240 --------- Front/skydivelogs-app/src/app/app.routes.ts | 93 ++++ .../create-user/create-user.component.html | 108 ++-- .../app/create-user/create-user.component.ts | 108 ++-- .../src/app/default/default.component.html | 81 ++- .../src/app/default/default.component.ts | 44 +- .../app/jump-infos/jump-infos.component.html | 41 +- .../app/jump-infos/jump-infos.component.ts | 64 ++- .../list-of-aircrafts.component.html | 37 +- .../list-of-aircrafts.component.ts | 73 +-- .../list-of-dzs/list-of-dzs.component.html | 102 +++- .../app/list-of-dzs/list-of-dzs.component.ts | 110 ++-- .../list-of-gears.component.html | 52 +- .../list-of-gears/list-of-gears.component.ts | 55 +- .../list-of-images.component.html | 64 ++- .../list-of-images.component.ts | 129 +++-- .../list-of-jump-types.component.html | 25 +- .../list-of-jump-types.component.ts | 57 ++- .../list-of-jumps.component.html | 223 ++++++--- .../list-of-jumps/list-of-jumps.component.ts | 71 ++- .../list-of-tunnel-flights.component.html | 8 +- .../list-of-tunnel-flights.component.ts | 469 ++++++++++-------- .../app/login-user/login-user.component.html | 48 +- .../app/login-user/login-user.component.ts | 101 ++-- .../src/app/login/login.component.html | 28 +- .../src/app/login/login.component.ts | 34 +- .../new-aircraft/new-aircraft.component.ts | 91 +++- .../new-drop-zone/new-drop-zone.component.ts | 82 ++- .../src/app/new-gear/new-gear.component.ts | 85 +++- .../new-jump-type/new-jump-type.component.ts | 60 ++- .../src/app/new-jump/new-jump.component.html | 254 ++++++++-- .../src/app/new-jump/new-jump.component.ts | 243 +++++---- .../new-tunnel-flight.component.html | 133 ++++- .../new-tunnel-flight.component.ts | 154 +++--- .../src/app/summary/summary.component.html | 4 +- .../src/app/summary/summary.component.ts | 239 +++++---- .../user-profile/user-profile.component.html | 8 +- .../user-profile/user-profile.component.ts | 172 ++++--- .../src/assets/css/Material-Icons.css | 48 -- .../skydivelogs-app/src/assets/css/Roboto.css | 168 ------- .../src/assets/css/new-theme.scss | 193 +++---- .../src/assets/font/300/Cyrillic-ext.woff2 | Bin 14988 -> 0 bytes .../src/assets/font/300/Cyrillic.woff2 | Bin 9500 -> 0 bytes .../src/assets/font/300/Greek-ext.woff2 | Bin 1508 -> 0 bytes .../src/assets/font/300/Greek.woff2 | Bin 7120 -> 0 bytes .../src/assets/font/300/Latin-ext.woff2 | Bin 11812 -> 0 bytes .../src/assets/font/300/Latin.woff2 | Bin 15732 -> 0 bytes .../src/assets/font/300/Vietnamese.woff2 | Bin 5460 -> 0 bytes .../src/assets/font/400/Cyrillic-ext.woff2 | Bin 15344 -> 0 bytes .../src/assets/font/400/Cyrillic.woff2 | Bin 9688 -> 0 bytes .../src/assets/font/400/Greek-ext.woff2 | Bin 1516 -> 0 bytes .../src/assets/font/400/Greek.woff2 | Bin 7100 -> 0 bytes .../src/assets/font/400/Latin-ext.woff2 | Bin 11860 -> 0 bytes .../src/assets/font/400/Latin.woff2 | Bin 15688 -> 0 bytes .../src/assets/font/400/Vietnamese.woff2 | Bin 5540 -> 0 bytes .../src/assets/font/500/Cyrillic-ext.woff2 | Bin 15080 -> 0 bytes .../src/assets/font/500/Cyrillic.woff2 | Bin 9776 -> 0 bytes .../src/assets/font/500/Greek-ext.woff2 | Bin 1532 -> 0 bytes .../src/assets/font/500/Greek.woff2 | Bin 7000 -> 0 bytes .../src/assets/font/500/Latin-ext.woff2 | Bin 11768 -> 0 bytes .../src/assets/font/500/Latin.woff2 | Bin 15920 -> 0 bytes .../src/assets/font/500/Vietnamese.woff2 | Bin 5580 -> 0 bytes Front/skydivelogs-app/src/assets/i18n/en.json | 63 +-- Front/skydivelogs-app/src/assets/i18n/fr.json | 65 +-- .../src/assets/icon/account.svg | 1 + Front/skydivelogs-app/src/assets/icon/add.svg | 1 + .../src/assets/icon/aircraft.svg | 1 + .../src/assets/icon/celebration.svg | 1 + .../skydivelogs-app/src/assets/icon/close.svg | 1 + .../src/assets/icon/delete.svg | 1 + Front/skydivelogs-app/src/assets/icon/dz.svg | 1 + .../skydivelogs-app/src/assets/icon/edit.svg | 1 + Front/skydivelogs-app/src/assets/icon/fan.svg | 1 + .../src/assets/icon/favorite.svg | 1 + .../src/assets/icon/file_upload.svg | 1 + .../src/assets/icon/flight_land.svg | 1 + .../skydivelogs-app/src/assets/icon/gear.svg | 1 + .../skydivelogs-app/src/assets/icon/info.svg | 1 + .../skydivelogs-app/src/assets/icon/link.svg | 1 + .../skydivelogs-app/src/assets/icon/list.svg | 1 + .../src/assets/icon/logout.svg | 1 + .../skydivelogs-app/src/assets/icon/mail.svg | 1 + Front/skydivelogs-app/src/assets/icon/map.svg | 1 + .../skydivelogs-app/src/assets/icon/menu.svg | 1 + .../src/assets/icon/not_favorite.svg | 1 + .../skydivelogs-app/src/assets/icon/note.svg | 1 + .../skydivelogs-app/src/assets/icon/reset.svg | 1 + .../src/assets/icon/rotate.svg | 1 + .../src/assets/icon/summary.svg | 1 + .../skydivelogs-app/src/assets/icon/wind.svg | 1 + .../src/config/config.dev.json | 6 +- .../src/config/config.prod.json | 6 +- .../src/environments/environment.dev.ts | 10 + Front/skydivelogs-app/src/index.html | 47 +- .../src/interceptor/error.interceptor.ts | 74 ++- .../src/interceptor/jwt-auth.interceptor.ts | 36 +- Front/skydivelogs-app/src/main.ts | 14 +- .../src/services/base.service.ts | 37 +- .../src/services/configuration-helper.ts | 48 +- .../src/services/request-cache.service.ts | 14 +- .../src/services/service-cache-api.service.ts | 27 +- Front/skydivelogs-app/src/tsconfig.app.json | 12 - Front/skydivelogs-app/src/tsconfig.spec.json | 19 - Front/skydivelogs-app/src/typings.d.ts | 5 - Front/skydivelogs-app/tsconfig.app.json | 15 + Front/skydivelogs-app/tsconfig.json | 40 +- Front/skydivelogs-app/tsconfig.spec.json | 15 + doc.txt | 8 +- 117 files changed, 3496 insertions(+), 2471 deletions(-) create mode 100644 Front/skydivelogs-app/src/app/app.base.component.ts create mode 100644 Front/skydivelogs-app/src/app/app.config.ts delete mode 100644 Front/skydivelogs-app/src/app/app.module.ts create mode 100644 Front/skydivelogs-app/src/app/app.routes.ts delete mode 100644 Front/skydivelogs-app/src/assets/css/Material-Icons.css delete mode 100644 Front/skydivelogs-app/src/assets/css/Roboto.css delete mode 100644 Front/skydivelogs-app/src/assets/font/300/Cyrillic-ext.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/300/Cyrillic.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/300/Greek-ext.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/300/Greek.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/300/Latin-ext.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/300/Latin.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/300/Vietnamese.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/400/Cyrillic-ext.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/400/Cyrillic.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/400/Greek-ext.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/400/Greek.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/400/Latin-ext.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/400/Latin.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/400/Vietnamese.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/500/Cyrillic-ext.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/500/Cyrillic.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/500/Greek-ext.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/500/Greek.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/500/Latin-ext.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/500/Latin.woff2 delete mode 100644 Front/skydivelogs-app/src/assets/font/500/Vietnamese.woff2 create mode 100644 Front/skydivelogs-app/src/assets/icon/account.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/add.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/aircraft.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/celebration.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/close.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/delete.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/dz.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/edit.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/fan.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/favorite.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/file_upload.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/flight_land.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/gear.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/info.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/link.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/list.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/logout.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/mail.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/map.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/menu.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/not_favorite.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/note.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/reset.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/rotate.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/summary.svg create mode 100644 Front/skydivelogs-app/src/assets/icon/wind.svg create mode 100644 Front/skydivelogs-app/src/environments/environment.dev.ts delete mode 100644 Front/skydivelogs-app/src/tsconfig.app.json delete mode 100644 Front/skydivelogs-app/src/tsconfig.spec.json delete mode 100644 Front/skydivelogs-app/src/typings.d.ts create mode 100644 Front/skydivelogs-app/tsconfig.app.json create mode 100644 Front/skydivelogs-app/tsconfig.spec.json 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 + }}
-
{{ 'App_Footer' | translate }}{{ version }} - @Séb
+
+ {{ "App_Footer" | translate }}{{ version }} - @Séb +
-
\ 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 @@ -
+

- {{ 'LoginCreateUser_Firstname' | translate }} - - - {{ 'LoginCreateUser_FirstnameRequired' | translate }} + {{ "LoginCreateUser_Firstname" | translate }} + + + {{ "LoginCreateUser_FirstnameRequired" | translate }} - - {{ 'LoginCreateUser_FirstnamePattern' | translate }} + + {{ "LoginCreateUser_FirstnamePattern" | translate }}

- {{ 'LoginCreateUser_Lastname' | translate }} - - - {{ 'LoginCreateUser_LastnameRequired' | translate }} + {{ "LoginCreateUser_Lastname" | translate }} + + + {{ "LoginCreateUser_LastnameRequired" | translate }} - - {{ 'LoginCreateUser_LastnamePattern' | translate }} + + {{ "LoginCreateUser_LastnamePattern" | translate }}

- {{ 'LoginCreateUser_Email' | translate }} - - - {{ 'LoginCreateUser_EmailRequired' | translate }} + {{ "LoginCreateUser_Email" | translate }} + + + {{ "LoginCreateUser_EmailRequired" | translate }} - - {{ 'LoginCreateUser_EmailPattern' | translate }} + + {{ "LoginCreateUser_EmailPattern" | translate }}

- {{ 'LoginCreateUser_Username' | translate }} - - - {{ 'LoginCreateUser_UsernameRequired' | translate }} + {{ "LoginCreateUser_Username" | translate }} + + + {{ "LoginCreateUser_UsernameRequired" | translate }} - - {{ 'LoginCreateUser_UsernamePattern' | translate }} + + {{ "LoginCreateUser_UsernamePattern" | translate }}

- {{ 'LoginCreateUser_Password' | translate }} - - - {{ 'LoginCreateUser_PasswordRequired' | translate }} + {{ "LoginCreateUser_Password" | translate }} + + + {{ "LoginCreateUser_PasswordRequired" | translate }} - - {{ 'LoginCreateUser_PasswordPattern' | translate }} + + {{ "LoginCreateUser_PasswordPattern" | translate }}

-
{{error}}
+
{{ error }}
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 @@ - \ 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 @@
-

Gear : {{jump.gear.name}} ({{jump.gear.mainCanopy}})

-

Special jump

-

Cutaway

- - - +

+ Gear : {{ jump.gear.name }} ({{ jump.gear.mainCanopy }}) +

+

+ Special jump +

+

+ Cutaway +

+ + + -
- -
\ 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 }}No image + {{ "ListAircrafts_Header_Image" | translate }} + + No image +
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 @@
-
- +
+ - {{ 'List_Dz_Filter' | translate }} - + {{ "ListDz_Filter" | translate }} + - - + - - + + - + - + - - + + - +
- favorite - favorite_border - - link + + + + + - - map + + - - mail_outline + + {{ 'List_Dz_Header_ID' | translate }}{{element.id}} + {{ "ListDz_Header_ID" | translate }} + {{ element.id }} {{ 'List_Dz_Header_Name' | translate }} + {{ "ListDz_Header_Name" | translate }} + {{ 'List_Dz_Header_Address' | translate }} + {{ "ListDz_Header_Address" | translate }} + {{ 'List_Dz_Header_Type' | translate }}{{element.type}} + {{ "ListDz_Header_Type" | translate }} + {{ element.type }}
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 @@
-
+

- +

@@ -12,7 +24,7 @@

@@ -22,28 +34,54 @@
- - + + - - + - +
Comments{{element.comment}} + Comments + + {{ element.comment }} + Image - image + + Image + + image
-
+
× - undo +
- +
diff --git a/Front/skydivelogs-app/src/app/list-of-images/list-of-images.component.ts b/Front/skydivelogs-app/src/app/list-of-images/list-of-images.component.ts index 3478c43..bc99f85 100644 --- a/Front/skydivelogs-app/src/app/list-of-images/list-of-images.component.ts +++ b/Front/skydivelogs-app/src/app/list-of-images/list-of-images.component.ts @@ -1,30 +1,51 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; -import { FormGroup, FormControl, Validators } from '@angular/forms'; -import { MatTableDataSource } from '@angular/material/table'; -import { MatPaginator } from '@angular/material/paginator'; -import { trigger,state, style } from '@angular/animations'; +import { Component, OnInit, ViewChild } from "@angular/core"; +import { + FormGroup, + FormControl, + Validators, + ReactiveFormsModule, +} from "@angular/forms"; +import { MatTableDataSource, MatTableModule } from "@angular/material/table"; +import { MatPaginator, MatPaginatorModule } from "@angular/material/paginator"; +import { trigger, state, style } from "@angular/animations"; +import { CommonModule } from "@angular/common"; +import { MatIconModule } from "@angular/material/icon"; +import { MatFormFieldModule } from "@angular/material/form-field"; +import { TranslateModule } from "@ngx-translate/core"; +import { MatButtonModule } from "@angular/material/button"; +import { MatInputModule } from "@angular/material/input"; -import { ImageService } from '../../services/image.service'; -import { ServiceComm } from '../../services/service-comm.service'; -import { ImageResp } from '../../models/image'; -import { AddAction } from '../../models/add-action.enum'; +import { ImageService } from "../../services/image.service"; +import { ServiceComm } from "../../services/service-comm.service"; +import { ImageResp } from "../../models/image"; +import { AddAction } from "../../models/add-action.enum"; @Component({ - selector: 'app-list-of-images', - templateUrl: './list-of-images.component.html', - styleUrls: ['./list-of-images.component.css'], - animations: [ - trigger('rotatedState', [ - state('default', style({ transform: 'rotate(0)' })), - state('rot90', style({ transform: 'rotate(-90deg)' })), - state('rot180', style({ transform: 'rotate(-180deg)' })), - state('rot270', style({ transform: 'rotate(-270deg)' })), - ]) - ], - standalone: false + selector: "app-list-of-images", + templateUrl: "./list-of-images.component.html", + styleUrls: ["./list-of-images.component.css"], + animations: [ + trigger("rotatedState", [ + state("default", style({ transform: "rotate(0)" })), + state("rot90", style({ transform: "rotate(-90deg)" })), + state("rot180", style({ transform: "rotate(-180deg)" })), + state("rot270", style({ transform: "rotate(-270deg)" })), + ]), + ], + imports: [ + TranslateModule, + CommonModule, + MatIconModule, + MatPaginatorModule, + MatFormFieldModule, + ReactiveFormsModule, + MatTableModule, + MatButtonModule, + MatInputModule, + ], }) export class ListOfImagesComponent implements OnInit { - public displayedColumns: Array = ['comment', 'data']; + public displayedColumns: Array = ["comment", "data"]; public imgForm: FormGroup; public imageError: string; private selectedFile: string; @@ -32,13 +53,13 @@ export class ListOfImagesComponent implements OnInit { public showPopin: boolean; public dataSourceTable: MatTableDataSource; public resultsLength = 0; - public stateRotation: string = 'default'; + public stateRotation: string = "default"; @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; constructor( private serviceApi: ImageService, - private serviceComm: ServiceComm - ) { } + private serviceComm: ServiceComm, + ) {} ngOnInit(): void { this.serviceComm.refreshRequest.subscribe((action) => { @@ -49,33 +70,32 @@ export class ListOfImagesComponent implements OnInit { this.getListOfImages(); this.imgForm = new FormGroup({ - comment: new FormControl('', Validators.required), - image: new FormControl('', Validators.required), + comment: new FormControl("", Validators.required), + image: new FormControl("", Validators.required), }); } private getListOfImages() { - this.serviceApi.getListOfImages() - .subscribe((data) => { - setTimeout(() => { - this.dataSourceTable = new MatTableDataSource(data); - this.dataSourceTable.paginator = this.paginator; - this.resultsLength = data.length; - }, 500); - }); + this.serviceApi.getListOfImages().subscribe((data) => { + setTimeout(() => { + this.dataSourceTable = new MatTableDataSource(data); + this.dataSourceTable.paginator = this.paginator; + this.resultsLength = data.length; + }, 500); + }); } public onFileChanged(fileInput: any) { const file = fileInput.dataTransfer ? fileInput.dataTransfer.files[0] : fileInput.target.files[0]; - const allowed_types = ['image/png', 'image/jpeg']; + const allowed_types = ["image/png", "image/jpeg"]; const max_size = 20971520; if (!allowed_types.includes(file.type)) { - this.imageError = 'Only Images are allowed ( JPG | PNG )'; + this.imageError = "Only Images are allowed ( JPG | PNG )"; } else if (file.size > max_size) { - this.imageError = 'Maximum size allowed is ' + max_size / 1000 + 'Mb'; + this.imageError = "Maximum size allowed is " + max_size / 1000 + "Mb"; } else { const reader = new FileReader(); reader.onload = this.checkAndExtractDataToBase64.bind(this); @@ -90,16 +110,16 @@ export class ListOfImagesComponent implements OnInit { const image = new Image(); image.src = e.target.result; image.onload = (rs) => { - const img_height = rs.currentTarget['height']; - const img_width = rs.currentTarget['width']; + const img_height = rs.currentTarget["height"]; + const img_width = rs.currentTarget["width"]; if (img_height > max_height && img_width > max_width) { this.imageError = - 'Maximum dimentions allowed ' + max_height + '*' + max_width + 'px'; + "Maximum dimentions allowed " + max_height + "*" + max_width + "px"; } else { const imgBase64Path = e.target.result; this.selectedFile = imgBase64Path; - this.imageError = 'OK'; + this.imageError = "OK"; } }; } @@ -109,13 +129,14 @@ export class ListOfImagesComponent implements OnInit { return; } - this.serviceApi.addImage(formData.comment, this.selectedFile) - .subscribe( - () => { this.getListOfImages(); } - ); + this.serviceApi + .addImage(formData.comment, this.selectedFile) + .subscribe(() => { + this.getListOfImages(); + }); } - openModal(image: ImageResp){ + openModal(image: ImageResp) { this.popinImage = image.data; this.showPopin = true; } @@ -125,14 +146,14 @@ export class ListOfImagesComponent implements OnInit { } rotate() { - if (this.stateRotation === 'default') { - this.stateRotation = 'rot90'; - } else if (this.stateRotation === 'rot90') { - this.stateRotation = 'rot180'; - } else if (this.stateRotation === 'rot180') { - this.stateRotation = 'rot270'; + if (this.stateRotation === "default") { + this.stateRotation = "rot90"; + } else if (this.stateRotation === "rot90") { + this.stateRotation = "rot180"; + } else if (this.stateRotation === "rot180") { + this.stateRotation = "rot270"; } else { - this.stateRotation = 'default'; + this.stateRotation = "default"; } } } diff --git a/Front/skydivelogs-app/src/app/list-of-jump-types/list-of-jump-types.component.html b/Front/skydivelogs-app/src/app/list-of-jump-types/list-of-jump-types.component.html index a88b804..4c35577 100644 --- a/Front/skydivelogs-app/src/app/list-of-jump-types/list-of-jump-types.component.html +++ b/Front/skydivelogs-app/src/app/list-of-jump-types/list-of-jump-types.component.html @@ -1,20 +1,31 @@
-
- +
+ - - + + - - + + - +
{{ 'List_JumpType_Header_Id' | translate }}{{element.id}} + {{ "ListJumpType_Header_Id" | translate }} + {{ element.id }} {{ 'List_JumpType_Header_Name' | translate }}{{element.name}} + {{ "ListJumpType_Header_Name" | translate }} + {{ element.name }}
diff --git a/Front/skydivelogs-app/src/app/list-of-jump-types/list-of-jump-types.component.ts b/Front/skydivelogs-app/src/app/list-of-jump-types/list-of-jump-types.component.ts index ffc5802..2b8b565 100644 --- a/Front/skydivelogs-app/src/app/list-of-jump-types/list-of-jump-types.component.ts +++ b/Front/skydivelogs-app/src/app/list-of-jump-types/list-of-jump-types.component.ts @@ -1,21 +1,31 @@ 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 { AddAction } from "../../models/add-action.enum"; import { JumpTypeResp } from "../../models/jumpType"; import { JumpTypeService } from "../../services/jump-type.service"; import { ServiceComm } from "../../services/service-comm.service"; -import { AuthenticationService } from '../../services/authentication.service'; +import { AuthenticationService } from "../../services/authentication.service"; import { NewJumpTypeComponent } from "../new-jump-type/new-jump-type.component"; @Component({ - selector: "app-list-of-jump-types", - templateUrl: "./list-of-jump-types.component.html", - styleUrls: ["./list-of-jump-types.component.css"], - standalone: false + selector: "app-list-of-jump-types", + templateUrl: "./list-of-jump-types.component.html", + styleUrls: ["./list-of-jump-types.component.css"], + imports: [ + TranslateModule, + CommonModule, + MatPaginatorModule, + MatProgressSpinnerModule, + MatTableModule, + MatButtonModule, + ], }) export class ListOfJumpTypesComponent implements OnInit { public displayedColumns: Array = ["name"]; @@ -24,33 +34,36 @@ export class ListOfJumpTypesComponent implements OnInit { public resultsLength = 0; @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; - constructor(private serviceApi: JumpTypeService, - private serviceComm: ServiceComm, - private authenticationService: AuthenticationService, - public dialog: MatDialog, - private translateService: TranslateService) { - this.isUserAdmin = this.authenticationService.currentUserValue.roles === "admin"; + constructor( + private serviceApi: JumpTypeService, + 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.JumpType) { this.dialog.closeAll(); this.getListOfJumpTypes(); } }); - this.serviceComm.forceTranslateTitle.subscribe((data)=> { - if (data === true){ + this.serviceComm.forceTranslateTitle.subscribe((data) => { + if (data === true) { this.updateTitle(); } }); - + this.updateTitle(); this.getListOfJumpTypes(); } getListOfJumpTypes() { - this.serviceApi.getListOfJumpTypes().subscribe(data => { + this.serviceApi.getListOfJumpTypes().subscribe((data) => { setTimeout(() => { data.sort((a, b) => a.name.localeCompare(b.name)); this.dataSourceTable = new MatTableDataSource(data); @@ -65,8 +78,8 @@ export class ListOfJumpTypesComponent implements OnInit { } private updateTitle() { - this.translateService.get("ListJumpTypes_Title").subscribe( - data => { this.serviceComm.updatedComponentTitle(data); } - ); + this.translateService.get("ListJumpTypes_Title").subscribe((data) => { + this.serviceComm.updatedComponentTitle(data); + }); } } diff --git a/Front/skydivelogs-app/src/app/list-of-jumps/list-of-jumps.component.html b/Front/skydivelogs-app/src/app/list-of-jumps/list-of-jumps.component.html index b06a525..e1a81e4 100644 --- a/Front/skydivelogs-app/src/app/list-of-jumps/list-of-jumps.component.html +++ b/Front/skydivelogs-app/src/app/list-of-jumps/list-of-jumps.component.html @@ -1,82 +1,165 @@
-
- -
+
+ +
- + -
- - - - - +
+
- info - sticky_note_2 - celebration -
+ + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - -
+ + + + {{ 'List_Jump_Header_Num' | translate }} - - {{ paginator.length - ( (paginator.pageIndex * paginator.pageSize ) + i ) }} - + {{ "ListJump_Header_Num" | translate }} + + {{ + paginator.length - (paginator.pageIndex * paginator.pageSize + i) + }} + {{ 'List_Jump_Header_Date' | translate }} - - + {{ "ListJump_Header_Date" | translate }} + + + {{ 'List_Jump_Header_JumpType' | - translate }} - - + {{ "ListJump_Header_JumpType" | translate }} + + + {{ 'List_Jump_Header_Aircraft' | - translate }} - - + {{ "ListJump_Header_Aircraft" | translate }} + + + {{ 'List_Jump_Header_Dz' | translate }} - - + {{ "ListJump_Header_Dz" | translate }} + + + {{ 'List_Jump_Header_Id' | translate }}{{element.gear.name}} + {{ "ListJump_Header_Id" | translate }} + {{ element.gear.name }} - delete - edit - + + +
-
+ + + +
- -
\ No newline at end of file + +
diff --git a/Front/skydivelogs-app/src/app/list-of-jumps/list-of-jumps.component.ts b/Front/skydivelogs-app/src/app/list-of-jumps/list-of-jumps.component.ts index f30f173..15aafc9 100644 --- a/Front/skydivelogs-app/src/app/list-of-jumps/list-of-jumps.component.ts +++ b/Front/skydivelogs-app/src/app/list-of-jumps/list-of-jumps.component.ts @@ -1,8 +1,21 @@ import { Component, OnInit, ViewChild } from "@angular/core"; -import { MatPaginator, PageEvent } from "@angular/material/paginator"; -import { MatTableDataSource } from "@angular/material/table"; +import { RouterLink, RouterModule } from "@angular/router"; +import { + MatPaginator, + MatPaginatorModule, + PageEvent, +} 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 { MatIconModule } from "@angular/material/icon"; +import { MatProgressSpinnerModule } from "@angular/material/progress-spinner"; +import { MatProgressBarModule } from "@angular/material/progress-bar"; +import { MatButtonModule } from "@angular/material/button"; +import { MatInputModule } from "@angular/material/input"; +import { ReactiveFormsModule } from "@angular/forms"; +import { MatFormFieldModule } from "@angular/material/form-field"; import { AddAction } from "../../models/add-action.enum"; import { Jump } from "../../models/jump"; @@ -12,10 +25,24 @@ import { JumpInfosComponent } from "../jump-infos/jump-infos.component"; import { StatsService } from "../../services/stats.service"; @Component({ - selector: "app-list-of-jumps", - templateUrl: "./list-of-jumps.component.html", - styleUrls: ["./list-of-jumps.component.css"], - standalone: false + selector: "app-list-of-jumps", + templateUrl: "./list-of-jumps.component.html", + styleUrls: ["./list-of-jumps.component.css"], + imports: [ + TranslateModule, + CommonModule, + RouterLink, + RouterModule, + MatIconModule, + MatPaginatorModule, + MatProgressSpinnerModule, + MatProgressBarModule, + MatTableModule, + MatFormFieldModule, + ReactiveFormsModule, + MatInputModule, + MatButtonModule, + ], }) export class ListOfJumpsComponent implements OnInit { public displayedColumns: Array = [ @@ -31,11 +58,12 @@ export class ListOfJumpsComponent implements OnInit { @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; public isLoading: boolean = false; - constructor(private serviceApi: JumpService, - private serviceComm: ServiceComm, - public dialog: MatDialog, - private translateService: TranslateService, - private statsService: StatsService + constructor( + private serviceApi: JumpService, + private serviceComm: ServiceComm, + public dialog: MatDialog, + private translateService: TranslateService, + private statsService: StatsService ) {} ngAferViewInit(): void { @@ -62,15 +90,16 @@ export class ListOfJumpsComponent implements OnInit { getListOfJumps(pageSize: number = 20, pageIndex: number = 0) { this.isLoading = true; - this.serviceApi.getJumps(pageIndex * pageSize, pageIndex * pageSize + pageSize) - .subscribe((data) => { - this.dataSourceTable.data = data.rows; - setTimeout(() => { - this.paginator.length = data.count; - this.paginator.pageIndex = pageIndex; - this.isLoading = false; - }, 500); - }); + this.serviceApi + .getJumps(pageIndex * pageSize, pageIndex * pageSize + pageSize) + .subscribe((data) => { + this.dataSourceTable.data = data.rows; + setTimeout(() => { + this.paginator.length = data.count; + this.paginator.pageIndex = pageIndex; + this.isLoading = false; + }, 500); + }); } openDialog(item: Jump, editMode: boolean) { diff --git a/Front/skydivelogs-app/src/app/list-of-tunnel-flights/list-of-tunnel-flights.component.html b/Front/skydivelogs-app/src/app/list-of-tunnel-flights/list-of-tunnel-flights.component.html index 8d54f86..8e8b25d 100644 --- a/Front/skydivelogs-app/src/app/list-of-tunnel-flights/list-of-tunnel-flights.component.html +++ b/Front/skydivelogs-app/src/app/list-of-tunnel-flights/list-of-tunnel-flights.component.html @@ -38,11 +38,11 @@
+ @@ -111,7 +111,7 @@ @@ -124,8 +124,8 @@ aria-label="Delete this jump" style="cursor: pointer" (click)="delete(element)" - >delete + svgIcon="delete" + > diff --git a/Front/skydivelogs-app/src/app/list-of-tunnel-flights/list-of-tunnel-flights.component.ts b/Front/skydivelogs-app/src/app/list-of-tunnel-flights/list-of-tunnel-flights.component.ts index 033ed82..a2e820e 100644 --- a/Front/skydivelogs-app/src/app/list-of-tunnel-flights/list-of-tunnel-flights.component.ts +++ b/Front/skydivelogs-app/src/app/list-of-tunnel-flights/list-of-tunnel-flights.component.ts @@ -1,233 +1,278 @@ -import { Component, OnInit } from '@angular/core'; -import { formatDate } from '@angular/common'; -import { TranslateService } from '@ngx-translate/core'; -import { MatTableDataSource } from '@angular/material/table'; -import { ChartConfiguration, ChartData, ChartType } from 'chart.js'; -import { from, of, groupBy, mergeMap, reduce, map, Observable } from 'rxjs'; +import { Component, OnInit } from "@angular/core"; +import { RouterLink, RouterModule } from "@angular/router"; +import { formatDate } from "@angular/common"; +import { TranslateModule, TranslateService } from "@ngx-translate/core"; +import { MatTableDataSource, MatTableModule } from "@angular/material/table"; +import { CommonModule } from "@angular/common"; +import { MatIconModule } from "@angular/material/icon"; +import { MatListModule } from "@angular/material/list"; +import { MatProgressSpinnerModule } from "@angular/material/progress-spinner"; +import { MatRadioModule } from "@angular/material/radio"; +import { MatProgressBarModule } from "@angular/material/progress-bar"; +import { FormsModule } from "@angular/forms"; +import { MatButtonModule } from "@angular/material/button"; -import { ServiceComm } from '../../services/service-comm.service'; +import { ChartConfiguration, ChartData, ChartType } from "chart.js"; +import { from, groupBy, mergeMap, reduce, map } from "rxjs"; +import { BaseChartDirective } from "ng2-charts"; + +import { ServiceComm } from "../../services/service-comm.service"; import { TunnelFlightService } from "../../services/tunnel-flight.service"; -import { DateService } from '../../services/date.service'; -import { TunnelFlight, TunnelFlightByMonth } from '../../models/tunnel-flight'; +import { DateService } from "../../services/date.service"; +import { TunnelFlight, TunnelFlightByMonth } from "../../models/tunnel-flight"; @Component({ - selector: 'app-list-of-tunnel-flights', - templateUrl: './list-of-tunnel-flights.component.html', - styleUrls: ['./list-of-tunnel-flights.component.css'], - standalone: false + selector: "app-list-of-tunnel-flights", + templateUrl: "./list-of-tunnel-flights.component.html", + styleUrls: ["./list-of-tunnel-flights.component.css"], + imports: [ + TranslateModule, + BaseChartDirective, + CommonModule, + MatIconModule, + MatListModule, + MatProgressSpinnerModule, + RouterLink, + MatRadioModule, + MatProgressBarModule, + FormsModule, + RouterModule, + MatTableModule, + MatButtonModule, + ], }) export class ListOfTunnelFlightsComponent implements OnInit { - public barChartLegend = true; - public barChartPlugins = []; - public barChartData: ChartData<'bar'>; - public barChartOptions: ChartConfiguration['options']; - public barChartType: ChartType; - public isLoading: boolean = false; - public selectedPeriod: string; - public dataSourceTable: MatTableDataSource = new MatTableDataSource(); - public displayedColumns: Array = [ - "id", - "tunnel", - "jumpType", - "nbMinutes", - "notes", - "flightDate", - "actions" - ]; - public stats: Array<{id: String|Number, values: String|Number}> = []; + public barChartLegend = true; + public barChartData: ChartData<"bar">; + public barChartOptions: ChartConfiguration["options"]; + public barChartType: ChartType; + public isLoading: boolean = false; + public selectedPeriod: string; + public dataSourceTable: MatTableDataSource = + new MatTableDataSource(); + public displayedColumns: Array = [ + "id", + "tunnel", + "jumpType", + "nbMinutes", + "notes", + "flightDate", + "actions", + ]; + public stats: Array<{ id: String | Number; values: String | Number }> = []; - constructor(private serviceComm: ServiceComm, - private serviceTunnelFlight: TunnelFlightService, - private translateService: TranslateService, - private dateService: DateService) { } + constructor( + private serviceComm: ServiceComm, + private serviceTunnelFlight: TunnelFlightService, + private translateService: TranslateService, + private dateService: DateService + ) {} - ngOnInit() { - this.serviceComm.forceTranslateTitle.subscribe((data) => { - if (data === true) { - this.updateTitle(); - } - }); + ngOnInit() { + this.serviceComm.forceTranslateTitle.subscribe((data) => { + if (data === true) { this.updateTitle(); + } + }); + this.updateTitle(); - this.chartConfig(); - this.selectedPeriod = "currentYear" - this.getDataForGraph(); - } - - public onPeriodChange() { - this.getDataForGraph(); - if (this.dataSourceTable?.data.length > 0){ - this.getDataForTable(); - } + this.chartConfig(); + this.selectedPeriod = "currentYear"; + this.getDataForGraph(); + } + + public onPeriodChange() { + this.getDataForGraph(); + if (this.dataSourceTable?.data.length > 0) { + this.getDataForTable(); } + } - public onLoadTable() { - this.getDataForTable(); - } + public onLoadTable() { + this.getDataForTable(); + } - private chartConfig() { - this.barChartType = "bar"; - this.barChartOptions = { - responsive: true, - maintainAspectRatio: true, - plugins: { - legend: { - display: true - }, - tooltip: { - callbacks: { - footer: this.footer, - } - } - }, - interaction: { - intersect: false, - mode: 'nearest', - axis: 'x' - }, - scales: { - x: { - stacked: true - }, - y: { - stacked: true - } - } - }; - } - - private updateTitle() { - this.translateService.get("ListTunnelFlight_Title").subscribe( - data => { this.serviceComm.updatedComponentTitle(data); } - ); - } - - private getDataForTable(): void { - this.isLoading = true; - - // Get data to show in a table - let endDate = new Date(); - endDate.setHours(0, 0, 0, 0); - let beginDate = this.computeBeginDateByPeriod(this.selectedPeriod, endDate); - - this.serviceTunnelFlight.getTunnelFlights(beginDate, endDate) - .subscribe((data) => { - this.dataSourceTable.data = data; - this.isLoading = false; - }); - } - - private getDataForGraph(): void { - this.isLoading = true; - - // Get data to show in a table - let endDate = new Date(); - endDate.setHours(0, 0, 0, 0); - let beginDate = this.computeBeginDateByPeriod(this.selectedPeriod, endDate); - - this.serviceTunnelFlight.getTunnelFlightsByMonth(beginDate, endDate) - .subscribe((data) => { - const allMonths = this.getMontsBetweenDates(beginDate, endDate) - const cumulatedTime = this.getCumulatedTimeByTypeByMonth(data, allMonths); - this.computeTimeByType(data); - this.barChartData = { - labels: allMonths, - datasets: cumulatedTime - }; - - this.isLoading = false; - }); - } - - private computeTimeByType(stats: TunnelFlightByMonth[]) { - this.stats = []; - from(stats).pipe( - groupBy((type) => type.type, { element: (p) => p.nb }), - mergeMap((group$) => - group$.pipe(reduce((acc, cur) => [...acc, cur], [`${group$.key}`])) - ), - map((arr) => ({ id: arr[0], values: arr.slice(1).reduce((a, b) => Number(a) + Number(b), 0) })) - ) - .subscribe((p) => { - console.log(p); - this.stats.push(p); - }); - } - - private getMontsBetweenDates(beginDate: Date, endDate: Date): Array { - let results: Array = []; - let tmpBeginDate = new Date(beginDate.getTime()); - const tmpEndDate = new Date(endDate.getTime()); - - while (tmpBeginDate < tmpEndDate) { - results.push(formatDate(tmpBeginDate, "yy-MM", "en")); - tmpBeginDate.setMonth(tmpBeginDate.getMonth() + 1); - } - - return results; - } - - private getCumulatedTimeByTypeByMonth(stats: TunnelFlightByMonth[], allMonths: string[]): Array { - let tmpResults = new Map(); - - const disctintType = Array.from(new Set(stats.map((item) => item.type))); - disctintType.forEach(type => { - tmpResults.set(type, Array.from({length: allMonths.length}, (v, k) => 0)); - }); - - for (let i = 0; i < allMonths.length; i++) { - const month = allMonths[i]; - let filteredStats = stats.filter((d) => d.month == month); - - if (filteredStats.length > 0){ - filteredStats.forEach(fs => { - tmpResults.get(fs.type)[i] += fs.nb; - }); - } - } - - const results = Array.from(tmpResults, function (item) { - return { label: item[0], data: item[1] } - }); - - return results; - } - - private footer = (tooltipItems) => { - let sum = 0; - - tooltipItems.forEach(function (tooltipItem) { - sum += tooltipItem.parsed.y; - }); - - return 'Sum: ' + sum; + private chartConfig() { + this.barChartType = "bar"; + this.barChartOptions = { + responsive: true, + maintainAspectRatio: true, + plugins: { + legend: { + display: true, + }, + tooltip: { + callbacks: { + footer: this.footer, + }, + }, + }, + interaction: { + intersect: false, + mode: "nearest", + axis: "x", + }, + scales: { + x: { + stacked: true, + }, + y: { + stacked: true, + }, + }, }; + } - private computeBeginDateByPeriod(selectedPeriod: String, endDate: Date): Date { - let beginDate = new Date(); - - switch (selectedPeriod) { - case "currentYear": - beginDate = new Date(endDate.getFullYear(), 0, 1); - break; - case "12Months": - beginDate = this.dateService.addMonths(endDate, -12); - beginDate.setDate(1); - break; - case "all": - beginDate = this.dateService.addMonths(endDate, -120); - beginDate.setDate(1); - break; - } + private updateTitle() { + this.translateService.get("ListTunnelFlight_Title").subscribe((data) => { + this.serviceComm.updatedComponentTitle(data); + }); + } - return beginDate; - } + private getDataForTable(): void { + this.isLoading = true; - public delete(item: TunnelFlight) { - let data: Array = this.dataSourceTable.data; - data = data.filter((d) => d.id !== item.id); + // Get data to show in a table + let endDate = new Date(); + endDate.setHours(0, 0, 0, 0); + let beginDate = this.computeBeginDateByPeriod(this.selectedPeriod, endDate); + this.serviceTunnelFlight + .getTunnelFlights(beginDate, endDate) + .subscribe((data) => { this.dataSourceTable.data = data; - this.serviceTunnelFlight.deleteTunnelFlight(item); + this.isLoading = false; + }); + } + + private getDataForGraph(): void { + this.isLoading = true; + + // Get data to show in a table + let endDate = new Date(); + endDate.setHours(0, 0, 0, 0); + let beginDate = this.computeBeginDateByPeriod(this.selectedPeriod, endDate); + + this.serviceTunnelFlight + .getTunnelFlightsByMonth(beginDate, endDate) + .subscribe((data) => { + const allMonths = this.getMontsBetweenDates(beginDate, endDate); + const cumulatedTime = this.getCumulatedTimeByTypeByMonth( + data, + allMonths + ); + this.computeTimeByType(data); + this.barChartData = { + labels: allMonths, + datasets: cumulatedTime, + }; + + this.isLoading = false; + }); + } + + private computeTimeByType(stats: TunnelFlightByMonth[]) { + this.stats = []; + from(stats) + .pipe( + groupBy((type) => type.type, { element: (p) => p.nb }), + mergeMap((group$) => + group$.pipe(reduce((acc, cur) => [...acc, cur], [`${group$.key}`])) + ), + map((arr) => ({ + id: arr[0], + values: arr.slice(1).reduce((a, b) => Number(a) + Number(b), 0), + })) + ) + .subscribe((p) => { + console.log(p); + this.stats.push(p); + }); + } + + private getMontsBetweenDates(beginDate: Date, endDate: Date): Array { + let results: Array = []; + let tmpBeginDate = new Date(beginDate.getTime()); + const tmpEndDate = new Date(endDate.getTime()); + + while (tmpBeginDate < tmpEndDate) { + results.push(formatDate(tmpBeginDate, "yy-MM", "en")); + tmpBeginDate.setMonth(tmpBeginDate.getMonth() + 1); } + + return results; + } + + private getCumulatedTimeByTypeByMonth( + stats: TunnelFlightByMonth[], + allMonths: string[] + ): Array { + let tmpResults = new Map(); + + const disctintType = Array.from(new Set(stats.map((item) => item.type))); + disctintType.forEach((type) => { + tmpResults.set( + type, + Array.from({ length: allMonths.length }, (v, k) => 0) + ); + }); + + for (let i = 0; i < allMonths.length; i++) { + const month = allMonths[i]; + let filteredStats = stats.filter((d) => d.month == month); + + if (filteredStats.length > 0) { + filteredStats.forEach((fs) => { + tmpResults.get(fs.type)[i] += fs.nb; + }); + } + } + + const results = Array.from(tmpResults, function (item) { + return { label: item[0], data: item[1] }; + }); + + return results; + } + + private footer = (tooltipItems: any) => { + let sum = 0; + + tooltipItems.forEach(function (tooltipItem: any) { + sum += tooltipItem.parsed.y; + }); + + return "Sum: " + sum; + }; + + private computeBeginDateByPeriod( + selectedPeriod: String, + endDate: Date + ): Date { + let beginDate = new Date(); + + switch (selectedPeriod) { + case "currentYear": + beginDate = new Date(endDate.getFullYear(), 0, 1); + break; + case "12Months": + beginDate = this.dateService.addMonths(endDate, -12); + beginDate.setDate(1); + break; + case "all": + beginDate = this.dateService.addMonths(endDate, -120); + beginDate.setDate(1); + break; + } + + return beginDate; + } + + public delete(item: TunnelFlight) { + let data: Array = this.dataSourceTable.data; + data = data.filter((d) => d.id !== item.id); + + this.dataSourceTable.data = data; + this.serviceTunnelFlight.deleteTunnelFlight(item); + } } diff --git a/Front/skydivelogs-app/src/app/login-user/login-user.component.html b/Front/skydivelogs-app/src/app/login-user/login-user.component.html index 4e92fc6..885a037 100644 --- a/Front/skydivelogs-app/src/app/login-user/login-user.component.html +++ b/Front/skydivelogs-app/src/app/login-user/login-user.component.html @@ -1,36 +1,50 @@ - +

- {{ 'LoginUser_Username' | translate }} - - - {{ 'LoginUser_UsernameRequired' | translate }} + {{ "LoginUser_Username" | translate }} + + + {{ "LoginUser_UsernameRequired" | translate }} - + {{ 'LoginUser_UsernamePattern | translate }}

- {{ 'LoginUser_Password' | translate }} - - - {{ 'LoginUser_PasswordRequired' | translate }} + {{ "LoginUser_Password" | translate }} + + + {{ "LoginUser_PasswordRequired" | translate }} - - {{ 'LoginUser_PasswordPattern' | translate }} + + {{ "LoginUser_PasswordPattern" | translate }}

-
{{error}}
+
{{ error }}
diff --git a/Front/skydivelogs-app/src/app/login-user/login-user.component.ts b/Front/skydivelogs-app/src/app/login-user/login-user.component.ts index 171db28..38831a4 100644 --- a/Front/skydivelogs-app/src/app/login-user/login-user.component.ts +++ b/Front/skydivelogs-app/src/app/login-user/login-user.component.ts @@ -1,73 +1,88 @@ -import { Component, OnInit, ViewChild, AfterViewInit } from '@angular/core'; -import { Router, ActivatedRoute } from '@angular/router'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { MatInput } from '@angular/material/input'; +import { Component, OnInit, ViewChild, AfterViewInit } from "@angular/core"; +import { Router, ActivatedRoute } from "@angular/router"; +import { CommonModule } from "@angular/common"; +import { + FormBuilder, + FormGroup, + ReactiveFormsModule, + Validators, +} from "@angular/forms"; +import { TranslateModule, TranslatePipe } from "@ngx-translate/core"; +import { MatInput, MatInputModule } from "@angular/material/input"; +import { MatFormFieldModule } from "@angular/material/form-field"; +import { MatButtonModule } from "@angular/material/button"; -import { first } from 'rxjs/operators'; +import { first } from "rxjs/operators"; -import { AuthenticationService } from '../../services/authentication.service'; +import { AuthenticationService } from "../../services/authentication.service"; @Component({ - selector: 'app-login-user', - templateUrl: './login-user.component.html', - styleUrls: ['./login-user.component.css'], - standalone: false + selector: "app-login-user", + templateUrl: "./login-user.component.html", + styleUrls: ["./login-user.component.css"], + imports: [ + CommonModule, + MatFormFieldModule, + ReactiveFormsModule, + MatInputModule, + TranslateModule, + TranslatePipe, + MatButtonModule, + ], }) -export class LoginUserComponent implements OnInit, AfterViewInit { - loginForm: FormGroup; - loading = false; - submitted = false; - returnUrl: string; - error = ''; - @ViewChild('username') userNameInput: MatInput; +export class LoginUserComponent implements OnInit { + public loginForm: FormGroup; + public loading = false; + public submitted = false; + public returnUrl: string; + public error: string = ""; - constructor(private formBuilder: FormBuilder, - private route: ActivatedRoute, - private router: Router, - private authenticationService: AuthenticationService) { + constructor( + private formBuilder: FormBuilder, + private route: ActivatedRoute, + private router: Router, + private authenticationService: AuthenticationService + ) { if (this.authenticationService.currentUserValue) { - this.router.navigate(['/']); + this.router.navigate(["/"]); } } - ngAfterViewInit() { - this.userNameInput.focus(); - } - ngOnInit() { this.loginForm = this.formBuilder.group( { - username: ['', [Validators.required, Validators.minLength(3)]], - password: ['', [Validators.required]] + username: ["", [Validators.required, Validators.minLength(3)]], + password: ["", [Validators.required]], }, - { updateOn: 'submit' } + { updateOn: "submit" } ); // get return url from route parameters or default to '/' - this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/'; - + this.returnUrl = this.route.snapshot.queryParams["returnUrl"] || "/"; } get formCtrls() { return this.loginForm.controls; } - onLoginSubmit() { + public onLoginSubmit() { this.submitted = true; if (this.loginForm.valid) { this.loading = true; - this.authenticationService.login(this.formCtrls.username.value, this.formCtrls.password.value) - .pipe(first()) - .subscribe( - data => { - this.router.navigate([this.returnUrl]); - }, - error => { - this.error = error; - this.loading = false; - } - ); + this.authenticationService + .login( + this.formCtrls["username"].value, + this.formCtrls["password"].value + ) + .pipe(first()) + .subscribe({ + complete: () => this.router.navigate([this.returnUrl]), + error: (error) => { + this.error = error.message; + this.loading = false; + }, + }); } } } diff --git a/Front/skydivelogs-app/src/app/login/login.component.html b/Front/skydivelogs-app/src/app/login/login.component.html index b373540..f712a7a 100644 --- a/Front/skydivelogs-app/src/app/login/login.component.html +++ b/Front/skydivelogs-app/src/app/login/login.component.html @@ -1,18 +1,30 @@
- - - {{ 'Login_Title' | translate }} + + + {{ "Login_Title" | translate }} - + - + - + - + diff --git a/Front/skydivelogs-app/src/app/login/login.component.ts b/Front/skydivelogs-app/src/app/login/login.component.ts index 19093c6..5a57f3d 100644 --- a/Front/skydivelogs-app/src/app/login/login.component.ts +++ b/Front/skydivelogs-app/src/app/login/login.component.ts @@ -1,18 +1,38 @@ import { Component, OnInit } from "@angular/core"; -import { TranslateService } from "@ngx-translate/core"; +import { + TranslateModule, + TranslatePipe, + TranslateService, +} from "@ngx-translate/core"; +import { CommonModule } from "@angular/common"; +import { MatSelectModule } from "@angular/material/select"; +import { MatOptionModule } from "@angular/material/core"; +import { MatCardModule } from "@angular/material/card"; +import { MatTabsModule } from "@angular/material/tabs"; + +import { LoginUserComponent } from "../login-user/login-user.component"; +import { CreateUserComponent } from "../create-user/create-user.component"; @Component({ - selector: "app-login", - templateUrl: "./login.component.html", - styleUrls: ["./login.component.css"], - standalone: false + selector: "app-login", + templateUrl: "./login.component.html", + styleUrls: ["./login.component.css"], + imports: [ + TranslateModule, + CommonModule, + MatSelectModule, + MatOptionModule, + MatCardModule, + MatTabsModule, + LoginUserComponent, + CreateUserComponent, + TranslateModule, + ], }) export class LoginComponent implements OnInit { public selectedLanguageFlag: string; constructor(private translate: TranslateService) { - translate.addLangs(['en', 'fr']); - translate.setDefaultLang('en'); this.selectedLanguageFlag = "en"; } diff --git a/Front/skydivelogs-app/src/app/new-aircraft/new-aircraft.component.ts b/Front/skydivelogs-app/src/app/new-aircraft/new-aircraft.component.ts index 61c4b6e..63731de 100644 --- a/Front/skydivelogs-app/src/app/new-aircraft/new-aircraft.component.ts +++ b/Front/skydivelogs-app/src/app/new-aircraft/new-aircraft.component.ts @@ -1,52 +1,85 @@ -import { Component, OnInit } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; -import { AircraftService } from '../../services/aircraft.service'; -import { ServiceComm } from '../../services/service-comm.service'; -import { AddAction } from '../../models/add-action.enum'; +import { Component, OnInit } from "@angular/core"; +import { + FormControl, + FormGroup, + ReactiveFormsModule, + Validators, +} from "@angular/forms"; +import { TranslateModule, TranslateService } from "@ngx-translate/core"; +import { MatFormFieldModule } from "@angular/material/form-field"; +import { MatInputModule } from "@angular/material/input"; +import { MatButtonModule } from "@angular/material/button"; + +import { AddAction } from "../../models/add-action.enum"; + +import { AircraftService } from "../../services/aircraft.service"; +import { ServiceComm } from "../../services/service-comm.service"; @Component({ - selector: 'app-new-aircraft', - templateUrl: './new-aircraft.component.html', - styleUrls: ['./new-aircraft.component.css'], - standalone: false + selector: "app-new-aircraft", + templateUrl: "./new-aircraft.component.html", + styleUrls: ["./new-aircraft.component.css"], + imports: [ + TranslateModule, + MatFormFieldModule, + ReactiveFormsModule, + MatFormFieldModule, + ReactiveFormsModule, + MatInputModule, + MatButtonModule, + ], }) export class NewAircraftComponent implements OnInit { public addForm: FormGroup; public imageError: string; private selectedFile: string; - constructor(private serviceComm: ServiceComm, - private serviceApi: AircraftService) { + constructor( + private serviceComm: ServiceComm, + private serviceApi: AircraftService, + private translateService: TranslateService, + ) { this.addForm = new FormGroup( { - aircraftName: new FormControl('', Validators.required) + aircraftName: new FormControl("", Validators.required), }, - { updateOn: 'blur' } + { updateOn: "blur" }, ); } - ngOnInit() { } + ngOnInit() { + this.serviceComm.forceTranslateTitle.subscribe((data) => { + if (data === true) { + this.updateTitle(); + } + }); + + this.updateTitle(); + } onSubmit(formData) { if (formData.invalid) { return; } - this.serviceApi.addAircraft(formData.aircraftName, this.selectedFile) - .subscribe(() => { - this.serviceComm.refreshData(AddAction.Aircraft); - }); + this.serviceApi + .addAircraft(formData.aircraftName, this.selectedFile) + .subscribe(() => { + this.serviceComm.refreshData(AddAction.Aircraft); + }); } public onFileChanged(fileInput: any) { - const file = fileInput.dataTransfer ? fileInput.dataTransfer.files[0] : fileInput.target.files[0]; - const allowed_types = ['image/png', 'image/jpeg']; + const file = fileInput.dataTransfer + ? fileInput.dataTransfer.files[0] + : fileInput.target.files[0]; + const allowed_types = ["image/png", "image/jpeg"]; const max_size = 20971520; if (!allowed_types.includes(file.type)) { - this.imageError = 'Only Images are allowed ( JPG | PNG )'; + this.imageError = "Only Images are allowed ( JPG | PNG )"; } else if (file.size > max_size) { - this.imageError = 'Maximum size allowed is ' + max_size / 1000 + 'Mb'; + this.imageError = "Maximum size allowed is " + max_size / 1000 + "Mb"; } else { const reader = new FileReader(); reader.onload = this.checkAndExtractDataToBase64.bind(this); @@ -61,17 +94,23 @@ export class NewAircraftComponent implements OnInit { const image = new Image(); image.src = e.target.result; image.onload = (rs) => { - const img_height = rs.currentTarget['height']; - const img_width = rs.currentTarget['width']; + const img_height = rs.currentTarget["height"]; + const img_width = rs.currentTarget["width"]; if (img_height > max_height && img_width > max_width) { this.imageError = - 'Maximum dimentions allowed ' + max_height + '*' + max_width + 'px'; + "Maximum dimentions allowed " + max_height + "*" + max_width + "px"; } else { const imgBase64Path = e.target.result; this.selectedFile = imgBase64Path; - this.imageError = 'OK'; + this.imageError = "OK"; } }; } + + private updateTitle() { + this.translateService.get("NewAircraft_Title").subscribe((data) => { + this.serviceComm.updatedComponentTitle(data); + }); + } } diff --git a/Front/skydivelogs-app/src/app/new-drop-zone/new-drop-zone.component.ts b/Front/skydivelogs-app/src/app/new-drop-zone/new-drop-zone.component.ts index 71eb6e4..e519f5b 100644 --- a/Front/skydivelogs-app/src/app/new-drop-zone/new-drop-zone.component.ts +++ b/Front/skydivelogs-app/src/app/new-drop-zone/new-drop-zone.component.ts @@ -1,43 +1,72 @@ import { Component, OnInit } from "@angular/core"; -import { FormControl, FormGroup, Validators } from "@angular/forms"; +import { + FormControl, + FormGroup, + ReactiveFormsModule, + Validators, +} from "@angular/forms"; +import { TranslateModule, TranslateService } from "@ngx-translate/core"; +import { MatFormFieldModule } from "@angular/material/form-field"; +import { MatCheckboxModule } from "@angular/material/checkbox"; +import { MatInputModule } from "@angular/material/input"; +import { MatButtonModule } from "@angular/material/button"; + import { AddAction } from "../../models/add-action.enum"; + import { ServiceComm } from "../../services/service-comm.service"; import { DropzoneService } from "../../services/dropzone.service"; @Component({ - selector: "app-new-drop-zone", - templateUrl: "./new-drop-zone.component.html", - styleUrls: ["./new-drop-zone.component.css"], - standalone: false + selector: "app-new-drop-zone", + templateUrl: "./new-drop-zone.component.html", + styleUrls: ["./new-drop-zone.component.css"], + imports: [ + TranslateModule, + MatFormFieldModule, + MatCheckboxModule, + ReactiveFormsModule, + MatFormFieldModule, + MatInputModule, + MatButtonModule, + ], }) export class NewDropZoneComponent implements OnInit { public addForm: FormGroup; constructor( private serviceComm: ServiceComm, - private dropzoneService: DropzoneService + private dropzoneService: DropzoneService, + private translateService: TranslateService, ) { this.addForm = new FormGroup( { dzName: new FormControl("", Validators.required), gps: new FormControl("x.x,y.y", [ Validators.required, - Validators.pattern("d+.d+,d+.d+") + Validators.pattern("d+.d+,d+.d+"), ]), address: new FormControl("", Validators.required), website: new FormControl("", Validators.required), contactMail: new FormControl("", [ Validators.required, - Validators.email + Validators.email, ]), isDz: new FormControl(true), - isTunnel: new FormControl(false) + isTunnel: new FormControl(false), }, - { updateOn: "blur" } + { updateOn: "blur" }, ); } - ngOnInit() {} + ngOnInit() { + this.serviceComm.forceTranslateTitle.subscribe((data) => { + if (data === true) { + this.updateTitle(); + } + }); + + this.updateTitle(); + } onSubmit(formData) { const splitGps: Array = formData.gps.split(","); @@ -50,16 +79,25 @@ export class NewDropZoneComponent implements OnInit { dzType.push("tunnel"); } - this.dropzoneService.addDropZone(splitGps[0], - splitGps[1], - formData.dzName, - formData.address, - formData.website, - formData.contactMail, - dzType, - false) - .subscribe(() => { - this.serviceComm.refreshData(AddAction.Dropzone); - }); + this.dropzoneService + .addDropZone( + splitGps[0], + splitGps[1], + formData.dzName, + formData.address, + formData.website, + formData.contactMail, + dzType, + false, + ) + .subscribe(() => { + this.serviceComm.refreshData(AddAction.Dropzone); + }); + } + + private updateTitle() { + this.translateService.get("NewDz_Title").subscribe((data) => { + this.serviceComm.updatedComponentTitle(data); + }); } } diff --git a/Front/skydivelogs-app/src/app/new-gear/new-gear.component.ts b/Front/skydivelogs-app/src/app/new-gear/new-gear.component.ts index 3e5e86e..0d26ca6 100644 --- a/Front/skydivelogs-app/src/app/new-gear/new-gear.component.ts +++ b/Front/skydivelogs-app/src/app/new-gear/new-gear.component.ts @@ -1,22 +1,40 @@ import { Component, OnInit } from "@angular/core"; -import { FormControl, FormGroup, Validators } from "@angular/forms"; +import { + FormControl, + FormGroup, + ReactiveFormsModule, + Validators, +} from "@angular/forms"; +import { MatFormFieldModule } from "@angular/material/form-field"; +import { TranslateModule, TranslateService } from "@ngx-translate/core"; +import { MatInputModule } from "@angular/material/input"; +import { MatButtonModule } from "@angular/material/button"; import { ServiceComm } from "../../services/service-comm.service"; import { GearService } from "../../services/gear.service"; import { AddAction } from "../../models/add-action.enum"; @Component({ - selector: "app-new-gear", - templateUrl: "./new-gear.component.html", - styleUrls: ["./new-gear.component.css"], - standalone: false + selector: "app-new-gear", + templateUrl: "./new-gear.component.html", + styleUrls: ["./new-gear.component.css"], + imports: [ + TranslateModule, + MatFormFieldModule, + ReactiveFormsModule, + ReactiveFormsModule, + MatInputModule, + MatButtonModule, + ], }) export class NewGearComponent implements OnInit { public addForm: FormGroup; - constructor(private serviceComm: ServiceComm, - private serviceApi: GearService) - { + constructor( + private serviceComm: ServiceComm, + private serviceApi: GearService, + private translateService: TranslateService, + ) { this.addForm = new FormGroup( { name: new FormControl("", Validators.required), @@ -24,41 +42,58 @@ export class NewGearComponent implements OnInit { minSize: new FormControl("", [ Validators.required, Validators.min(60), - Validators.max(320) + Validators.max(320), ]), maxSize: new FormControl("", [ Validators.required, Validators.min(60), - Validators.max(320) + Validators.max(320), ]), aad: new FormControl("", Validators.required), mainCanopy: new FormControl("", [ Validators.required, Validators.min(60), - Validators.max(320) + Validators.max(320), ]), reserveCanopy: new FormControl("", [ Validators.required, Validators.min(60), - Validators.max(320) - ]) + Validators.max(320), + ]), }, - { updateOn: "blur" } + { updateOn: "blur" }, ); } - ngOnInit() { } + ngOnInit() { + this.serviceComm.forceTranslateTitle.subscribe((data) => { + if (data === true) { + this.updateTitle(); + } + }); + + this.updateTitle(); + } onSubmit(formData) { - this.serviceApi.addGear(formData.name, - formData.manufacturer, - +formData.minSize, - +formData.maxSize, - formData.aad, - formData.mainCanopy, - formData.reserveCanopy) - .subscribe(() => { - this.serviceComm.refreshData(AddAction.Gear); - }); + this.serviceApi + .addGear( + formData.name, + formData.manufacturer, + +formData.minSize, + +formData.maxSize, + formData.aad, + formData.mainCanopy, + formData.reserveCanopy, + ) + .subscribe(() => { + this.serviceComm.refreshData(AddAction.Gear); + }); + } + + private updateTitle() { + this.translateService.get("NewGear_Title").subscribe((data) => { + this.serviceComm.updatedComponentTitle(data); + }); } } diff --git a/Front/skydivelogs-app/src/app/new-jump-type/new-jump-type.component.ts b/Front/skydivelogs-app/src/app/new-jump-type/new-jump-type.component.ts index c9fb29e..86f3c2c 100644 --- a/Front/skydivelogs-app/src/app/new-jump-type/new-jump-type.component.ts +++ b/Front/skydivelogs-app/src/app/new-jump-type/new-jump-type.component.ts @@ -1,34 +1,66 @@ import { Component, OnInit } from "@angular/core"; -import { FormControl, FormGroup, Validators } from "@angular/forms"; +import { + FormControl, + FormGroup, + ReactiveFormsModule, + Validators, +} from "@angular/forms"; +import { TranslateModule, TranslateService } from "@ngx-translate/core"; +import { MatFormFieldModule } from "@angular/material/form-field"; +import { MatInputModule } from "@angular/material/input"; +import { MatButtonModule } from "@angular/material/button"; + import { AddAction } from "../../models/add-action.enum"; import { ServiceComm } from "../../services/service-comm.service"; import { JumpTypeService } from "../../services/jump-type.service"; @Component({ - selector: "app-new-jump-type", - templateUrl: "./new-jump-type.component.html", - styleUrls: ["./new-jump-type.component.css"], - standalone: false + selector: "app-new-jump-type", + templateUrl: "./new-jump-type.component.html", + styleUrls: ["./new-jump-type.component.css"], + imports: [ + TranslateModule, + MatFormFieldModule, + ReactiveFormsModule, + MatInputModule, + MatButtonModule, + ], }) export class NewJumpTypeComponent implements OnInit { public addForm: FormGroup; - constructor(private serviceComm: ServiceComm, - private jumpTypeService: JumpTypeService) { + constructor( + private serviceComm: ServiceComm, + private jumpTypeService: JumpTypeService, + private translateService: TranslateService, + ) { this.addForm = new FormGroup( { - jumptypeName: new FormControl("", Validators.required) + jumptypeName: new FormControl("", Validators.required), }, - { updateOn: "blur" } + { updateOn: "blur" }, ); } - ngOnInit() { } + ngOnInit() { + this.serviceComm.forceTranslateTitle.subscribe((data) => { + if (data === true) { + this.updateTitle(); + } + }); + + this.updateTitle(); + } onSubmit(formData) { - this.jumpTypeService.addJumpType(formData.jumptypeName) - .subscribe(() => { - this.serviceComm.refreshData(AddAction.JumpType); - }); + this.jumpTypeService.addJumpType(formData.jumptypeName).subscribe(() => { + this.serviceComm.refreshData(AddAction.JumpType); + }); + } + + private updateTitle() { + this.translateService.get("NewJumpType_Title").subscribe((data) => { + this.serviceComm.updatedComponentTitle(data); + }); } } diff --git a/Front/skydivelogs-app/src/app/new-jump/new-jump.component.html b/Front/skydivelogs-app/src/app/new-jump/new-jump.component.html index 680d2bf..7b640e5 100644 --- a/Front/skydivelogs-app/src/app/new-jump/new-jump.component.html +++ b/Front/skydivelogs-app/src/app/new-jump/new-jump.component.html @@ -1,119 +1,267 @@
- -

{{ 'NewJump_ResetForm' | translate }}

+ +

+ {{ + "NewJump_ResetForm" | translate + }} +

- -
+ + - {{ 'NewJump_ChooseJumpType' | translate }} - - + {{ "NewJump_ChooseJumpType" | translate }} + + - {{jumpType.name}} + {{ jumpType.name }} - - {{ 'NewJump_ChooseAircraft' | translate }} - - + {{ "NewJump_ChooseAircraft" | translate }} + + - {{aircraft.name}} + {{ aircraft.name }} - - {{ 'NewJump_ChooseDz' | translate }} - - - - {{dropZone.name}} - - favorite + {{ "NewJump_ChooseDz" | translate }} + + + + {{ dropZone.name }} + + favorite - - {{ 'NewJump_ChooseGear' | translate }} - - + {{ "NewJump_ChooseGear" | translate }} + + - {{gear.name}} ({{gear.mainCanopy}}) + {{ gear.name }} ({{ gear.mainCanopy }}) - - {{ 'NewJump_Cutaway' | translate }} - {{ 'NewJump_Special' | translate }} + {{ + "NewJump_Cutaway" | translate + }} + {{ + "NewJump_Special" | translate + }} - - + + - - + + - - - - - - - -
- +
diff --git a/Front/skydivelogs-app/src/app/new-jump/new-jump.component.ts b/Front/skydivelogs-app/src/app/new-jump/new-jump.component.ts index dafc885..3d487d1 100644 --- a/Front/skydivelogs-app/src/app/new-jump/new-jump.component.ts +++ b/Front/skydivelogs-app/src/app/new-jump/new-jump.component.ts @@ -1,7 +1,23 @@ import { Component, OnInit } from "@angular/core"; -import { formatDate } from '@angular/common'; -import { DateAdapter, MAT_DATE_FORMATS, NativeDateAdapter } from "@angular/material/core"; -import { TranslateService } from '@ngx-translate/core'; +import { RouterLink, RouterModule } from "@angular/router"; +import { formatDate } from "@angular/common"; +import { + DateAdapter, + MAT_DATE_FORMATS, + NativeDateAdapter, +} from "@angular/material/core"; +import { TranslateModule, TranslateService } from "@ngx-translate/core"; +import { CommonModule } from "@angular/common"; +import { MatIconModule } from "@angular/material/icon"; +import { MatOptionModule } from "@angular/material/core"; +import { MatFormFieldModule } from "@angular/material/form-field"; +import { MatCheckboxModule } from "@angular/material/checkbox"; +import { MatAutocompleteModule } from "@angular/material/autocomplete"; +import { MatDatepickerModule } from "@angular/material/datepicker"; +import { MatProgressSpinnerModule } from "@angular/material/progress-spinner"; +import { FormsModule, ReactiveFormsModule } from "@angular/forms"; +import { MatInputModule } from "@angular/material/input"; +import { MatButtonModule } from "@angular/material/button"; import { JumpTypeResp } from "../../models/jumpType"; import { AircraftResp } from "../../models/aircraft"; @@ -17,31 +33,47 @@ import { JumpTypeService } from "../../services/jump-type.service"; import { GearService } from "../../services/gear.service"; import { StatsService } from "../../services/stats.service"; - export const PICK_FORMATS = { - parse: { dateInput: 'yy MM dd' }, + parse: { dateInput: "yy MM dd" }, display: { - dateInput: 'yyyy-MM-dd', - monthYearLabel: 'yyyy MMM', - dateA11yLabel: 'yyyy MM dd', - monthYearA11yLabel: 'yyyy MMMM', - } + dateInput: "yyyy-MM-dd", + monthYearLabel: "yyyy MMM", + dateA11yLabel: "yyyy MM dd", + monthYearA11yLabel: "yyyy MMMM", + }, }; class PickDateAdapter extends NativeDateAdapter { - format(date: Date, displayFormat: Object): string { - return formatDate(date, displayFormat.toString(), "en"); + override format(date: Date, displayFormat: Object): string { + return formatDate(date, displayFormat.toString(), "en"); } } @Component({ - selector: "app-new-jump", - templateUrl: "./new-jump.component.html", - styleUrls: ["./new-jump.component.css"], - providers: [ - { provide: DateAdapter, useClass: PickDateAdapter }, - { provide: MAT_DATE_FORMATS, useValue: PICK_FORMATS } - ], - standalone: false + selector: "app-new-jump", + templateUrl: "./new-jump.component.html", + styleUrls: ["./new-jump.component.css"], + providers: [ + { provide: DateAdapter, useClass: PickDateAdapter }, + { provide: MAT_DATE_FORMATS, useValue: PICK_FORMATS }, + ], + imports: [ + TranslateModule, + CommonModule, + RouterLink, + FormsModule, + RouterModule, + MatIconModule, + MatOptionModule, + MatFormFieldModule, + MatCheckboxModule, + MatAutocompleteModule, + MatDatepickerModule, + MatProgressSpinnerModule, + MatFormFieldModule, + ReactiveFormsModule, + MatInputModule, + MatButtonModule, + ], }) export class NewJumpComponent implements OnInit { public beginDate: Date; @@ -66,26 +98,28 @@ export class NewJumpComponent implements OnInit { private listOfDropZone: Array; public maxDate: Date; - constructor(private serviceComm: ServiceComm, - private serviceJump: JumpService, - private serviceJumpType: JumpTypeService, - private serviceAircraft: AircraftService, - private serviceDropzone: DropzoneService, - private serviceGear: GearService, - private dateService: DateService, - private translateService: TranslateService, - private statsService : StatsService) {} + constructor( + private serviceComm: ServiceComm, + private serviceJump: JumpService, + private serviceJumpType: JumpTypeService, + private serviceAircraft: AircraftService, + private serviceDropzone: DropzoneService, + private serviceGear: GearService, + private dateService: DateService, + private translateService: TranslateService, + private statsService: StatsService + ) {} ngOnInit() { - this.serviceComm.forceTranslateTitle.subscribe((data)=> { - if (data === true){ + this.serviceComm.forceTranslateTitle.subscribe((data) => { + if (data === true) { this.updateTitle(); } }); this.updateTitle(); this.maxDate = this.dateService.addDays(new Date(), 1); - + this.pendingAddRequest = false; this.initForm(); this.getListOfJumpTypes(); @@ -94,87 +128,92 @@ export class NewJumpComponent implements OnInit { onFormSubmit() { this.pendingAddRequest = true; - this.serviceJump.addListOfJump(this.selectedJumpType.id, - this.selectedAircraft.id, - this.selectedDz.id, - this.selectedGear.id, - this.withCutaway === undefined ? false : this.withCutaway, - this.beginDate, - this.endDate, - this.exitAltitude, - this.deployAltitude, - this.countOfJumps, - this.comments, - this.isSpecial === undefined ? false : this.isSpecial) - .subscribe(() => { - this.statsService.resetStats(); - this.comments = undefined; - this.withCutaway = false; - this.isSpecial = false; + this.serviceJump + .addListOfJump( + this.selectedJumpType.id, + this.selectedAircraft.id, + this.selectedDz.id, + this.selectedGear.id, + this.withCutaway === undefined ? false : this.withCutaway, + this.beginDate, + this.endDate, + this.exitAltitude, + this.deployAltitude, + this.countOfJumps, + this.comments, + this.isSpecial === undefined ? false : this.isSpecial + ) + .subscribe(() => { + this.statsService.resetStats(); + this.comments = undefined; + this.withCutaway = false; + this.isSpecial = false; - if (this.resetForm === true) { - this.initForm(); - } - this.pendingAddRequest = false; - }); + if (this.resetForm === true) { + this.initForm(); + } + this.pendingAddRequest = false; + }); } public isValidatedForm(): boolean { - return (this.selectedDz !== undefined && - this.selectedDz.id !== undefined && - this.selectedGear !== undefined && - this.selectedGear.id !== undefined && - this.selectedAircraft !== undefined && - this.selectedAircraft.id !== undefined && - this.selectedJumpType !== undefined && - this.selectedJumpType.id !== undefined && - this.exitAltitude !== undefined && - typeof this.exitAltitude === "number" && - this.deployAltitude !== undefined && - typeof this.deployAltitude === "number" && - this.countOfJumps !== undefined && - typeof this.countOfJumps === "number"); + return ( + this.selectedDz !== undefined && + this.selectedDz.id !== undefined && + this.selectedGear !== undefined && + this.selectedGear.id !== undefined && + this.selectedAircraft !== undefined && + this.selectedAircraft.id !== undefined && + this.selectedJumpType !== undefined && + this.selectedJumpType.id !== undefined && + this.exitAltitude !== undefined && + typeof this.exitAltitude === "number" && + this.deployAltitude !== undefined && + typeof this.deployAltitude === "number" && + this.countOfJumps !== undefined && + typeof this.countOfJumps === "number" + ); } private getListOfJumpTypes() { - this.serviceJumpType.getListOfJumpTypes() - .subscribe((data) => { - data.sort((a, b) => a.name.localeCompare(b.name)); - this.listOfJumpType = data; - this.countDatasLoaded = 1; + this.serviceJumpType.getListOfJumpTypes().subscribe((data) => { + data.sort((a, b) => a.name.localeCompare(b.name)); + this.listOfJumpType = data; + this.countDatasLoaded = 1; - this.getListOfAircrafts(); - this.getListOfDropZones(); - this.getListOfGears(); - }); + this.getListOfAircrafts(); + this.getListOfDropZones(); + this.getListOfGears(); + }); } private getListOfAircrafts() { - this.serviceAircraft.getListOfAircrafts(true) - .subscribe((data) => { - data.sort((a, b) => a.name.localeCompare(b.name)); - this.listOfAircraft = data; - this.countDatasLoaded++; - }); + this.serviceAircraft.getListOfAircrafts(true).subscribe((data) => { + data.sort((a, b) => a.name.localeCompare(b.name)); + this.listOfAircraft = data; + this.countDatasLoaded++; + }); } private getListOfDropZones() { - this.serviceDropzone.getListOfDropZones(true) - .subscribe((data) => { - data.sort((a, b) => (b.isFavorite ? 1 : 0) - (a.isFavorite ? 1 : 0) || a.name.localeCompare(b.name)); - this.listOfDropZone = data; - this.listOfFilteredDropZone = data; - this.countDatasLoaded++; - }); + this.serviceDropzone.getListOfDropZones(true).subscribe((data) => { + data.sort( + (a, b) => + (b.isFavorite ? 1 : 0) - (a.isFavorite ? 1 : 0) || + a.name.localeCompare(b.name) + ); + this.listOfDropZone = data; + this.listOfFilteredDropZone = data; + this.countDatasLoaded++; + }); } private getListOfGears() { - this.serviceGear.getListOfGears() - .subscribe((data) => { - data.sort((a, b) => b.id - a.id); - this.listOfGear = data; - this.countDatasLoaded++; - }); + this.serviceGear.getListOfGears().subscribe((data) => { + data.sort((a, b) => b.id - a.id); + this.listOfGear = data; + this.countDatasLoaded++; + }); } private initForm() { @@ -212,8 +251,8 @@ export class NewJumpComponent implements OnInit { filterValue = event.toLowerCase(); this.listOfFilteredDropZone = this.listOfDropZone; - this.listOfFilteredDropZone = this.listOfFilteredDropZone.filter((option) => - option.name.toLowerCase().includes(filterValue) + this.listOfFilteredDropZone = this.listOfFilteredDropZone.filter( + (option) => option.name.toLowerCase().includes(filterValue) ); } } @@ -228,12 +267,12 @@ export class NewJumpComponent implements OnInit { public resetDz() { this.selectedDz = undefined; - this.onChangeDz(''); + this.onChangeDz(""); } private updateTitle() { - this.translateService.get("NewJump_Title").subscribe( - data => { this.serviceComm.updatedComponentTitle(data); } - ); + this.translateService.get("NewJump_Title").subscribe((data) => { + this.serviceComm.updatedComponentTitle(data); + }); } } diff --git a/Front/skydivelogs-app/src/app/new-tunnel-flight/new-tunnel-flight.component.html b/Front/skydivelogs-app/src/app/new-tunnel-flight/new-tunnel-flight.component.html index f17874c..86de9b0 100644 --- a/Front/skydivelogs-app/src/app/new-tunnel-flight/new-tunnel-flight.component.html +++ b/Front/skydivelogs-app/src/app/new-tunnel-flight/new-tunnel-flight.component.html @@ -1,66 +1,145 @@
- +
-
+ - {{ 'NewTunnelFlight_ChooseJumpType' | translate }} - - + {{ "NewTunnelFlight_ChooseJumpType" | translate }} + + - {{jumpType.name}} + {{ jumpType.name }} - - {{ 'NewTunnelFlight_ChooseTunnel' | translate }} - - - - {{tunnel.name}} + {{ "NewTunnelFlight_ChooseTunnel" | translate }} + + + + {{ tunnel.name }} - - {{ 'NewTunnelFlight_Date_Lbl' | translate }} - - + {{ "NewTunnelFlight_Date_Lbl" | translate }} + + - {{ 'NewTunnelFlight_Minutes_Lbl' | translate }} - - - {{ 'NewTunnelFlight_Comments_Lbl' | translate }} - -
- +
-
\ No newline at end of file +
diff --git a/Front/skydivelogs-app/src/app/new-tunnel-flight/new-tunnel-flight.component.ts b/Front/skydivelogs-app/src/app/new-tunnel-flight/new-tunnel-flight.component.ts index 466a291..7bf9e5c 100644 --- a/Front/skydivelogs-app/src/app/new-tunnel-flight/new-tunnel-flight.component.ts +++ b/Front/skydivelogs-app/src/app/new-tunnel-flight/new-tunnel-flight.component.ts @@ -1,41 +1,72 @@ import { Component, OnInit } from "@angular/core"; -import { formatDate } from '@angular/common'; -import { DateAdapter, MAT_DATE_FORMATS, NativeDateAdapter } from "@angular/material/core"; -import { TranslateService } from '@ngx-translate/core'; +import { RouterLink, RouterModule } from "@angular/router"; +import { formatDate } from "@angular/common"; +import { + DateAdapter, + MAT_DATE_FORMATS, + NativeDateAdapter, +} from "@angular/material/core"; +import { TranslateModule, TranslateService } from "@ngx-translate/core"; +import { CommonModule } from "@angular/common"; +import { MatIconModule } from "@angular/material/icon"; +import { MatOptionModule } from "@angular/material/core"; +import { MatAutocompleteModule } from "@angular/material/autocomplete"; +import { MatFormFieldModule } from "@angular/material/form-field"; +import { MatDatepickerModule } from "@angular/material/datepicker"; +import { MatProgressSpinnerModule } from "@angular/material/progress-spinner"; +import { FormsModule, ReactiveFormsModule } from "@angular/forms"; +import { MatInputModule } from "@angular/material/input"; +import { MatButtonModule } from "@angular/material/button"; import { TunnelResp } from "../../models/tunnel"; import { JumpTypeResp } from "../../models/jumpType"; -import { TunnelService } from '../../services/tunnel.service'; -import { ServiceComm } from '../../services/service-comm.service'; +import { TunnelService } from "../../services/tunnel.service"; +import { ServiceComm } from "../../services/service-comm.service"; import { TunnelFlightService } from "../../services/tunnel-flight.service"; import { JumpTypeService } from "../../services/jump-type.service"; import { DateService } from "../../services/date.service"; export const PICK_FORMATS = { - parse: { dateInput: 'yy MM dd' }, + parse: { dateInput: "yy MM dd" }, display: { - dateInput: 'yyyy-MM-dd', - monthYearLabel: 'yyyy MMM', - dateA11yLabel: 'yyyy MM dd', - monthYearA11yLabel: 'yyyy MMMM', - } + dateInput: "yyyy-MM-dd", + monthYearLabel: "yyyy MMM", + dateA11yLabel: "yyyy MM dd", + monthYearA11yLabel: "yyyy MMMM", + }, }; class PickDateAdapter extends NativeDateAdapter { - format(date: Date, displayFormat: Object): string { + override format(date: Date, displayFormat: Object): string { return formatDate(date, displayFormat.toString(), "en"); } } @Component({ - selector: 'app-new-tunnel-flight', - templateUrl: './new-tunnel-flight.component.html', - styleUrls: ['./new-tunnel-flight.component.css'], - providers: [ - { provide: DateAdapter, useClass: PickDateAdapter }, - { provide: MAT_DATE_FORMATS, useValue: PICK_FORMATS } - ], - standalone: false + selector: "app-new-tunnel-flight", + templateUrl: "./new-tunnel-flight.component.html", + styleUrls: ["./new-tunnel-flight.component.css"], + providers: [ + { provide: DateAdapter, useClass: PickDateAdapter }, + { provide: MAT_DATE_FORMATS, useValue: PICK_FORMATS }, + ], + imports: [ + TranslateModule, + CommonModule, + RouterModule, + RouterLink, + FormsModule, + MatFormFieldModule, + ReactiveFormsModule, + MatAutocompleteModule, + MatInputModule, + MatButtonModule, + MatIconModule, + MatFormFieldModule, + MatOptionModule, + MatDatepickerModule, + MatProgressSpinnerModule, + ], }) export class NewTunnelFlightComponent implements OnInit { public flightDate: Date; @@ -51,12 +82,14 @@ export class NewTunnelFlightComponent implements OnInit { public listOfJumpType: Array; public maxDate: Date; - constructor(private serviceComm: ServiceComm, - private serviceTunnel: TunnelService, - private serviceTunnelFlight: TunnelFlightService, - private serviceJumpType: JumpTypeService, - private translateService: TranslateService, - private dateService: DateService) { } + constructor( + private serviceComm: ServiceComm, + private serviceTunnel: TunnelService, + private serviceTunnelFlight: TunnelFlightService, + private serviceJumpType: JumpTypeService, + private translateService: TranslateService, + private dateService: DateService + ) {} ngOnInit() { this.serviceComm.forceTranslateTitle.subscribe((data) => { @@ -77,45 +110,48 @@ export class NewTunnelFlightComponent implements OnInit { public onFormSubmit() { this.pendingAddRequest = true; - this.serviceTunnelFlight.addFlight(this.selectedTunnel.id, - this.selectedJumpType.id, - this.flightDate, - this.minutesOfFlight, - this.comments) - .subscribe(() => { - this.comments = undefined; + this.serviceTunnelFlight + .addFlight( + this.selectedTunnel.id, + this.selectedJumpType.id, + this.flightDate, + this.minutesOfFlight, + this.comments + ) + .subscribe(() => { + this.comments = undefined; - if (this.resetForm === true) { - this.initForm(); - } - this.pendingAddRequest = false; - }); + if (this.resetForm === true) { + this.initForm(); + } + this.pendingAddRequest = false; + }); } public isValidatedForm(): boolean { - return (this.selectedTunnel !== undefined && - this.selectedTunnel.id !== undefined && - this.minutesOfFlight !== undefined && - typeof this.minutesOfFlight === "number"); + return ( + this.selectedTunnel !== undefined && + this.selectedTunnel.id !== undefined && + this.minutesOfFlight !== undefined && + typeof this.minutesOfFlight === "number" + ); } private getListOfTunnels() { - this.serviceTunnel.getListOfTunnels() - .subscribe((data) => { - data.sort((a, b) => a.name.localeCompare(b.name)); - this.listOfTunnel = data; - this.listOfFilteredTunnel = data; - this.countDatasLoaded++; - }); + this.serviceTunnel.getListOfTunnels().subscribe((data) => { + data.sort((a, b) => a.name.localeCompare(b.name)); + this.listOfTunnel = data; + this.listOfFilteredTunnel = data; + this.countDatasLoaded++; + }); } private getListOfJumpTypes() { - this.serviceJumpType.getListOfJumpTypesForTunnel() - .subscribe((data) => { - data.sort((a, b) => a.name.localeCompare(b.name)); - this.listOfJumpType = data; - this.countDatasLoaded++; - }); + this.serviceJumpType.getListOfJumpTypesForTunnel().subscribe((data) => { + data.sort((a, b) => a.name.localeCompare(b.name)); + this.listOfJumpType = data; + this.countDatasLoaded++; + }); } public notLoadingToDisplay(): boolean { @@ -123,9 +159,9 @@ export class NewTunnelFlightComponent implements OnInit { } private updateTitle() { - this.translateService.get("NewTunnelFlight_Title").subscribe( - data => { this.serviceComm.updatedComponentTitle(data); } - ); + this.translateService.get("NewTunnelFlight_Title").subscribe((data) => { + this.serviceComm.updatedComponentTitle(data); + }); } private initForm() { @@ -139,7 +175,7 @@ export class NewTunnelFlightComponent implements OnInit { public resetTunnel() { this.selectedTunnel = undefined; - this.onChangeTunnel(''); + this.onChangeTunnel(""); } public onChangeTunnel(event: any) { diff --git a/Front/skydivelogs-app/src/app/summary/summary.component.html b/Front/skydivelogs-app/src/app/summary/summary.component.html index 4fc6ceb..967a7fe 100644 --- a/Front/skydivelogs-app/src/app/summary/summary.component.html +++ b/Front/skydivelogs-app/src/app/summary/summary.component.html @@ -21,8 +21,8 @@ aria-label="Force the refresh of the stats" style="cursor: pointer" (click)="refreshStats()" - >cached + svgIcon="reset" + >
; @@ -39,7 +48,7 @@ export class SummaryComponent implements OnInit { ]; public barChartLegend = true; - public barChartPlugins = []; + public barChartPlugins: any = []; public barChartData: ChartData<"line">; public barChartOptions: ChartConfiguration["options"]; public barChartType: ChartType; @@ -53,7 +62,7 @@ export class SummaryComponent implements OnInit { constructor( private serviceApi: StatsService, private serviceComm: ServiceComm, - private translateService: TranslateService + private translateService: TranslateService, ) {} ngOnInit() { @@ -71,7 +80,7 @@ export class SummaryComponent implements OnInit { const datepipe: DatePipe = new DatePipe("en-US"); let formattedDate = datepipe.transform( data.lastJump.jumpDate, - "EEEE dd MMMM YYYY" + "EEEE dd MMMM YYYY", ); this.lastJump = formattedDate + " (" + data.lastJump.dropZone.name + ")"; }); @@ -81,7 +90,7 @@ export class SummaryComponent implements OnInit { this.dsJumpForLastMonthByDz = new MatTableDataSource(data.byDz); data.byJumpType.sort((a, b) => b.nb - a.nb); this.dsJumpForLastMonthByJumpType = new MatTableDataSource( - data.byJumpType + data.byJumpType, ); }); @@ -96,106 +105,28 @@ export class SummaryComponent implements OnInit { public onTabChanged(event: MatTabChangeEvent) { switch (event.index) { case 0: - this.serviceApi.getStatsOfLastMonth().subscribe((data) => { - data.byDz.sort((a, b) => b.nb - a.nb); - this.dsJumpForLastMonthByDz = new MatTableDataSource(data.byDz); - data.byJumpType.sort((a, b) => b.nb - a.nb); - this.dsJumpForLastMonthByJumpType = new MatTableDataSource( - data.byJumpType - ); - }); + this.statsLastMonth(); break; case 1: - this.serviceApi.getStatsOfLastYear().subscribe((data) => { - data.byDz.sort((a, b) => b.nb - a.nb); - this.dsJumpForLastYearByDz = new MatTableDataSource(data.byDz); - data.byJumpType.sort((a, b) => b.nb - a.nb); - this.dsJumpForLastYearByJumpType = new MatTableDataSource( - data.byJumpType - ); - }); + this.statsLastYear(); break; case 2: - this.serviceApi.getStatsByDz().subscribe((data) => { - data.sort((a, b) => b.nb - a.nb); - this.dsNbJumpByDz = new MatTableDataSource(data); - }); + this.statsByDz(); break; case 3: - this.serviceApi.getStatsByAircraft().subscribe((data) => { - data.sort((a, b) => b.nb - a.nb); - this.dsNbJumpByAircraft = new MatTableDataSource(data); - }); + this.statsByAircraft(); break; case 4: - this.serviceApi.getStatsByGear().subscribe((data) => { - data.sort((a, b) => b.nb - a.nb); - this.dsNbJumpByGear = new MatTableDataSource(data); - }); + this.statsByGear(); break; case 5: - this.serviceApi.getStatsByJumpType().subscribe((data) => { - data.sort((a, b) => b.nb - a.nb); - this.dsNbJumpByType = new MatTableDataSource(data); - }); + this.statsByJumpType(); break; case 6: - this.serviceApi.getStatsByYear().subscribe((data) => { - data.sort((a, b) => b.label.localeCompare(a.label)); - this.dsNbJumpByYear = new MatTableDataSource(data); - }); + this.statsByYear(); break; case 7: - this.serviceApi.getStatsByYearByJumpType().subscribe((data) => { - data.sort((a, b) => a.label.localeCompare(b.label)); - - let firstYear: number = Number(data[0].label); - const now = new Date(); - const currentYear = now.getFullYear(); - const nbYears = currentYear - firstYear; - let listOfYears = new Array(nbYears) - .fill(null) - .map(() => firstYear++); - - // Prepare the list of jump type with am empty array - let tmpResults = new Map(); - const listOfJumpType = [...new Set(data.map((obj) => obj.label2))]; - listOfJumpType.forEach((type) => { - tmpResults.set(type, new Array(nbYears).fill(NaN)); - }); - - for (let i = 0; i < listOfYears.length; i++) { - const year = listOfYears[i].toString(); - - let filteredStats = data.filter((d) => d.label == year); - - if (filteredStats.length > 0) { - filteredStats.forEach((fs) => { - tmpResults.get(fs.label2)[i] = fs.nb; - }); - } - } - - const results = []; - tmpResults.forEach((value, key) => { - const color = this.jumpTypeToColor.get(key); - let tmp = { - label: key, - data: value, - backgroundColor: color, - borderColor: color, - pointBackgroundColor: color, - fill: false, - pointRadius: 6, - }; - results.push(tmp); - }); - - this.barChartData = { - labels: listOfYears, - datasets: results, - }; - }); + this.statsByYearByJumpType(); break; } } @@ -216,7 +147,7 @@ export class SummaryComponent implements OnInit { display: true, }, colors: { - forceOverride: true, + forceOverride: false, }, }, interaction: { @@ -252,4 +183,122 @@ export class SummaryComponent implements OnInit { ["Wingsuit 3", "#9400D3"], ]); } + + // #region Private methods to get stats + private statsByYearByJumpType() { + this.serviceApi.getStatsByYearByJumpType().subscribe((data) => { + data.sort((a, b) => a.label.localeCompare(b.label)); + + let firstYear: number = Number(data[0].label); + const now = new Date(); + const currentYear = now.getFullYear(); + const nbYears = currentYear - firstYear; + let listOfYears = new Array(nbYears).fill(null).map(() => firstYear++); + + // Prepare the list of jump type with am empty array + let tmpResults = new Map(); + const listOfJumpType = [...new Set(data.map((obj) => obj.label2))]; + listOfJumpType.forEach((type) => { + tmpResults.set(type, new Array(nbYears).fill(NaN)); + }); + + for (let i = 0; i < listOfYears.length; i++) { + const year = listOfYears[i].toString(); + + let filteredStats = data.filter((d) => d.label == year); + + if (filteredStats.length > 0) { + filteredStats.forEach((fs) => { + tmpResults.get(fs.label2)[i] = fs.nb; + }); + } + } + + const results: { + label: string; + data: number[]; + backgroundColor: string; + borderColor: string; + pointBackgroundColor: string; + fill: boolean; + pointRadius: number; + }[] = []; + tmpResults.forEach((value, key) => { + const color = this.jumpTypeToColor.get(key); + let tmp = { + label: key, + data: value, + backgroundColor: color, + borderColor: color, + pointBackgroundColor: color, + fill: false, + pointRadius: 6, + }; + results.push(tmp); + }); + + this.barChartData = { + labels: listOfYears, + datasets: results, + }; + }); + } + + private statsByYear() { + this.serviceApi.getStatsByYear().subscribe((data) => { + data.sort((a, b) => b.label.localeCompare(a.label)); + this.dsNbJumpByYear = new MatTableDataSource(data); + }); + } + + private statsByJumpType() { + this.serviceApi.getStatsByJumpType().subscribe((data) => { + data.sort((a, b) => b.nb - a.nb); + this.dsNbJumpByType = new MatTableDataSource(data); + }); + } + + private statsByGear() { + this.serviceApi.getStatsByGear().subscribe((data) => { + data.sort((a, b) => b.nb - a.nb); + this.dsNbJumpByGear = new MatTableDataSource(data); + }); + } + + private statsByAircraft() { + this.serviceApi.getStatsByAircraft().subscribe((data) => { + data.sort((a, b) => b.nb - a.nb); + this.dsNbJumpByAircraft = new MatTableDataSource(data); + }); + } + + private statsByDz() { + this.serviceApi.getStatsByDz().subscribe((data) => { + data.sort((a, b) => b.nb - a.nb); + this.dsNbJumpByDz = new MatTableDataSource(data); + }); + } + + private statsLastYear() { + this.serviceApi.getStatsOfLastYear().subscribe((data) => { + data.byDz.sort((a, b) => b.nb - a.nb); + this.dsJumpForLastYearByDz = new MatTableDataSource(data.byDz); + data.byJumpType.sort((a, b) => b.nb - a.nb); + this.dsJumpForLastYearByJumpType = new MatTableDataSource( + data.byJumpType, + ); + }); + } + + private statsLastMonth() { + this.serviceApi.getStatsOfLastMonth().subscribe((data) => { + data.byDz.sort((a, b) => b.nb - a.nb); + this.dsJumpForLastMonthByDz = new MatTableDataSource(data.byDz); + data.byJumpType.sort((a, b) => b.nb - a.nb); + this.dsJumpForLastMonthByJumpType = new MatTableDataSource( + data.byJumpType, + ); + }); + } + //#endregion } diff --git a/Front/skydivelogs-app/src/app/user-profile/user-profile.component.html b/Front/skydivelogs-app/src/app/user-profile/user-profile.component.html index 5ce4c9c..ce4b431 100644 --- a/Front/skydivelogs-app/src/app/user-profile/user-profile.component.html +++ b/Front/skydivelogs-app/src/app/user-profile/user-profile.component.html @@ -26,7 +26,7 @@

- +

Current password @@ -39,8 +39,10 @@

- - + + diff --git a/Front/skydivelogs-app/src/app/user-profile/user-profile.component.ts b/Front/skydivelogs-app/src/app/user-profile/user-profile.component.ts index 27553f6..8b1cca5 100644 --- a/Front/skydivelogs-app/src/app/user-profile/user-profile.component.ts +++ b/Front/skydivelogs-app/src/app/user-profile/user-profile.component.ts @@ -1,20 +1,54 @@ -import { Component, OnInit } from '@angular/core'; -import { FormGroup, FormControl, Validators } from '@angular/forms'; -import { AuthenticationService } from '../../services/authentication.service'; -import { User } from '../../models/user'; +import { Component, OnInit } from "@angular/core"; +import { + FormGroup, + FormControl, + Validators, + ReactiveFormsModule, +} from "@angular/forms"; +import { MatLabel, MatFormFieldModule } from "@angular/material/form-field"; +import { + TranslateModule, + TranslatePipe, + TranslateService, +} from "@ngx-translate/core"; +import { MatInputModule } from "@angular/material/input"; +import { MatButtonModule } from "@angular/material/button"; + +import { AuthenticationService } from "../../services/authentication.service"; +import { ListOfImagesComponent } from "../list-of-images/list-of-images.component"; +import { ServiceComm } from "../../services/service-comm.service"; @Component({ - selector: 'app-user-profile', - templateUrl: './user-profile.component.html', - styleUrls: ['./user-profile.component.css'], - standalone: false + selector: "app-user-profile", + templateUrl: "./user-profile.component.html", + styleUrls: ["./user-profile.component.css"], + imports: [ + ListOfImagesComponent, + ReactiveFormsModule, + MatLabel, + MatFormFieldModule, + MatInputModule, + MatButtonModule, + TranslateModule, + ], }) export class UserProfileComponent implements OnInit { public userForm: FormGroup; - constructor(private authenticationService: AuthenticationService) { } + constructor( + private authenticationService: AuthenticationService, + private translateService: TranslateService, + private serviceComm: ServiceComm, + ) {} + + ngOnInit() { + this.serviceComm.forceTranslateTitle.subscribe((data) => { + if (data === true) { + this.updateTitle(); + } + }); + this.updateTitle(); - ngOnInit(): void { const currentUser = this.authenticationService.currentUserValue; this.userForm = new FormGroup( @@ -33,15 +67,15 @@ export class UserProfileComponent implements OnInit { Validators.email, ]), currentPassword: new FormControl( - '', - Validators.pattern('^[A-Za-z0-9_-]{8,15}$') + "", + Validators.pattern("^[A-Za-z0-9_-]{8,15}$"), ), newPassword: new FormControl( - '', - Validators.pattern('^[A-Za-z0-9_-]{8,15}$') + "", + Validators.pattern("^[A-Za-z0-9_-]{8,15}$"), ), }, - { updateOn: 'blur' } + { updateOn: "blur" }, ); } @@ -60,56 +94,62 @@ export class UserProfileComponent implements OnInit { private calculTailleVoile() { let tailleVoile = new Map>(); - tailleVoile.set("60", [ 175, 161, 147, 133, 124, 115, 107, 97, 89 ]); - tailleVoile.set("61", [ 178, 163, 149, 135, 126, 116, 108, 98, 90 ]); - tailleVoile.set("62", [ 180, 166, 151, 137, 127, 118, 109, 99, 91 ]); - tailleVoile.set("63", [ 183, 168, 153, 138, 129, 119, 111, 100, 91 ]); - tailleVoile.set("64", [ 185, 170, 155, 140, 130, 121, 112, 101, 92 ]); - tailleVoile.set("65", [ 188, 173, 157, 142, 132, 122, 113, 102, 93 ]); - tailleVoile.set("66", [ 190, 175, 159, 144, 134, 123, 114, 103, 94 ]); - tailleVoile.set("67", [ 193, 177, 161, 146, 135, 125, 116, 104, 94 ]); - tailleVoile.set("68", [ 195, 179, 164, 147, 137, 126, 117, 105, 95 ]); - tailleVoile.set("69", [ 198, 182, 166, 149, 138, 128, 118, 106, 96 ]); - tailleVoile.set("70", [ 200, 184, 168, 151, 140, 129, 119, 107, 96 ]); - tailleVoile.set("71", [ 203, 186, 170, 153, 142, 130, 120, 107, 97 ]); - tailleVoile.set("72", [ 205, 189, 172, 155, 143, 132, 121, 108, 98 ]); - tailleVoile.set("73", [ 208, 191, 174, 156, 145, 133, 123, 109, 99 ]); - tailleVoile.set("74", [ 210, 193, 176, 158, 146, 134, 124, 110, 99 ]); - tailleVoile.set("75", [ 213, 196, 178, 160, 148, 136, 125, 111, 100 ]); - tailleVoile.set("76", [ 215, 198, 180, 162, 150, 137, 126, 112, 101 ]); - tailleVoile.set("77", [ 218, 200, 182, 163, 151, 139, 127, 113, 101 ]); - tailleVoile.set("78", [ 220, 202, 184, 165, 153, 140, 128, 114, 102 ]); - tailleVoile.set("79", [ 223, 205, 186, 167, 154, 141, 129, 115, 103 ]); - tailleVoile.set("80", [ 225, 207, 188, 169, 156, 143, 131, 115, 103 ]); - tailleVoile.set("81", [ 228, 209, 190, 170, 157, 144, 132, 116, 104 ]); - tailleVoile.set("82", [ 230, 212, 192, 172, 159, 145, 133, 117, 104 ]); - tailleVoile.set("83", [ 233, 214, 194, 174, 160, 146, 134, 118, 105 ]); - tailleVoile.set("84", [ 235, 216, 196, 176, 162, 148, 135, 119, 106 ]); - tailleVoile.set("85", [ 238, 219, 198, 177, 163, 149, 136, 120, 106 ]); - tailleVoile.set("86", [ 240, 221, 201, 179, 165, 150, 137, 120, 107 ]); - tailleVoile.set("87", [ 243, 223, 203, 181, 166, 152, 138, 121, 108 ]); - tailleVoile.set("88", [ 245, 225, 205, 183, 168, 153, 139, 122, 108 ]); - tailleVoile.set("89", [ 248, 228, 207, 184, 170, 154, 140, 123, 109 ]); - tailleVoile.set("90", [ 250, 230, 209, 186, 171, 156, 141, 124, 109 ]); - tailleVoile.set("91", [ 253, 232, 211, 188, 173, 157, 143, 124, 110 ]); - tailleVoile.set("92", [ 255, 235, 213, 190, 174, 158, 144, 125, 110 ]); - tailleVoile.set("93", [ 258, 237, 215, 191, 176, 159, 145, 126, 111 ]); - tailleVoile.set("94", [ 260, 239, 217, 193, 177, 161, 146, 127, 112 ]); - tailleVoile.set("95", [ 263, 242, 219, 195, 179, 162, 147, 128, 112 ]); - tailleVoile.set("96", [ 265, 244, 221, 197, 180, 163, 148, 128, 113 ]); - tailleVoile.set("97", [ 268, 246, 223, 198, 182, 164, 149, 129, 113 ]); - tailleVoile.set("98", [ 270, 248, 225, 200, 183, 166, 150, 130, 114 ]); - tailleVoile.set("99", [ 273, 251, 227, 202, 185, 167, 151, 131, 114 ]); - tailleVoile.set("100", [ 275, 253, 229, 203, 186, 168, 152, 131, 115 ]); - tailleVoile.set("101", [ 278, 255, 231, 205, 188, 169, 153, 132, 115 ]); - tailleVoile.set("102", [ 280, 258, 233, 207, 189, 171, 154, 133, 116 ]); - tailleVoile.set("103", [ 283, 260, 235, 209, 190, 172, 155, 134, 116 ]); - tailleVoile.set("104", [ 285, 262, 237, 210, 192, 173, 156, 134, 117 ]); - tailleVoile.set("105", [ 288, 265, 239, 212, 193, 174, 157, 135, 118 ]); - tailleVoile.set("106", [ 290, 267, 241, 214, 195, 175, 158, 136, 118 ]); - tailleVoile.set("107", [ 293, 269, 243, 215, 196, 177, 159, 136, 119 ]); - tailleVoile.set("108", [ 295, 271, 245, 217, 198, 178, 160, 137, 119 ]); - tailleVoile.set("109", [ 298, 274, 247, 219, 199, 179, 161, 138, 120 ]); - tailleVoile.set("110", [ 300, 276, 249, 220, 201, 180, 162, 138, 120 ]); + tailleVoile.set("60", [175, 161, 147, 133, 124, 115, 107, 97, 89]); + tailleVoile.set("61", [178, 163, 149, 135, 126, 116, 108, 98, 90]); + tailleVoile.set("62", [180, 166, 151, 137, 127, 118, 109, 99, 91]); + tailleVoile.set("63", [183, 168, 153, 138, 129, 119, 111, 100, 91]); + tailleVoile.set("64", [185, 170, 155, 140, 130, 121, 112, 101, 92]); + tailleVoile.set("65", [188, 173, 157, 142, 132, 122, 113, 102, 93]); + tailleVoile.set("66", [190, 175, 159, 144, 134, 123, 114, 103, 94]); + tailleVoile.set("67", [193, 177, 161, 146, 135, 125, 116, 104, 94]); + tailleVoile.set("68", [195, 179, 164, 147, 137, 126, 117, 105, 95]); + tailleVoile.set("69", [198, 182, 166, 149, 138, 128, 118, 106, 96]); + tailleVoile.set("70", [200, 184, 168, 151, 140, 129, 119, 107, 96]); + tailleVoile.set("71", [203, 186, 170, 153, 142, 130, 120, 107, 97]); + tailleVoile.set("72", [205, 189, 172, 155, 143, 132, 121, 108, 98]); + tailleVoile.set("73", [208, 191, 174, 156, 145, 133, 123, 109, 99]); + tailleVoile.set("74", [210, 193, 176, 158, 146, 134, 124, 110, 99]); + tailleVoile.set("75", [213, 196, 178, 160, 148, 136, 125, 111, 100]); + tailleVoile.set("76", [215, 198, 180, 162, 150, 137, 126, 112, 101]); + tailleVoile.set("77", [218, 200, 182, 163, 151, 139, 127, 113, 101]); + tailleVoile.set("78", [220, 202, 184, 165, 153, 140, 128, 114, 102]); + tailleVoile.set("79", [223, 205, 186, 167, 154, 141, 129, 115, 103]); + tailleVoile.set("80", [225, 207, 188, 169, 156, 143, 131, 115, 103]); + tailleVoile.set("81", [228, 209, 190, 170, 157, 144, 132, 116, 104]); + tailleVoile.set("82", [230, 212, 192, 172, 159, 145, 133, 117, 104]); + tailleVoile.set("83", [233, 214, 194, 174, 160, 146, 134, 118, 105]); + tailleVoile.set("84", [235, 216, 196, 176, 162, 148, 135, 119, 106]); + tailleVoile.set("85", [238, 219, 198, 177, 163, 149, 136, 120, 106]); + tailleVoile.set("86", [240, 221, 201, 179, 165, 150, 137, 120, 107]); + tailleVoile.set("87", [243, 223, 203, 181, 166, 152, 138, 121, 108]); + tailleVoile.set("88", [245, 225, 205, 183, 168, 153, 139, 122, 108]); + tailleVoile.set("89", [248, 228, 207, 184, 170, 154, 140, 123, 109]); + tailleVoile.set("90", [250, 230, 209, 186, 171, 156, 141, 124, 109]); + tailleVoile.set("91", [253, 232, 211, 188, 173, 157, 143, 124, 110]); + tailleVoile.set("92", [255, 235, 213, 190, 174, 158, 144, 125, 110]); + tailleVoile.set("93", [258, 237, 215, 191, 176, 159, 145, 126, 111]); + tailleVoile.set("94", [260, 239, 217, 193, 177, 161, 146, 127, 112]); + tailleVoile.set("95", [263, 242, 219, 195, 179, 162, 147, 128, 112]); + tailleVoile.set("96", [265, 244, 221, 197, 180, 163, 148, 128, 113]); + tailleVoile.set("97", [268, 246, 223, 198, 182, 164, 149, 129, 113]); + tailleVoile.set("98", [270, 248, 225, 200, 183, 166, 150, 130, 114]); + tailleVoile.set("99", [273, 251, 227, 202, 185, 167, 151, 131, 114]); + tailleVoile.set("100", [275, 253, 229, 203, 186, 168, 152, 131, 115]); + tailleVoile.set("101", [278, 255, 231, 205, 188, 169, 153, 132, 115]); + tailleVoile.set("102", [280, 258, 233, 207, 189, 171, 154, 133, 116]); + tailleVoile.set("103", [283, 260, 235, 209, 190, 172, 155, 134, 116]); + tailleVoile.set("104", [285, 262, 237, 210, 192, 173, 156, 134, 117]); + tailleVoile.set("105", [288, 265, 239, 212, 193, 174, 157, 135, 118]); + tailleVoile.set("106", [290, 267, 241, 214, 195, 175, 158, 136, 118]); + tailleVoile.set("107", [293, 269, 243, 215, 196, 177, 159, 136, 119]); + tailleVoile.set("108", [295, 271, 245, 217, 198, 178, 160, 137, 119]); + tailleVoile.set("109", [298, 274, 247, 219, 199, 179, 161, 138, 120]); + tailleVoile.set("110", [300, 276, 249, 220, 201, 180, 162, 138, 120]); + } + + private updateTitle() { + this.translateService.get("UserProfile_Title").subscribe((data) => { + this.serviceComm.updatedComponentTitle(data); + }); } } diff --git a/Front/skydivelogs-app/src/assets/css/Material-Icons.css b/Front/skydivelogs-app/src/assets/css/Material-Icons.css deleted file mode 100644 index dfb4526..0000000 --- a/Front/skydivelogs-app/src/assets/css/Material-Icons.css +++ /dev/null @@ -1,48 +0,0 @@ -/* fallback */ -@font-face { - font-family: 'Material Icons'; - font-style: normal; - font-weight: 400; - src: url(../font/Material-Icons-Fallback.woff2) format('woff2'); -} - -/* .material-icons { - font-family: 'Material Icons'; - font-weight: normal; - font-style: normal; - font-size: 24px; - line-height: 1; - letter-spacing: normal; - text-transform: none; - display: inline-block; - white-space: nowrap; - word-wrap: normal; - direction: ltr; - -moz-font-feature-settings: 'liga'; - -moz-osx-font-smoothing: grayscale; -} */ - -.material-icons { - font-family: 'Material Icons'; - font-weight: normal; - font-style: normal; - font-size: 24px; /* Preferred icon size */ - display: inline-block; - line-height: 1; - text-transform: none; - letter-spacing: normal; - word-wrap: normal; - white-space: nowrap; - direction: ltr; - - /* Support for all WebKit browsers. */ - -webkit-font-smoothing: antialiased; - /* Support for Safari and Chrome. */ - text-rendering: optimizeLegibility; - - /* Support for Firefox. */ - -moz-osx-font-smoothing: grayscale; - - /* Support for IE. */ - font-feature-settings: 'liga'; -} diff --git a/Front/skydivelogs-app/src/assets/css/Roboto.css b/Front/skydivelogs-app/src/assets/css/Roboto.css deleted file mode 100644 index 879effc..0000000 --- a/Front/skydivelogs-app/src/assets/css/Roboto.css +++ /dev/null @@ -1,168 +0,0 @@ -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: url(../font/300/Cyrillic-ext.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: url(../font/300/Cyrillic.woff2) format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: url(../font/300/Greek-ext.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: url(../font/300/Greek.woff2) format('woff2'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: url(../font/300/Vietnamese.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: url(../font/300/Latin-ext.woff2) format('woff2'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: url(../font/300/Latin.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: url(../font/400/Cyrillic-ext.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: url(../font/400/Cyrillic.woff2) format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: url(../font/400/Greek-ext.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: url(../font/400/Greek.woff2) format('woff2'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: url(../font/400/Vietnamese.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: url(../font/400/Latin-ext.woff2) format('woff2'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: url(../font/400/Latin.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: url(../font/500/Cyrillic-ext.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: url(../font/500/Cyrillic.woff2) format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: url(../font/500/Greek-ext.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: url(../font/500/Greek.woff2) format('woff2'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: url(../font/500/Vietnamese.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: url(../font/500/Latin-ext.woff2) format('woff2'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: url(../font/500/Latin.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} diff --git a/Front/skydivelogs-app/src/assets/css/new-theme.scss b/Front/skydivelogs-app/src/assets/css/new-theme.scss index 02fcdcc..58363a1 100644 --- a/Front/skydivelogs-app/src/assets/css/new-theme.scss +++ b/Front/skydivelogs-app/src/assets/css/new-theme.scss @@ -1,6 +1,18 @@ /* These tokens are generated using https://themes.angular-material.dev/ */ -/* Preview: https://themes.angular-material.dev/?seed-error=%23FF5449&seed-neutral=%23938F94&seed-neutral-variant=%23948F99&seed-primary=%236750A4&seed-secondary=%23958DA4&seed-tertiary=%23B58392 */ +/* Preview: https://themes.angular-material.dev/?bold-font-weight=700&brand-font-family=Roboto&medium-font-weight=500&plain-font-family=Roboto®ular-font-weight=400&seed-error=%23FF5449&seed-neutral=%23938F94&seed-neutral-variant=%23948F99&seed-primary=%236750A4&seed-secondary=%23958DA4&seed-tertiary=%23B58392 */ /* Seed Colors: primary: #6750A4, secondary: #958DA4, tertiary: #B58392, error: #FF5449, neutral: #938F94, neutral-variant: #948F99 */ +/* Seed Typography: plain-font-family: Roboto, brand-font-family: Roboto, bold-font-weight: 700, medium-font-weight: 500, regular-font-weight: 400 */ + +/* Make sure to import fonts in `` of html */ +/* + + +OR + + +*/ @use "@angular/material" as mat; @@ -127,122 +139,67 @@ )); } +/* Typography */ +:root, :host { + /* core typography tokens are not generating css variables, hence below */ + --mat-sys-brand-font-family: Roboto; + --mat-sys-plain-font-family: Roboto; + --mat-sys-bold-font-weight: 700; + --mat-sys-medium-font-weight: 500; + --mat-sys-regular-font-weight: 400; -// https://theme-builder-1623190217839.web.app/ - - // @use '@angular/material' as mat; - - // @import "Material-Icons"; - // @import "Roboto"; - - /* - // Be sure that you only ever include this mixin once! - @include mat.core(); - - // Define your theme with color palettes, typography and density - - $mat-theme-primary-palette: map-merge(mat.$cyan-palette, ( contrast: (100: #150c4a,))); - $mat-theme-primary: mat.define-palette( - $mat-theme-primary-palette, - $default: 100, - $lighter: 100, - $darker: 700, - $text: 500 - ); - - $mat-theme-accent-palette: map-merge(mat.$teal-palette, ( 501: #4d77b6,contrast: (501: white,A100: white,A200: white,))); - $mat-theme-accent: mat.define-palette( - $mat-theme-accent-palette, - $default: 501, - $lighter: A100, - $darker: A200, - $text: 600 - ); - - $mat-theme-warn-palette: map-merge(mat.$pink-palette, ( )); - $mat-theme-warn: mat.define-palette( - $mat-theme-warn-palette, - $default: A200, - $lighter: 500, - $darker: 500, - $text: A700 - ); - - $mat-dark-theme-primary-palette: map-merge(mat.$lime-palette, ( contrast: (200: #030844,A100: rgba(0,0,0, 0.87),A700: rgba(0,0,0, 0.87),))); - $mat-dark-theme-primary: mat.define-palette( - $mat-dark-theme-primary-palette, - $default: 200, - $lighter: A100, - $darker: A700, - $text: 700 - ); - - $mat-dark-theme-accent-palette: map-merge(mat.$green-palette, ( contrast: (A200: black,50: black,A400: black,))); - $mat-dark-theme-accent: mat.define-palette( - $mat-dark-theme-accent-palette, - $default: A200, - $lighter: 50, - $darker: A400, - $text: A100 - ); - - $mat-dark-theme-warn-palette: map-merge(mat.$pink-palette, ( contrast: (A100: black,100: white,))); - $mat-dark-theme-warn: mat.define-palette( - $mat-dark-theme-warn-palette, - $default: A100, - $lighter: 100, - $darker: A700, - $text: 100 - ); - - // @import url('https://fonts.googleapis.com/css2?family=Rubik:wght@300&display=swap'); - - $mat-typography: mat.define-typography-config( - $font-family: 'Rubik', - $display-4: mat.define-typography-level($font-size: 96px, $font-weight: 300, $font-family: Rubik), - $display-3: mat.define-typography-level($font-size: 60px, $font-weight: 500, $font-family: Rubik), - $display-2: mat.define-typography-level($font-size: 48px, $font-weight: 500, $font-family: Rubik), - $display-1: mat.define-typography-level($font-size: 34px, $font-weight: 500, $font-family: Rubik), - $headline: mat.define-typography-level($font-size: 24px, $font-weight: 500, $font-family: Rubik), - $title: mat.define-typography-level($font-size: 20px, $font-weight: 500, $font-family: Rubik), - $subheading-2: mat.define-typography-level($font-size: 18px, $font-weight: 500, $font-family: Rubik), - $subheading-1: mat.define-typography-level($font-size: 20px, $font-weight: 500, $font-family: Rubik), - $body-2: mat.define-typography-level($font-size: 16px, $font-weight: 400, $font-family: Rubik), - $body-1: mat.define-typography-level($font-size: 18px, $font-weight: 400, $font-family: Rubik), - $caption: mat.define-typography-level($font-size: 16px, $font-weight: Medium, $font-family: Rubik), - $button: mat.define-typography-level($font-size: 16px, $font-weight: 500, $font-family: Rubik), - // Line-height must be unit-less fraction of the font-size. - $input: mat.define-typography-level($font-size: inherit, $line-height: 1.125, $font-weight: 500, $font-family: Rubik), - ); - - $mat-density: 0; - // @include mat.elevation( - // $zValue: 12, - // $color: #000, - // $opacity: 0.5 - // ); - - $mat-core-theme: mat.define-light-theme(( - color: ( - primary: $mat-theme-primary, - accent: $mat-theme-accent, - warn: $mat-theme-warn - ), - typography: $mat-typography, - density: $mat-density + @include mat.theme-overrides(( + brand-family: Roboto, + plain-family: Roboto, + bold-weight: 700, + medium-weight: 500, + regular-weight: 400, + headline-large-font: var(--mat-sys-brand-font-family), + headline-medium-font: var(--mat-sys-brand-font-family), + headline-small-font: var(--mat-sys-brand-font-family), + display-large-font: var(--mat-sys-brand-font-family), + display-medium-font: var(--mat-sys-brand-font-family), + display-small-font: var(--mat-sys-brand-font-family), + title-large-font: var(--mat-sys-brand-font-family), + body-large: var(--mat-sys-body-large-weight) var(--mat-sys-body-large-size) / var(--mat-sys-body-large-line-height) var(--mat-sys-body-large-font), + body-medium: var(--mat-sys-body-medium-weight) var(--mat-sys-body-medium-size) / var(--mat-sys-body-medium-line-height) var(--mat-sys-body-medium-font), + body-small: var(--mat-sys-body-small-weight) var(--mat-sys-body-small-size) / var(--mat-sys-body-small-line-height) var(--mat-sys-body-small-font), + label-large: var(--mat-sys-label-large-weight) var(--mat-sys-label-large-size) / var(--mat-sys-label-large-line-height) var(--mat-sys-label-large-font), + label-medium: var(--mat-sys-label-medium-weight) var(--mat-sys-label-medium-size) / var(--mat-sys-label-medium-line-height) var(--mat-sys-label-medium-font), + label-small: var(--mat-sys-label-small-weight) var(--mat-sys-label-small-size) / var(--mat-sys-label-small-line-height) var(--mat-sys-label-small-font), + title-large: var(--mat-sys-title-large-weight) var(--mat-sys-title-large-size) / var(--mat-sys-title-large-line-height) var(--mat-sys-title-large-font), + title-medium: var(--mat-sys-title-medium-weight) var(--mat-sys-title-medium-size) / var(--mat-sys-title-medium-line-height) var(--mat-sys-title-medium-font), + title-small: var(--mat-sys-title-small-weight) var(--mat-sys-title-small-size) / var(--mat-sys-title-small-line-height) var(--mat-sys-title-small-font), + headline-large: var(--mat-sys-headline-large-weight) var(--mat-sys-headline-large-size) / var(--mat-sys-headline-large-line-height) var(--mat-sys-headline-large-font), + headline-medium: var(--mat-sys-headline-medium-weight) var(--mat-sys-headline-medium-size) / var(--mat-sys-headline-medium-line-height) var(--mat-sys-headline-medium-font), + headline-small: var(--mat-sys-headline-small-weight) var(--mat-sys-headline-small-size) / var(--mat-sys-headline-small-line-height) var(--mat-sys-headline-small-font), + display-large: var(--mat-sys-display-large-weight) var(--mat-sys-display-large-size) / var(--mat-sys-display-large-line-height) var(--mat-sys-display-large-font), + display-medium: var(--mat-sys-display-medium-weight) var(--mat-sys-display-medium-size) / var(--mat-sys-display-medium-line-height) var(--mat-sys-display-medium-font), + display-small: var(--mat-sys-display-small-weight) var(--mat-sys-display-small-size) / var(--mat-sys-display-small-line-height) var(--mat-sys-display-small-font), + body-large-font: var(--mat-sys-plain-font-family), + body-medium-font: var(--mat-sys-plain-font-family), + body-small-font: var(--mat-sys-plain-font-family), + label-large-font: var(--mat-sys-plain-font-family), + label-medium-font: var(--mat-sys-plain-font-family), + label-small-font: var(--mat-sys-plain-font-family), + title-medium-font: var(--mat-sys-plain-font-family), + title-small-font: var(--mat-sys-plain-font-family), + label-large-weight-prominent: var(--mat-sys-bold-font-weight), + label-medium-weight-prominent: var(--mat-sys-bold-font-weight), + label-large-weight: var(--mat-sys-medium-font-weight), + label-medium-weight: var(--mat-sys-medium-font-weight), + label-small-weight: var(--mat-sys-medium-font-weight), + title-medium-weight: var(--mat-sys-medium-font-weight), + title-small-weight: var(--mat-sys-medium-font-weight), + body-large-weight: var(--mat-sys-regular-font-weight), + body-medium-weight: var(--mat-sys-regular-font-weight), + body-small-weight: var(--mat-sys-regular-font-weight), + display-large-weight: var(--mat-sys-regular-font-weight), + display-medium-weight: var(--mat-sys-regular-font-weight), + display-small-weight: var(--mat-sys-regular-font-weight), + headline-large-weight: var(--mat-sys-regular-font-weight), + headline-medium-weight: var(--mat-sys-regular-font-weight), + headline-small-weight: var(--mat-sys-regular-font-weight), + title-large-weight: var(--mat-sys-regular-font-weight), )); - - $mat-dark-theme: mat.define-dark-theme(( - color: ( - primary: $mat-dark-theme-primary, - accent: $mat-dark-theme-accent, - warn: $mat-dark-theme-warn, - ) - )); - - @include mat.all-component-themes($mat-core-theme); - - .dark-theme { - @include mat.all-component-colors($mat-dark-theme); - } - */ \ No newline at end of file +} diff --git a/Front/skydivelogs-app/src/assets/font/300/Cyrillic-ext.woff2 b/Front/skydivelogs-app/src/assets/font/300/Cyrillic-ext.woff2 deleted file mode 100644 index 082312b802ab1cf9140e9d4232fa668bf2d0b078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14988 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

CkuA%ZR?P%ou^(SYxDOWdh4Sg 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 G0RRB7u#O`D diff --git a/Front/skydivelogs-app/src/assets/font/300/Latin-ext.woff2 b/Front/skydivelogs-app/src/assets/font/300/Latin-ext.woff2 deleted file mode 100644 index f113c08c7d31b14336394dab2825308d0e45d35e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11812 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 S^yF6MJwFMOA3K9Y0ssK?gWKr< diff --git a/Front/skydivelogs-app/src/assets/font/300/Latin.woff2 b/Front/skydivelogs-app/src/assets/font/300/Latin.woff2 deleted file mode 100644 index 46445bf807becda5c338b1bb09d2e93398fc4861..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15732 zcmV-)J&VG3Pew8T0RR9106la75&!@I0FG<`06h@^0RR9100000000000000000000 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 O2A)!ug78XT3c>?|PMj40 diff --git a/Front/skydivelogs-app/src/assets/font/400/Cyrillic.woff2 b/Front/skydivelogs-app/src/assets/font/400/Cyrillic.woff2 deleted file mode 100644 index f1b8ed7caa291d212ba2e442667833f271951284..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9688 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 a1YT%=Y7g3t?#)EbOG~SvB(Wky0RRA%1+<<3 diff --git a/Front/skydivelogs-app/src/assets/font/400/Greek-ext.woff2 b/Front/skydivelogs-app/src/assets/font/400/Greek-ext.woff2 deleted file mode 100644 index 84fcce1abe8b92017e4c2b7a5f0e1389b9d7e5e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1516 zcmV1bO#^|f=L_92nZgh zD|#}ZSY8AV{Wn*CZg)oRXH! z;2HF$va9+uSL5A{>_bLYFgh+%&=FSyXqycZ9UXNqR2ST+2<&L+sDaR`6%L#K^2>)1 z0OWBcO9a{HU4}L3bQ=9StW~!1C?U?`S-`#0k6XDMUG-qoHsjXLB*GwZ8{>!;HxX%k z5~uMai~y2?dTD9#FAH&2;6V{SMV_3zY*G7q3#BN~^~#9~Df$bgQXoa1r%52<_Dtv!Up&$qNc8JR0)fqiQrnNUS}*|H z`s7YLX-M4v3#Fl;{&Y2~#oy|eOBIRITY*pWc=Ss7WQ$)uSy9toldAElCLcUJ5%*{? z)r@(hWIia@&T?KdN#F&mqv;;G#AXtM=>ePJ$rB$G&@}I;R5L4ibE#z_x0DnTv9_Am z0*T=%6@}7LP~YyatSI_Cfmv&T%&Ej+!`z423zoCRF+JGsf5?l*&^L3;r)J4ff1E$0 zCe!;nq<-wd2zvIjqmBaU)w^{%vz$xCnt(LVVG z27-dJwXUh~AyH1FInsI1weR5gqBnveo{3$lhVctW+YFow8N3 z>R@zu9H^nDwVpjCT1acY-}7PO?`6Lf&zd5 z)AWiREVch8uGCpd5Clmk^$do6Q2YnO5__7?Tz`ILH3BekHZk}Zj`)}p6qF2%2*AuJ z6`@&xUeqE2JG~JFCzIW3zgvS516k~g7)j!)mpbuzm~wOG?YC&cm~p%4tfqujkzc3U zoI%dCk;GcFh7{FGb#S`cwz;^o`j!zpjaanDh+##vnKNk4E^|{CjoEG5fJGhieLGFS z;_TH}w6cZ`YxvjKZ@`doBZ`=_XiPEFCJY%dYo`%A z71N+rxk^piRVsYO50#(-KzPzHb*Z%HOY#Yc2qj;HB1QIy2O>9@WF|&n&gTJ9v!%%6 zE^T-~@z-q3Awq2{Uz-^twBE+8`SHTAz922$C5#I_RjU()>D;~Do708)$XLs!1Yz-2 zuFrA{>z@Al^~saAlZKn-h5e&YaA>P=xFhTqqi}9rot+dZT;8?0$?n03meR)^A{1pa zX0j?SjLDGaGa;b ScBtK?5y1bO#^|f=L@M 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 z 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 ODnjIpr3jG$0002NGPvIW diff --git a/Front/skydivelogs-app/src/assets/font/400/Latin.woff2 b/Front/skydivelogs-app/src/assets/font/400/Latin.woff2 deleted file mode 100644 index ebe1795f85a661c205e4a4612eaf47d56273e68e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15688 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 mvaOGij5=g2?s)?gPRW37kqzEXM!4*&oxc5c7` diff --git a/Front/skydivelogs-app/src/assets/font/500/Cyrillic-ext.woff2 b/Front/skydivelogs-app/src/assets/font/500/Cyrillic-ext.woff2 deleted file mode 100644 index e6f9427038fe09dcb167bc737a7220b6ce6cb4f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15080 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 Kqc9Ke0RR9<6kNps diff --git a/Front/skydivelogs-app/src/assets/font/500/Cyrillic.woff2 b/Front/skydivelogs-app/src/assets/font/500/Cyrillic.woff2 deleted file mode 100644 index f1bfb055d7e07b2a12944824c14bc70fe0f17125..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9776 zcmV-0CePV-Pew8T0RR91046X15&!@I09qUX042@<0RR9100000000000000000000 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 K^KzCxC*c5~ecOcq diff --git a/Front/skydivelogs-app/src/assets/font/500/Greek-ext.woff2 b/Front/skydivelogs-app/src/assets/font/500/Greek-ext.woff2 deleted file mode 100644 index 67e5402be45165c48e36334cc9ecfbb6f63cf6ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1532 zcmV200$rpf>Rsw2ml@j zxry~kY=)RjuAUM+|GqQ3PnJw^XiDTMA*MY^31NXz<3;==_F=z_%Qy~!MQ`~QDGSFcQ)gfzsyguW3PAydkGKRv39hRbwebpt9(c7YiiX4?9U-6G5|nb2rhykC?EnN1P~ykE3L32M-NX!`jTCX9!OuY z+3JS$wTqU0kPZv*KH0Hm*`g0Zp%0@`I_;yVJ$t$#xhSe-&w6+NdWEXpspfpnkLK57 zu6Fb#@(%;%GE)UeGk=ToGRqav8629)hA~sd`k=kph`!0C49mUC6vU9L0d#+3iJ>sd z1mdU-gOFs2QG?c6lL*>T+@w zM3pb5%Bdzo_a{-GNzPbmyY)$OpCqT|5btS>`vC%A={UiLjTi3{a#ra<5;$f@Hn|%x z3+4+bd`x>*bt5r!Ld9DttrpPX<6g@YjGjK9r;Lxpr;S^BgpQ6Ki!8_%hzvf+dYZBe zMP?M86e$!r99qigOP48?jRNYWm~A*xLTl_=gk7?f``^hLe!|{P;nd>9JZ_C_ghNNl zLXM+7c5f;Pdy4C#)Vt@De$PH<>WRUdaZ5X)zlxfns=bU*I_(HEkjLRc9dC46i&CrP z$-GYl?yU9!WC}*r=B=qwwdI%$5lz$vWuu=xM+zA56K2f!bZ2m~uoH&7?Knyxg`GA; zd`%lU8J{+1ucz&>EO{^#P8P-+p`-KF#!?2hh^<3<^1&Q@@J|QQydC=87^5oQ73gjh zg-&Xuz6%f(KB`h73xEee1_*#b04q3*M&7|-jLK`&4hHfW*Z=IjC%bcx!xg$_Zp>;~ z!+h+6pFavu`{bQja_HSp&;0o9nT74I;c0Ib*m^s4`kS(6P6Wkpd5YI(7CuVbXEF9! zXW3i`^74mAZU33t@#(b=nRk+Coek4|ByXHQyz1sXHMQ@!Xb7*Tzkbmu<|{9)x_;qM z-v6h6xnHi{@F4O{;ireqPr2!j1+! z%>Va+0?LgmnWg5eo3NEH5>%bgADGvDO1miPtF7w2ui05CxtF$z|6dR0`da`36aWI=+HwTJni;Y3usjfq&vVXTDQ}cAnBy#WI$}4^ zl^a6z3}qxT?PLY-{KM?5;K9fuvof%R6IkCVP@J!#j;1s1u3Ir%2(HD;_-RD4ymp?5 z5kE%EIItq3;v#k=Jlf0}-+3EZ!ezq@&_xfUOwogIg5h!)Om&sjSUA^4WtI-ylW5gJ zk}UD=@j$k*Ye7aVgm&Pu)OXHLj~gz1K#dNq%u6Z`r+K7x6C?pM29oI{-Jt;Fq_!n(q^Hfs7@DeN iNGceapMadMt%+XfB)y`5X`36Dnj0B0slDL4+LJAo9?OUT diff --git a/Front/skydivelogs-app/src/assets/font/500/Greek.woff2 b/Front/skydivelogs-app/src/assets/font/500/Greek.woff2 deleted file mode 100644 index ccd96335454ca6bd1ca8618cfd8c45ee548b3729..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7000 zcmV-e8>i%VPew8T0RR9102^2U5&!@I064q=02=rJ0RR9100000000000000000000 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 qxchoKVs%1{bq&~bPJ4uv8lsE!;zmgT diff --git a/Front/skydivelogs-app/src/assets/font/500/Latin-ext.woff2 b/Front/skydivelogs-app/src/assets/font/500/Latin-ext.woff2 deleted file mode 100644 index 7ef9a9261848262ec6133b15b5a872cec4e3e2b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11768 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 a{7m{*`cXQvQ@!Wf%=S>OeblYykKWrwy}|7O diff --git a/Front/skydivelogs-app/src/assets/font/500/Latin.woff2 b/Front/skydivelogs-app/src/assets/font/500/Latin.woff2 deleted file mode 100644 index ce795fa8bdd3ca2b9c42124cc89e61e9272e9fb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15920 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 SYT_{{QN5GB$em6A0000dHT^mO diff --git a/Front/skydivelogs-app/src/assets/font/500/Vietnamese.woff2 b/Front/skydivelogs-app/src/assets/font/500/Vietnamese.woff2 deleted file mode 100644 index 01c0cc84d00b6677ff87fa0904adbfb0f5b2835b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5580 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 \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/add.svg b/Front/skydivelogs-app/src/assets/icon/add.svg new file mode 100644 index 0000000..020cc3d --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/add.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/aircraft.svg b/Front/skydivelogs-app/src/assets/icon/aircraft.svg new file mode 100644 index 0000000..47895c8 --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/aircraft.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/celebration.svg b/Front/skydivelogs-app/src/assets/icon/celebration.svg new file mode 100644 index 0000000..0b63c15 --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/celebration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/close.svg b/Front/skydivelogs-app/src/assets/icon/close.svg new file mode 100644 index 0000000..854953c --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/delete.svg b/Front/skydivelogs-app/src/assets/icon/delete.svg new file mode 100644 index 0000000..172f367 --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/delete.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/dz.svg b/Front/skydivelogs-app/src/assets/icon/dz.svg new file mode 100644 index 0000000..12bb30d --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/dz.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/edit.svg b/Front/skydivelogs-app/src/assets/icon/edit.svg new file mode 100644 index 0000000..826f83e --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/fan.svg b/Front/skydivelogs-app/src/assets/icon/fan.svg new file mode 100644 index 0000000..4de42cd --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/fan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/favorite.svg b/Front/skydivelogs-app/src/assets/icon/favorite.svg new file mode 100644 index 0000000..60caff0 --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/favorite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/file_upload.svg b/Front/skydivelogs-app/src/assets/icon/file_upload.svg new file mode 100644 index 0000000..7854949 --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/file_upload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/flight_land.svg b/Front/skydivelogs-app/src/assets/icon/flight_land.svg new file mode 100644 index 0000000..16fbf98 --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/flight_land.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/gear.svg b/Front/skydivelogs-app/src/assets/icon/gear.svg new file mode 100644 index 0000000..1e79e22 --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/gear.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/info.svg b/Front/skydivelogs-app/src/assets/icon/info.svg new file mode 100644 index 0000000..9ae001c --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/link.svg b/Front/skydivelogs-app/src/assets/icon/link.svg new file mode 100644 index 0000000..c30d6a0 --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/list.svg b/Front/skydivelogs-app/src/assets/icon/list.svg new file mode 100644 index 0000000..e0c1a44 --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/logout.svg b/Front/skydivelogs-app/src/assets/icon/logout.svg new file mode 100644 index 0000000..e1f576a --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/logout.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/mail.svg b/Front/skydivelogs-app/src/assets/icon/mail.svg new file mode 100644 index 0000000..ba8e68d --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/mail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/map.svg b/Front/skydivelogs-app/src/assets/icon/map.svg new file mode 100644 index 0000000..87eb846 --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/map.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/menu.svg b/Front/skydivelogs-app/src/assets/icon/menu.svg new file mode 100644 index 0000000..c375ef7 --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/menu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/not_favorite.svg b/Front/skydivelogs-app/src/assets/icon/not_favorite.svg new file mode 100644 index 0000000..2f0669d --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/not_favorite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/note.svg b/Front/skydivelogs-app/src/assets/icon/note.svg new file mode 100644 index 0000000..64738f6 --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/note.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/reset.svg b/Front/skydivelogs-app/src/assets/icon/reset.svg new file mode 100644 index 0000000..dcb3919 --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/reset.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/rotate.svg b/Front/skydivelogs-app/src/assets/icon/rotate.svg new file mode 100644 index 0000000..48a8b09 --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/rotate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/summary.svg b/Front/skydivelogs-app/src/assets/icon/summary.svg new file mode 100644 index 0000000..f5dc456 --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/summary.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/assets/icon/wind.svg b/Front/skydivelogs-app/src/assets/icon/wind.svg new file mode 100644 index 0000000..a422180 --- /dev/null +++ b/Front/skydivelogs-app/src/assets/icon/wind.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/skydivelogs-app/src/config/config.dev.json b/Front/skydivelogs-app/src/config/config.dev.json index a7a9f70..ba49219 100644 --- a/Front/skydivelogs-app/src/config/config.dev.json +++ b/Front/skydivelogs-app/src/config/config.dev.json @@ -1,4 +1,4 @@ { - "apiUrl": "http://localhost:5000", - "version": "0.28.0" -} \ No newline at end of file + "apiUrl": "http://localhost:5000", + "version": "0.28.0 DEV" +} diff --git a/Front/skydivelogs-app/src/config/config.prod.json b/Front/skydivelogs-app/src/config/config.prod.json index 8db6d9b..ffc98f9 100644 --- a/Front/skydivelogs-app/src/config/config.prod.json +++ b/Front/skydivelogs-app/src/config/config.prod.json @@ -1,4 +1,4 @@ { - "apiUrl": "https://test-divelog.sebastienandre.com", - "version": "0.28.0" -} \ No newline at end of file + "apiUrl": "https://test-divelog.sebastienandre.com", + "version": "0.28.0 PROD" +} diff --git a/Front/skydivelogs-app/src/environments/environment.dev.ts b/Front/skydivelogs-app/src/environments/environment.dev.ts new file mode 100644 index 0000000..8b0b5c0 --- /dev/null +++ b/Front/skydivelogs-app/src/environments/environment.dev.ts @@ -0,0 +1,10 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. + +export const environment = { + production: false, + debugMode: true, + env: "dev" +}; diff --git a/Front/skydivelogs-app/src/index.html b/Front/skydivelogs-app/src/index.html index ce3b1fb..95e31ed 100644 --- a/Front/skydivelogs-app/src/index.html +++ b/Front/skydivelogs-app/src/index.html @@ -1,23 +1,32 @@ + + + SkydivelogsApp + + + + - - - SkydivelogsApp - - - - - - - -

- - - - -
- - - + + +
+ + + + +
+
+ diff --git a/Front/skydivelogs-app/src/interceptor/error.interceptor.ts b/Front/skydivelogs-app/src/interceptor/error.interceptor.ts index 8380160..85b566d 100644 --- a/Front/skydivelogs-app/src/interceptor/error.interceptor.ts +++ b/Front/skydivelogs-app/src/interceptor/error.interceptor.ts @@ -1,29 +1,59 @@ -import { Injectable } from '@angular/core'; -import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http'; -import { Observable, throwError } from 'rxjs'; -import { catchError } from 'rxjs/operators'; +// import { Injectable } from "@angular/core"; +// import { +// HttpRequest, +// HttpHandler, +// HttpEvent, +// HttpInterceptor, +// } from "@angular/common/http"; +// import { Observable, throwError } from "rxjs"; +// import { catchError } from "rxjs/operators"; -import { AuthenticationService } from '../services/authentication.service'; +// import { AuthenticationService } from "../services/authentication.service"; +// @Injectable() +// export class ErrorInterceptor implements HttpInterceptor { +// constructor(private authenticationService: AuthenticationService) {} -@Injectable() -export class ErrorInterceptor implements HttpInterceptor { +// intercept( +// request: HttpRequest, +// next: HttpHandler +// ): Observable> { +// return next.handle(request).pipe( +// catchError((err) => { +// if (err.status === 401) { +// // auto logout if 401 response returned from api +// this.authenticationService.logout(); +// location.reload(); +// } - constructor(private authenticationService: AuthenticationService) { } +// const error = err.error.message || err.statusText; +// return throwError(() => error); +// }) +// ); +// } +// } - intercept(request: HttpRequest, next: HttpHandler): Observable> { - return next.handle(request) - .pipe( - catchError(err => { - if (err.status === 401) { - // auto logout if 401 response returned from api - this.authenticationService.logout(); - location.reload(); - } +import { HttpEvent, HttpHandlerFn, HttpRequest } from "@angular/common/http"; +import { inject } from "@angular/core"; +import { catchError, Observable, throwError } from "rxjs"; +import { AuthenticationService } from "../services/authentication.service"; - const error = err.error.message || err.statusText; - return throwError(error); - }) - ); - } +export function ErrorInterceptor( + request: HttpRequest, + next: HttpHandlerFn +): Observable> { + const authenticationService = inject(AuthenticationService); + + return next(request).pipe( + catchError((err) => { + if (err.status === 401) { + // auto logout if 401 response returned from api + authenticationService.logout(); + location.reload(); + } + + const error = err.error.message || err.statusText; + return throwError(() => error); + }) + ); } diff --git a/Front/skydivelogs-app/src/interceptor/jwt-auth.interceptor.ts b/Front/skydivelogs-app/src/interceptor/jwt-auth.interceptor.ts index 250f257..7aa11d3 100644 --- a/Front/skydivelogs-app/src/interceptor/jwt-auth.interceptor.ts +++ b/Front/skydivelogs-app/src/interceptor/jwt-auth.interceptor.ts @@ -1,27 +1,21 @@ -import { Injectable } from "@angular/core"; -import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from "@angular/common/http"; +import { HttpEvent, HttpHandlerFn, HttpRequest } from "@angular/common/http"; +import { inject } from "@angular/core"; import { Observable } from "rxjs"; - import { AuthenticationService } from "../services/authentication.service"; +export function JwtAuthInterceptor( + request: HttpRequest, + next: HttpHandlerFn +): Observable> { + const currentUser = inject(AuthenticationService).currentUserValue; -@Injectable() -export class JwtAuthInterceptor implements HttpInterceptor { - - constructor(private authenticationService: AuthenticationService) {} - - intercept(request: HttpRequest, next: HttpHandler): Observable> { - // add authorization header with basic auth credentials if available - const currentUser = this.authenticationService.currentUserValue; - - if (currentUser && currentUser.token) { - request = request.clone({ - setHeaders: { - Authorization: `Bearer ${currentUser.token}` - } - }); - } - - return next.handle(request); + if (currentUser && currentUser.token) { + request = request.clone({ + setHeaders: { + Authorization: `Bearer ${currentUser.token}`, + }, + }); } + + return next(request); } diff --git a/Front/skydivelogs-app/src/main.ts b/Front/skydivelogs-app/src/main.ts index 3ecea68..a6690d2 100644 --- a/Front/skydivelogs-app/src/main.ts +++ b/Front/skydivelogs-app/src/main.ts @@ -1,13 +1,15 @@ +import { enableProdMode } from "@angular/core"; +import { bootstrapApplication } from "@angular/platform-browser"; -import { enableProdMode } from '@angular/core'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { appConfig } from "./app/app.config"; +import { AppComponent } from "./app/app.component"; -import { AppModule } from './app/app.module'; -import { environment } from './environments/environment'; +import { environment } from "./environments/environment"; if (environment.production) { enableProdMode(); } -platformBrowserDynamic().bootstrapModule(AppModule) - .catch(err => console.log(err)); +bootstrapApplication(AppComponent, appConfig).catch((err) => + console.error(err) +); diff --git a/Front/skydivelogs-app/src/services/base.service.ts b/Front/skydivelogs-app/src/services/base.service.ts index 14e2860..137f2b0 100644 --- a/Front/skydivelogs-app/src/services/base.service.ts +++ b/Front/skydivelogs-app/src/services/base.service.ts @@ -1,26 +1,25 @@ -import { HttpHeaders } from '@angular/common/http'; +import { HttpHeaders } from "@angular/common/http"; -import { ConfigurationHelper } from './configuration-helper'; -import { ServiceCacheApi } from './service-cache-api.service'; +import { ConfigurationHelper } from "./configuration-helper"; +import { ServiceCacheApi } from "./service-cache-api.service"; export class BaseService { - protected headers: HttpHeaders; - protected apiUrl: string; - protected serviceCacheApi : ServiceCacheApi; + protected headers: HttpHeaders; + protected apiUrl: string; + protected serviceCacheApi: ServiceCacheApi; - constructor() { - ConfigurationHelper.settings.subscribe(settings => - { - if (settings != null) { - let tmpApiUrl : string = settings.apiUrl; - - this.headers = new HttpHeaders({ - 'Access-Control-Allow-Origin': tmpApiUrl - }); - this.apiUrl = tmpApiUrl + '/api'; - } + constructor() { + ConfigurationHelper.settings.subscribe((settings) => { + if (settings != null) { + let tmpApiUrl: string = settings.apiUrl; + + this.headers = new HttpHeaders({ + "Access-Control-Allow-Origin": tmpApiUrl, }); + this.apiUrl = tmpApiUrl + "/api"; + } + }); - this.serviceCacheApi = new ServiceCacheApi(); - } + this.serviceCacheApi = new ServiceCacheApi(); + } } diff --git a/Front/skydivelogs-app/src/services/configuration-helper.ts b/Front/skydivelogs-app/src/services/configuration-helper.ts index f6bb2b6..2857747 100644 --- a/Front/skydivelogs-app/src/services/configuration-helper.ts +++ b/Front/skydivelogs-app/src/services/configuration-helper.ts @@ -1,31 +1,33 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; +import { Injectable } from "@angular/core"; +import { HttpClient } from "@angular/common/http"; -import { BehaviorSubject } from 'rxjs'; - -import { IAppSettings } from '../models/app-settings'; +import { BehaviorSubject } from "rxjs"; +import { IAppSettings } from "../models/app-settings"; @Injectable({ providedIn: "root" }) export class ConfigurationHelper { - private static settingsSource = new BehaviorSubject(null); - public static settings = ConfigurationHelper.settingsSource.asObservable(); - - constructor(private http: HttpClient) {} + private static settingsSource = new BehaviorSubject(null); + public static settings = ConfigurationHelper.settingsSource.asObservable(); - load(env: string) { - const jsonFile = `/config/config.${env}.json`; + constructor(private http: HttpClient) {} - return new Promise((resolve, reject) => { - this.http.get(jsonFile) - .toPromise() - .then((response : IAppSettings) => { - ConfigurationHelper.settingsSource.next(response); - resolve(); - }) - .catch((response: any) => { - reject(`Could not load file '${jsonFile}': ${JSON.stringify(response)}`); - }); + load(env: string) { + const jsonFile = `/config/config.${env}.json`; + + return new Promise((resolve, reject) => { + this.http + .get(jsonFile) + .toPromise() + .then((response: IAppSettings) => { + ConfigurationHelper.settingsSource.next(response); + resolve(); + }) + .catch((response: any) => { + reject( + `Could not load file '${jsonFile}': ${JSON.stringify(response)}` + ); }); - } -} \ No newline at end of file + }); + } +} diff --git a/Front/skydivelogs-app/src/services/request-cache.service.ts b/Front/skydivelogs-app/src/services/request-cache.service.ts index 589c22f..85b21bc 100644 --- a/Front/skydivelogs-app/src/services/request-cache.service.ts +++ b/Front/skydivelogs-app/src/services/request-cache.service.ts @@ -1,5 +1,5 @@ -import { Injectable } from '@angular/core'; -import { HttpRequest, HttpResponse } from '@angular/common/http'; +import { Injectable } from "@angular/core"; +import { HttpRequest, HttpResponse } from "@angular/common/http"; @Injectable() export class RequestCache { @@ -10,8 +10,8 @@ export class RequestCache { } get(req: HttpRequest): HttpResponse | undefined { - const splittedUrl = req.urlWithParams.split('/'); - const url = splittedUrl[splittedUrl.length - 1] + '_' + req.method; + const splittedUrl = req.urlWithParams.split("/"); + const url = splittedUrl[splittedUrl.length - 1] + "_" + req.method; this.clearExpiredEntries(); const cached = this.cache.get(url); @@ -24,8 +24,8 @@ export class RequestCache { } put(req: HttpRequest, response: HttpResponse): void { - const splittedUrl = req.urlWithParams.split('/'); - const url = splittedUrl[splittedUrl.length - 1] + '_' + req.method; + const splittedUrl = req.urlWithParams.split("/"); + const url = splittedUrl[splittedUrl.length - 1] + "_" + req.method; const entry = { url, response, lastRead: Date.now() }; this.cache.set(url, entry); @@ -36,7 +36,7 @@ export class RequestCache { const maxAge = 30000; const expired = Date.now() - maxAge; - this.cache.forEach(expiredEntry => { + this.cache.forEach((expiredEntry) => { if (expiredEntry.lastRead < expired) { this.cache.delete(expiredEntry.url); } diff --git a/Front/skydivelogs-app/src/services/service-cache-api.service.ts b/Front/skydivelogs-app/src/services/service-cache-api.service.ts index c40d9fc..9cbdcff 100644 --- a/Front/skydivelogs-app/src/services/service-cache-api.service.ts +++ b/Front/skydivelogs-app/src/services/service-cache-api.service.ts @@ -1,29 +1,28 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; -import { tap } from 'rxjs/operators'; -import { CacheApiKey } from '../models/cache-api-key.enum'; -import { of } from 'rxjs'; +import { Injectable } from "@angular/core"; +import { Observable } from "rxjs"; +import { tap } from "rxjs/operators"; +import { CacheApiKey } from "../models/cache-api-key.enum"; +import { of } from "rxjs"; -@Injectable({ - providedIn: 'root', -}) +@Injectable({ providedIn: "root" }) export class ServiceCacheApi { private cache: Map>; - constructor() { + constructor() { this.cache = new Map>(); } - public get(key: CacheApiKey, callToApi: Observable) : Observable { + public get(key: CacheApiKey, callToApi: Observable): Observable { const cached = this.cache.get(key); if (cached) { return cached; } else { return callToApi.pipe( - tap(event => { - this.cache.set(key, of(event)); - })); + tap((event) => { + this.cache.set(key, of(event)); + }) + ); } } @@ -31,7 +30,7 @@ export class ServiceCacheApi { this.cache.delete(key); } - public getByKey(key: CacheApiKey) : Observable { + public getByKey(key: CacheApiKey): Observable { return this.cache.get(key); } } diff --git a/Front/skydivelogs-app/src/tsconfig.app.json b/Front/skydivelogs-app/src/tsconfig.app.json deleted file mode 100644 index c1c97c7..0000000 --- a/Front/skydivelogs-app/src/tsconfig.app.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/app", - "baseUrl": "./", - "types": [] - }, - "files": [ - "main.ts", - "polyfills.ts" - ] -} diff --git a/Front/skydivelogs-app/src/tsconfig.spec.json b/Front/skydivelogs-app/src/tsconfig.spec.json deleted file mode 100644 index c89454b..0000000 --- a/Front/skydivelogs-app/src/tsconfig.spec.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/spec", - "baseUrl": "./", - "types": [ - "jasmine", - "node" - ] - }, - "files": [ - "test.ts", - "polyfills.ts" - ], - "include": [ - "**/*.spec.ts", - "**/*.d.ts" - ] -} diff --git a/Front/skydivelogs-app/src/typings.d.ts b/Front/skydivelogs-app/src/typings.d.ts deleted file mode 100644 index ef5c7bd..0000000 --- a/Front/skydivelogs-app/src/typings.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/* SystemJS module definition */ -declare var module: NodeModule; -interface NodeModule { - id: string; -} diff --git a/Front/skydivelogs-app/tsconfig.app.json b/Front/skydivelogs-app/tsconfig.app.json new file mode 100644 index 0000000..3775b37 --- /dev/null +++ b/Front/skydivelogs-app/tsconfig.app.json @@ -0,0 +1,15 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts" + ], + "include": [ + "src/**/*.d.ts" + ] +} diff --git a/Front/skydivelogs-app/tsconfig.json b/Front/skydivelogs-app/tsconfig.json index 4a3997b..c91b0d2 100644 --- a/Front/skydivelogs-app/tsconfig.json +++ b/Front/skydivelogs-app/tsconfig.json @@ -1,25 +1,29 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ { "compileOnSave": false, - "angularCompilerOptions": { - "strictTemplates": true, - }, "compilerOptions": { - "importHelpers": true, "outDir": "./dist/out-tsc", + "strict": false, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "isolatedModules": true, "esModuleInterop": true, - "sourceMap": true, - "declaration": false, - "moduleResolution": "node", "experimentalDecorators": true, - "target": "es2015", - "typeRoots": [ - "node_modules/@types" - ], - "lib": [ - "es2017", - "dom" - ], - "module": "esnext", - "baseUrl": "./" + "moduleResolution": "bundler", + "importHelpers": true, + "target": "ES2022", + "module": "ES2022", + "strictPropertyInitialization": false, + "strictNullChecks": false + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true } -} \ No newline at end of file +} diff --git a/Front/skydivelogs-app/tsconfig.spec.json b/Front/skydivelogs-app/tsconfig.spec.json new file mode 100644 index 0000000..5fb748d --- /dev/null +++ b/Front/skydivelogs-app/tsconfig.spec.json @@ -0,0 +1,15 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/doc.txt b/doc.txt index 1573890..e847648 100644 --- a/doc.txt +++ b/doc.txt @@ -1,7 +1,7 @@ -To build an image "toto" with the version "0.1": docker build . -t skydivelogs:1.4.2 +To build an image "toto" with the version "0.1": podman build . -t skydivelogs:1.5.0 To run ab image to container with volume : - docker run -v C:\toto\config:/app/Front/config -v C:\toto\db:/app/API/Data -d -p 5080:80/tcp --name Test -it skydivelogs:1.4.0 + podman run -v C:\toto\config:/app/Front/config -v C:\toto\db:/app/API/Data -d -p 5080:80/tcp --name Test -it skydivelogs:1.5.0 -docker save --output skydivelogs-1.4.2.tar skydivelogs:1.4.2 +podman save --output skydivelogs-1.5.0.tar skydivelogs:1.5.0 -scp -P 5022 skydivelogs-1.4.2.tar administrator@51.75.68.58:~ +scp -P 5022 skydivelogs-1.5.0.tar administrator@51.75.68.58:~