From d0fd155ea397a28b3b986f701073d2ce5c92d880 Mon Sep 17 00:00:00 2001 From: chris Date: Fri, 17 Oct 2025 20:12:07 +0200 Subject: [PATCH] Refactor login component, update app routing, and add color theme styles --- src/angular/frontend/package.json | 5 +- src/angular/frontend/pnpm-lock.yaml | 261 +++++++++++------- .../frontend/src/app/app.component.html | 1 - src/angular/frontend/src/app/app.config.ts | 3 +- src/angular/frontend/src/app/app.routes.ts | 2 + .../app/components/home/home.component.html | 1 + .../app/components/home/home.component.scss | 0 .../src/app/components/home/home.component.ts | 12 + .../app/components/login/login.component.ts | 2 +- .../app/components/panel/panel.component.html | 1 + .../app/components/panel/panel.component.scss | 15 + .../components/panel/panel.component.spec.ts | 23 ++ .../app/components/panel/panel.component.ts | 11 + .../nav-profile/nav-profile.component.html | 1 + .../nav-profile/nav-profile.component.scss | 0 .../nav-profile/nav-profile.component.spec.ts | 23 ++ .../nav-profile/nav-profile.component.ts | 12 + .../app/components/shell/shell.component.html | 4 + .../app/components/shell/shell.component.scss | 9 + .../components/shell/shell.component.spec.ts | 23 ++ .../app/components/shell/shell.component.ts | 19 ++ .../src/app/guards/auth.guard.spec.ts | 17 ++ .../frontend/src/app/guards/auth.guard.ts | 15 + src/angular/frontend/src/color-theme.scss | 69 +++++ src/angular/frontend/src/styles.scss | 3 + .../.idea/copilot.data.migration.agent.xml | 6 + .../.idea/copilot.data.migration.ask.xml | 6 + .../copilot.data.migration.ask2agent.xml | 6 + .../.idea/copilot.data.migration.edit.xml | 6 + 29 files changed, 451 insertions(+), 105 deletions(-) create mode 100644 src/angular/frontend/src/app/components/home/home.component.html create mode 100644 src/angular/frontend/src/app/components/home/home.component.scss create mode 100644 src/angular/frontend/src/app/components/home/home.component.ts create mode 100644 src/angular/frontend/src/app/components/panel/panel.component.html create mode 100644 src/angular/frontend/src/app/components/panel/panel.component.scss create mode 100644 src/angular/frontend/src/app/components/panel/panel.component.spec.ts create mode 100644 src/angular/frontend/src/app/components/panel/panel.component.ts create mode 100644 src/angular/frontend/src/app/components/shell/nav-profile/nav-profile.component.html create mode 100644 src/angular/frontend/src/app/components/shell/nav-profile/nav-profile.component.scss create mode 100644 src/angular/frontend/src/app/components/shell/nav-profile/nav-profile.component.spec.ts create mode 100644 src/angular/frontend/src/app/components/shell/nav-profile/nav-profile.component.ts create mode 100644 src/angular/frontend/src/app/components/shell/shell.component.html create mode 100644 src/angular/frontend/src/app/components/shell/shell.component.scss create mode 100644 src/angular/frontend/src/app/components/shell/shell.component.spec.ts create mode 100644 src/angular/frontend/src/app/components/shell/shell.component.ts create mode 100644 src/angular/frontend/src/app/guards/auth.guard.spec.ts create mode 100644 src/angular/frontend/src/app/guards/auth.guard.ts create mode 100644 src/angular/frontend/src/color-theme.scss create mode 100644 src/dotnet/.idea/.idea.Suspectus.Gandalf/.idea/copilot.data.migration.agent.xml create mode 100644 src/dotnet/.idea/.idea.Suspectus.Gandalf/.idea/copilot.data.migration.ask.xml create mode 100644 src/dotnet/.idea/.idea.Suspectus.Gandalf/.idea/copilot.data.migration.ask2agent.xml create mode 100644 src/dotnet/.idea/.idea.Suspectus.Gandalf/.idea/copilot.data.migration.edit.xml diff --git a/src/angular/frontend/package.json b/src/angular/frontend/package.json index 4028718..40cb352 100644 --- a/src/angular/frontend/package.json +++ b/src/angular/frontend/package.json @@ -17,7 +17,9 @@ "@angular/forms": "^19.1.0", "@angular/platform-browser": "^19.1.0", "@angular/platform-browser-dynamic": "^19.1.0", + "@angular/platform-server": "^19.1.0", "@angular/router": "^19.1.0", + "@angular/ssr": "^19.2.14", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.15.0" @@ -27,6 +29,7 @@ "@angular/cli": "^19.1.7", "@angular/compiler-cli": "^19.1.0", "@types/jasmine": "~5.1.0", + "@types/node": "^18.18.0", "jasmine-core": "~5.5.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.2.0", @@ -35,4 +38,4 @@ "karma-jasmine-html-reporter": "~2.1.0", "typescript": "~5.7.2" } -} +} \ No newline at end of file diff --git a/src/angular/frontend/pnpm-lock.yaml b/src/angular/frontend/pnpm-lock.yaml index 3d5cfab..fe481b3 100644 --- a/src/angular/frontend/pnpm-lock.yaml +++ b/src/angular/frontend/pnpm-lock.yaml @@ -29,9 +29,15 @@ importers: '@angular/platform-browser-dynamic': specifier: ^19.1.0 version: 19.2.14(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.14)(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.14(@angular/animations@19.2.14(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))) + '@angular/platform-server': + specifier: ^19.1.0 + version: 19.2.15(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.14)(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.14(@angular/animations@19.2.14(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@angular/router': specifier: ^19.1.0 version: 19.2.14(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.14(@angular/animations@19.2.14(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + '@angular/ssr': + specifier: ^19.2.14 + version: 19.2.18(fa7767f49f86fa85c067e27d35b0c201) rxjs: specifier: ~7.8.0 version: 7.8.2 @@ -44,16 +50,19 @@ importers: devDependencies: '@angular-devkit/build-angular': specifier: ^19.1.7 - version: 19.2.14(@angular/compiler-cli@19.2.14(@angular/compiler@19.2.14)(typescript@5.7.3))(@angular/compiler@19.2.14)(@types/node@22.15.30)(chokidar@4.0.3)(jiti@1.21.7)(karma@6.4.4)(typescript@5.7.3)(vite@6.2.7(@types/node@22.15.30)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)) + version: 19.2.14(@angular/compiler-cli@19.2.14(@angular/compiler@19.2.14)(typescript@5.7.3))(@angular/compiler@19.2.14)(@angular/platform-server@19.2.15(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.14)(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.14(@angular/animations@19.2.14(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/ssr@19.2.18(fa7767f49f86fa85c067e27d35b0c201))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@1.21.7)(karma@6.4.4)(typescript@5.7.3)(vite@6.2.7(@types/node@18.19.130)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)) '@angular/cli': specifier: ^19.1.7 - version: 19.2.14(@types/node@22.15.30)(chokidar@4.0.3) + version: 19.2.14(@types/node@18.19.130)(chokidar@4.0.3) '@angular/compiler-cli': specifier: ^19.1.0 version: 19.2.14(@angular/compiler@19.2.14)(typescript@5.7.3) '@types/jasmine': specifier: ~5.1.0 version: 5.1.8 + '@types/node': + specifier: ^18.18.0 + version: 18.19.130 jasmine-core: specifier: ~5.5.0 version: 5.5.0 @@ -253,6 +262,16 @@ packages: '@angular/animations': optional: true + '@angular/platform-server@19.2.15': + resolution: {integrity: sha512-VKuEmzFylYLnFjjFTctnbckgYdXEyt3wU0AwT3uuLrSU/3EgfHlqd33ONuYaIxSRES81GaLcV9cc9uiZYT2QMg==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} + peerDependencies: + '@angular/common': 19.2.15 + '@angular/compiler': 19.2.15 + '@angular/core': 19.2.15 + '@angular/platform-browser': 19.2.15 + rxjs: ^6.5.3 || ^7.4.0 + '@angular/router@19.2.14': resolution: {integrity: sha512-cBTWY9Jx7YhbmDYDb7Hqz4Q7UNIMlKTkdKToJd2pbhIXyoS+kHVQrySmyca+jgvYMjWnIjsAEa3dpje12D4mFw==} engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} @@ -262,6 +281,17 @@ packages: '@angular/platform-browser': 19.2.14 rxjs: ^6.5.3 || ^7.4.0 + '@angular/ssr@19.2.18': + resolution: {integrity: sha512-3mcTMFpksELKSAAsOZ0XLvrSsbvZMRJ0+mkgOdw6VsKCvnmWn2jkjQGBJwuUmeIYSfmM0PwEyhrXiZA7cdGPjQ==} + peerDependencies: + '@angular/common': ^19.0.0 || ^19.2.0-next.0 + '@angular/core': ^19.0.0 || ^19.2.0-next.0 + '@angular/platform-server': ^19.0.0 || ^19.2.0-next.0 + '@angular/router': ^19.0.0 || ^19.2.0-next.0 + peerDependenciesMeta: + '@angular/platform-server': + optional: true + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -1626,8 +1656,8 @@ packages: '@types/node-forge@1.3.11': resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} - '@types/node@22.15.30': - resolution: {integrity: sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==} + '@types/node@18.19.130': + resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} '@types/qs@6.14.0': resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} @@ -3938,8 +3968,8 @@ packages: resolution: {integrity: sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ==} hasBin: true - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} @@ -4184,6 +4214,10 @@ packages: utf-8-validate: optional: true + xhr2@0.2.1: + resolution: {integrity: sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==} + engines: {node: '>= 6'} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -4239,13 +4273,13 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@19.2.14(@angular/compiler-cli@19.2.14(@angular/compiler@19.2.14)(typescript@5.7.3))(@angular/compiler@19.2.14)(@types/node@22.15.30)(chokidar@4.0.3)(jiti@1.21.7)(karma@6.4.4)(typescript@5.7.3)(vite@6.2.7(@types/node@22.15.30)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0))': + '@angular-devkit/build-angular@19.2.14(@angular/compiler-cli@19.2.14(@angular/compiler@19.2.14)(typescript@5.7.3))(@angular/compiler@19.2.14)(@angular/platform-server@19.2.15(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.14)(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.14(@angular/animations@19.2.14(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/ssr@19.2.18(fa7767f49f86fa85c067e27d35b0c201))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@1.21.7)(karma@6.4.4)(typescript@5.7.3)(vite@6.2.7(@types/node@18.19.130)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0))': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.1902.14(chokidar@4.0.3) '@angular-devkit/build-webpack': 0.1902.14(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0))(webpack@5.98.0(esbuild@0.25.4)) '@angular-devkit/core': 19.2.14(chokidar@4.0.3) - '@angular/build': 19.2.14(@angular/compiler-cli@19.2.14(@angular/compiler@19.2.14)(typescript@5.7.3))(@angular/compiler@19.2.14)(@types/node@22.15.30)(chokidar@4.0.3)(jiti@1.21.7)(karma@6.4.4)(less@4.2.2)(postcss@8.5.2)(terser@5.39.0)(typescript@5.7.3) + '@angular/build': 19.2.14(@angular/compiler-cli@19.2.14(@angular/compiler@19.2.14)(typescript@5.7.3))(@angular/compiler@19.2.14)(@angular/platform-server@19.2.15(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.14)(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.14(@angular/animations@19.2.14(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/ssr@19.2.18(fa7767f49f86fa85c067e27d35b0c201))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@1.21.7)(karma@6.4.4)(less@4.2.2)(postcss@8.5.2)(terser@5.39.0)(typescript@5.7.3) '@angular/compiler-cli': 19.2.14(@angular/compiler@19.2.14)(typescript@5.7.3) '@babel/core': 7.26.10 '@babel/generator': 7.26.10 @@ -4258,7 +4292,7 @@ snapshots: '@babel/runtime': 7.26.10 '@discoveryjs/json-ext': 0.6.3 '@ngtools/webpack': 19.2.14(@angular/compiler-cli@19.2.14(@angular/compiler@19.2.14)(typescript@5.7.3))(typescript@5.7.3)(webpack@5.98.0(esbuild@0.25.4)) - '@vitejs/plugin-basic-ssl': 1.2.0(vite@6.2.7(@types/node@22.15.30)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)) + '@vitejs/plugin-basic-ssl': 1.2.0(vite@6.2.7(@types/node@18.19.130)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)) ansi-colors: 4.1.3 autoprefixer: 10.4.20(postcss@8.5.2) babel-loader: 9.2.1(@babel/core@7.26.10)(webpack@5.98.0(esbuild@0.25.4)) @@ -4299,6 +4333,8 @@ snapshots: webpack-merge: 6.0.1 webpack-subresource-integrity: 5.1.0(webpack@5.98.0(esbuild@0.25.4)) optionalDependencies: + '@angular/platform-server': 19.2.15(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.14)(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.14(@angular/animations@19.2.14(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + '@angular/ssr': 19.2.18(fa7767f49f86fa85c067e27d35b0c201) esbuild: 0.25.4 karma: 6.4.4 transitivePeerDependencies: @@ -4360,7 +4396,7 @@ snapshots: '@angular/core': 19.2.14(rxjs@7.8.2)(zone.js@0.15.1) tslib: 2.8.1 - '@angular/build@19.2.14(@angular/compiler-cli@19.2.14(@angular/compiler@19.2.14)(typescript@5.7.3))(@angular/compiler@19.2.14)(@types/node@22.15.30)(chokidar@4.0.3)(jiti@1.21.7)(karma@6.4.4)(less@4.2.2)(postcss@8.5.2)(terser@5.39.0)(typescript@5.7.3)': + '@angular/build@19.2.14(@angular/compiler-cli@19.2.14(@angular/compiler@19.2.14)(typescript@5.7.3))(@angular/compiler@19.2.14)(@angular/platform-server@19.2.15(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.14)(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.14(@angular/animations@19.2.14(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/ssr@19.2.18(fa7767f49f86fa85c067e27d35b0c201))(@types/node@18.19.130)(chokidar@4.0.3)(jiti@1.21.7)(karma@6.4.4)(less@4.2.2)(postcss@8.5.2)(terser@5.39.0)(typescript@5.7.3)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.1902.14(chokidar@4.0.3) @@ -4370,8 +4406,8 @@ snapshots: '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-split-export-declaration': 7.24.7 '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) - '@inquirer/confirm': 5.1.6(@types/node@22.15.30) - '@vitejs/plugin-basic-ssl': 1.2.0(vite@6.2.7(@types/node@22.15.30)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)) + '@inquirer/confirm': 5.1.6(@types/node@18.19.130) + '@vitejs/plugin-basic-ssl': 1.2.0(vite@6.2.7(@types/node@18.19.130)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)) beasties: 0.3.2 browserslist: 4.25.0 esbuild: 0.25.4 @@ -4389,9 +4425,11 @@ snapshots: semver: 7.7.1 source-map-support: 0.5.21 typescript: 5.7.3 - vite: 6.2.7(@types/node@22.15.30)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0) + vite: 6.2.7(@types/node@18.19.130)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0) watchpack: 2.4.2 optionalDependencies: + '@angular/platform-server': 19.2.15(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.14)(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.14(@angular/animations@19.2.14(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + '@angular/ssr': 19.2.18(fa7767f49f86fa85c067e27d35b0c201) karma: 6.4.4 less: 4.2.2 lmdb: 3.2.6 @@ -4409,13 +4447,13 @@ snapshots: - tsx - yaml - '@angular/cli@19.2.14(@types/node@22.15.30)(chokidar@4.0.3)': + '@angular/cli@19.2.14(@types/node@18.19.130)(chokidar@4.0.3)': dependencies: '@angular-devkit/architect': 0.1902.14(chokidar@4.0.3) '@angular-devkit/core': 19.2.14(chokidar@4.0.3) '@angular-devkit/schematics': 19.2.14(chokidar@4.0.3) - '@inquirer/prompts': 7.3.2(@types/node@22.15.30) - '@listr2/prompt-adapter-inquirer': 2.0.18(@inquirer/prompts@7.3.2(@types/node@22.15.30)) + '@inquirer/prompts': 7.3.2(@types/node@18.19.130) + '@listr2/prompt-adapter-inquirer': 2.0.18(@inquirer/prompts@7.3.2(@types/node@18.19.130)) '@schematics/angular': 19.2.14(chokidar@4.0.3) '@yarnpkg/lockfile': 1.1.0 ini: 5.0.0 @@ -4488,6 +4526,16 @@ snapshots: optionalDependencies: '@angular/animations': 19.2.14(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)) + '@angular/platform-server@19.2.15(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.14)(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.14(@angular/animations@19.2.14(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)': + dependencies: + '@angular/common': 19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/compiler': 19.2.14 + '@angular/core': 19.2.14(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 19.2.14(@angular/animations@19.2.14(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)) + rxjs: 7.8.2 + tslib: 2.8.1 + xhr2: 0.2.1 + '@angular/router@19.2.14(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.14(@angular/animations@19.2.14(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)': dependencies: '@angular/common': 19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) @@ -4496,6 +4544,15 @@ snapshots: rxjs: 7.8.2 tslib: 2.8.1 + '@angular/ssr@19.2.18(fa7767f49f86fa85c067e27d35b0c201)': + dependencies: + '@angular/common': 19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 19.2.14(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/router': 19.2.14(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.14(@angular/animations@19.2.14(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + tslib: 2.8.1 + optionalDependencies: + '@angular/platform-server': 19.2.15(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.14)(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.14(@angular/animations@19.2.14(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.14(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.14(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -5305,34 +5362,34 @@ snapshots: '@esbuild/win32-x64@0.25.4': optional: true - '@inquirer/checkbox@4.1.8(@types/node@22.15.30)': + '@inquirer/checkbox@4.1.8(@types/node@18.19.130)': dependencies: - '@inquirer/core': 10.1.13(@types/node@22.15.30) + '@inquirer/core': 10.1.13(@types/node@18.19.130) '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@22.15.30) + '@inquirer/type': 3.0.7(@types/node@18.19.130) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 - '@inquirer/confirm@5.1.12(@types/node@22.15.30)': + '@inquirer/confirm@5.1.12(@types/node@18.19.130)': dependencies: - '@inquirer/core': 10.1.13(@types/node@22.15.30) - '@inquirer/type': 3.0.7(@types/node@22.15.30) + '@inquirer/core': 10.1.13(@types/node@18.19.130) + '@inquirer/type': 3.0.7(@types/node@18.19.130) optionalDependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 - '@inquirer/confirm@5.1.6(@types/node@22.15.30)': + '@inquirer/confirm@5.1.6(@types/node@18.19.130)': dependencies: - '@inquirer/core': 10.1.13(@types/node@22.15.30) - '@inquirer/type': 3.0.7(@types/node@22.15.30) + '@inquirer/core': 10.1.13(@types/node@18.19.130) + '@inquirer/type': 3.0.7(@types/node@18.19.130) optionalDependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 - '@inquirer/core@10.1.13(@types/node@22.15.30)': + '@inquirer/core@10.1.13(@types/node@18.19.130)': dependencies: '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@22.15.30) + '@inquirer/type': 3.0.7(@types/node@18.19.130) ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -5340,97 +5397,97 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 - '@inquirer/editor@4.2.13(@types/node@22.15.30)': + '@inquirer/editor@4.2.13(@types/node@18.19.130)': dependencies: - '@inquirer/core': 10.1.13(@types/node@22.15.30) - '@inquirer/type': 3.0.7(@types/node@22.15.30) + '@inquirer/core': 10.1.13(@types/node@18.19.130) + '@inquirer/type': 3.0.7(@types/node@18.19.130) external-editor: 3.1.0 optionalDependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 - '@inquirer/expand@4.0.15(@types/node@22.15.30)': + '@inquirer/expand@4.0.15(@types/node@18.19.130)': dependencies: - '@inquirer/core': 10.1.13(@types/node@22.15.30) - '@inquirer/type': 3.0.7(@types/node@22.15.30) + '@inquirer/core': 10.1.13(@types/node@18.19.130) + '@inquirer/type': 3.0.7(@types/node@18.19.130) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 '@inquirer/figures@1.0.12': {} - '@inquirer/input@4.1.12(@types/node@22.15.30)': + '@inquirer/input@4.1.12(@types/node@18.19.130)': dependencies: - '@inquirer/core': 10.1.13(@types/node@22.15.30) - '@inquirer/type': 3.0.7(@types/node@22.15.30) + '@inquirer/core': 10.1.13(@types/node@18.19.130) + '@inquirer/type': 3.0.7(@types/node@18.19.130) optionalDependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 - '@inquirer/number@3.0.15(@types/node@22.15.30)': + '@inquirer/number@3.0.15(@types/node@18.19.130)': dependencies: - '@inquirer/core': 10.1.13(@types/node@22.15.30) - '@inquirer/type': 3.0.7(@types/node@22.15.30) + '@inquirer/core': 10.1.13(@types/node@18.19.130) + '@inquirer/type': 3.0.7(@types/node@18.19.130) optionalDependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 - '@inquirer/password@4.0.15(@types/node@22.15.30)': + '@inquirer/password@4.0.15(@types/node@18.19.130)': dependencies: - '@inquirer/core': 10.1.13(@types/node@22.15.30) - '@inquirer/type': 3.0.7(@types/node@22.15.30) + '@inquirer/core': 10.1.13(@types/node@18.19.130) + '@inquirer/type': 3.0.7(@types/node@18.19.130) ansi-escapes: 4.3.2 optionalDependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 - '@inquirer/prompts@7.3.2(@types/node@22.15.30)': + '@inquirer/prompts@7.3.2(@types/node@18.19.130)': dependencies: - '@inquirer/checkbox': 4.1.8(@types/node@22.15.30) - '@inquirer/confirm': 5.1.12(@types/node@22.15.30) - '@inquirer/editor': 4.2.13(@types/node@22.15.30) - '@inquirer/expand': 4.0.15(@types/node@22.15.30) - '@inquirer/input': 4.1.12(@types/node@22.15.30) - '@inquirer/number': 3.0.15(@types/node@22.15.30) - '@inquirer/password': 4.0.15(@types/node@22.15.30) - '@inquirer/rawlist': 4.1.3(@types/node@22.15.30) - '@inquirer/search': 3.0.15(@types/node@22.15.30) - '@inquirer/select': 4.2.3(@types/node@22.15.30) + '@inquirer/checkbox': 4.1.8(@types/node@18.19.130) + '@inquirer/confirm': 5.1.12(@types/node@18.19.130) + '@inquirer/editor': 4.2.13(@types/node@18.19.130) + '@inquirer/expand': 4.0.15(@types/node@18.19.130) + '@inquirer/input': 4.1.12(@types/node@18.19.130) + '@inquirer/number': 3.0.15(@types/node@18.19.130) + '@inquirer/password': 4.0.15(@types/node@18.19.130) + '@inquirer/rawlist': 4.1.3(@types/node@18.19.130) + '@inquirer/search': 3.0.15(@types/node@18.19.130) + '@inquirer/select': 4.2.3(@types/node@18.19.130) optionalDependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 - '@inquirer/rawlist@4.1.3(@types/node@22.15.30)': + '@inquirer/rawlist@4.1.3(@types/node@18.19.130)': dependencies: - '@inquirer/core': 10.1.13(@types/node@22.15.30) - '@inquirer/type': 3.0.7(@types/node@22.15.30) + '@inquirer/core': 10.1.13(@types/node@18.19.130) + '@inquirer/type': 3.0.7(@types/node@18.19.130) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 - '@inquirer/search@3.0.15(@types/node@22.15.30)': + '@inquirer/search@3.0.15(@types/node@18.19.130)': dependencies: - '@inquirer/core': 10.1.13(@types/node@22.15.30) + '@inquirer/core': 10.1.13(@types/node@18.19.130) '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@22.15.30) + '@inquirer/type': 3.0.7(@types/node@18.19.130) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 - '@inquirer/select@4.2.3(@types/node@22.15.30)': + '@inquirer/select@4.2.3(@types/node@18.19.130)': dependencies: - '@inquirer/core': 10.1.13(@types/node@22.15.30) + '@inquirer/core': 10.1.13(@types/node@18.19.130) '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@22.15.30) + '@inquirer/type': 3.0.7(@types/node@18.19.130) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 '@inquirer/type@1.5.5': dependencies: mute-stream: 1.0.0 - '@inquirer/type@3.0.7(@types/node@22.15.30)': + '@inquirer/type@3.0.7(@types/node@18.19.130)': optionalDependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 '@isaacs/cliui@8.0.2': dependencies: @@ -5487,9 +5544,9 @@ snapshots: '@leichtgewicht/ip-codec@2.0.5': {} - '@listr2/prompt-adapter-inquirer@2.0.18(@inquirer/prompts@7.3.2(@types/node@22.15.30))': + '@listr2/prompt-adapter-inquirer@2.0.18(@inquirer/prompts@7.3.2(@types/node@18.19.130))': dependencies: - '@inquirer/prompts': 7.3.2(@types/node@22.15.30) + '@inquirer/prompts': 7.3.2(@types/node@18.19.130) '@inquirer/type': 1.5.5 '@lmdb/lmdb-darwin-arm64@3.2.6': @@ -5848,24 +5905,24 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.15.30 + '@types/node': 18.19.130 '@types/bonjour@3.5.13': dependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 5.0.6 - '@types/node': 22.15.30 + '@types/node': 18.19.130 '@types/connect@3.4.38': dependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 '@types/cors@2.8.19': dependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 '@types/eslint-scope@3.7.7': dependencies: @@ -5883,14 +5940,14 @@ snapshots: '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 '@types/express-serve-static-core@5.0.6': dependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 @@ -5906,7 +5963,7 @@ snapshots: '@types/http-proxy@1.17.16': dependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 '@types/jasmine@5.1.8': {} @@ -5916,11 +5973,11 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 - '@types/node@22.15.30': + '@types/node@18.19.130': dependencies: - undici-types: 6.21.0 + undici-types: 5.26.5 '@types/qs@6.14.0': {} @@ -5931,7 +5988,7 @@ snapshots: '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.15.30 + '@types/node': 18.19.130 '@types/serve-index@1.9.4': dependencies: @@ -5940,20 +5997,20 @@ snapshots: '@types/serve-static@1.15.8': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.15.30 + '@types/node': 18.19.130 '@types/send': 0.17.5 '@types/sockjs@0.3.36': dependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 '@types/ws@8.18.1': dependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 - '@vitejs/plugin-basic-ssl@1.2.0(vite@6.2.7(@types/node@22.15.30)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0))': + '@vitejs/plugin-basic-ssl@1.2.0(vite@6.2.7(@types/node@18.19.130)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0))': dependencies: - vite: 6.2.7(@types/node@22.15.30)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0) + vite: 6.2.7(@types/node@18.19.130)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0) '@webassemblyjs/ast@1.14.1': dependencies: @@ -6556,7 +6613,7 @@ snapshots: engine.io@6.6.4: dependencies: '@types/cors': 2.8.19 - '@types/node': 22.15.30 + '@types/node': 18.19.130 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -7158,7 +7215,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -8433,7 +8490,7 @@ snapshots: ua-parser-js@0.7.40: {} - undici-types@6.21.0: {} + undici-types@5.26.5: {} unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -8481,13 +8538,13 @@ snapshots: vary@1.1.2: {} - vite@6.2.7(@types/node@22.15.30)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0): + vite@6.2.7(@types/node@18.19.130)(jiti@1.21.7)(less@4.2.2)(sass@1.85.0)(terser@5.39.0): dependencies: esbuild: 0.25.4 postcss: 8.5.4 rollup: 4.34.8 optionalDependencies: - '@types/node': 22.15.30 + '@types/node': 18.19.130 fsevents: 2.3.3 jiti: 1.21.7 less: 4.2.2 @@ -8660,6 +8717,8 @@ snapshots: ws@8.18.2: {} + xhr2@0.2.1: {} + y18n@5.0.8: {} yallist@3.1.1: {} diff --git a/src/angular/frontend/src/app/app.component.html b/src/angular/frontend/src/app/app.component.html index a6c19d2..7dd570e 100644 --- a/src/angular/frontend/src/app/app.component.html +++ b/src/angular/frontend/src/app/app.component.html @@ -1,2 +1 @@ -logo diff --git a/src/angular/frontend/src/app/app.config.ts b/src/angular/frontend/src/app/app.config.ts index f103d00..9d5e290 100644 --- a/src/angular/frontend/src/app/app.config.ts +++ b/src/angular/frontend/src/app/app.config.ts @@ -4,6 +4,7 @@ import { provideRouter } from '@angular/router'; import { routes } from './app.routes'; import {GandalfClientBaseAPI} from './clients/gandalf/gandalf-client'; import {provideHttpClient} from '@angular/common/http'; +import { provideClientHydration, withEventReplay } from '@angular/platform-browser'; export const appConfig: ApplicationConfig = { providers: [ @@ -13,6 +14,6 @@ export const appConfig: ApplicationConfig = { { provide: GandalfClientBaseAPI, useValue: 'http://localhost:5055' - } + }, provideClientHydration(withEventReplay()) ] }; diff --git a/src/angular/frontend/src/app/app.routes.ts b/src/angular/frontend/src/app/app.routes.ts index 0fc999d..1334bf2 100644 --- a/src/angular/frontend/src/app/app.routes.ts +++ b/src/angular/frontend/src/app/app.routes.ts @@ -2,6 +2,7 @@ import {Routes} from '@angular/router'; import {LoginComponent} from './components/login/login.component'; import {HomeComponent} from './components/home/home.component'; import {authGuard} from './guards/auth.guard'; +import {ShellComponent} from './components/shell/shell.component'; export const routes: Routes = [ { @@ -11,6 +12,7 @@ export const routes: Routes = [ }, { path: '', + component: ShellComponent, children: [ { title: 'Home', diff --git a/src/angular/frontend/src/app/components/home/home.component.html b/src/angular/frontend/src/app/components/home/home.component.html new file mode 100644 index 0000000..5f2c53f --- /dev/null +++ b/src/angular/frontend/src/app/components/home/home.component.html @@ -0,0 +1 @@ +

home works!

diff --git a/src/angular/frontend/src/app/components/home/home.component.scss b/src/angular/frontend/src/app/components/home/home.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/angular/frontend/src/app/components/home/home.component.ts b/src/angular/frontend/src/app/components/home/home.component.ts new file mode 100644 index 0000000..2692e8b --- /dev/null +++ b/src/angular/frontend/src/app/components/home/home.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-home', + imports: [], + templateUrl: './home.component.html', + styleUrl: './home.component.scss', + standalone: true, +}) +export class HomeComponent { + +} diff --git a/src/angular/frontend/src/app/components/login/login.component.ts b/src/angular/frontend/src/app/components/login/login.component.ts index 90e64d4..1ae5019 100644 --- a/src/angular/frontend/src/app/components/login/login.component.ts +++ b/src/angular/frontend/src/app/components/login/login.component.ts @@ -19,7 +19,7 @@ export class LoginComponent { private router = inject(Router); protected loginFormGroup = new FormGroup({ - usernameOrEmail: new FormControl('housemasterr'), + usernameOrEmail: new FormControl('housemaster'), password: new FormControl('kR0pNCspBKx8lOzAIch5'), keep: new FormControl(false), }); diff --git a/src/angular/frontend/src/app/components/panel/panel.component.html b/src/angular/frontend/src/app/components/panel/panel.component.html new file mode 100644 index 0000000..6dbc743 --- /dev/null +++ b/src/angular/frontend/src/app/components/panel/panel.component.html @@ -0,0 +1 @@ + diff --git a/src/angular/frontend/src/app/components/panel/panel.component.scss b/src/angular/frontend/src/app/components/panel/panel.component.scss new file mode 100644 index 0000000..e81d206 --- /dev/null +++ b/src/angular/frontend/src/app/components/panel/panel.component.scss @@ -0,0 +1,15 @@ +:host { + display: flex; + flex-direction: row; + gap: 1rem; + padding: 1rem; + + align-items: center; + + background-color: var(--bg-color); + color: var(--text-color); + + border-radius: 0.5rem; + + margin: 1rem; +} diff --git a/src/angular/frontend/src/app/components/panel/panel.component.spec.ts b/src/angular/frontend/src/app/components/panel/panel.component.spec.ts new file mode 100644 index 0000000..fbdf3b3 --- /dev/null +++ b/src/angular/frontend/src/app/components/panel/panel.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PanelComponent } from './panel.component'; + +describe('PanelComponent', () => { + let component: PanelComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [PanelComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(PanelComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/angular/frontend/src/app/components/panel/panel.component.ts b/src/angular/frontend/src/app/components/panel/panel.component.ts new file mode 100644 index 0000000..c489f58 --- /dev/null +++ b/src/angular/frontend/src/app/components/panel/panel.component.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-panel', + imports: [], + templateUrl: './panel.component.html', + styleUrl: './panel.component.scss' +}) +export class PanelComponent { + +} diff --git a/src/angular/frontend/src/app/components/shell/nav-profile/nav-profile.component.html b/src/angular/frontend/src/app/components/shell/nav-profile/nav-profile.component.html new file mode 100644 index 0000000..e018a3c --- /dev/null +++ b/src/angular/frontend/src/app/components/shell/nav-profile/nav-profile.component.html @@ -0,0 +1 @@ +

nav-profile works!

diff --git a/src/angular/frontend/src/app/components/shell/nav-profile/nav-profile.component.scss b/src/angular/frontend/src/app/components/shell/nav-profile/nav-profile.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/angular/frontend/src/app/components/shell/nav-profile/nav-profile.component.spec.ts b/src/angular/frontend/src/app/components/shell/nav-profile/nav-profile.component.spec.ts new file mode 100644 index 0000000..92416bc --- /dev/null +++ b/src/angular/frontend/src/app/components/shell/nav-profile/nav-profile.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NavProfileComponent } from './nav-profile.component'; + +describe('NavProfileComponent', () => { + let component: NavProfileComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [NavProfileComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(NavProfileComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/angular/frontend/src/app/components/shell/nav-profile/nav-profile.component.ts b/src/angular/frontend/src/app/components/shell/nav-profile/nav-profile.component.ts new file mode 100644 index 0000000..082527e --- /dev/null +++ b/src/angular/frontend/src/app/components/shell/nav-profile/nav-profile.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-nav-profile', + imports: [], + templateUrl: './nav-profile.component.html', + styleUrl: './nav-profile.component.scss', + standalone: true, +}) +export class NavProfileComponent { + +} diff --git a/src/angular/frontend/src/app/components/shell/shell.component.html b/src/angular/frontend/src/app/components/shell/shell.component.html new file mode 100644 index 0000000..d7ad09f --- /dev/null +++ b/src/angular/frontend/src/app/components/shell/shell.component.html @@ -0,0 +1,4 @@ + + + + diff --git a/src/angular/frontend/src/app/components/shell/shell.component.scss b/src/angular/frontend/src/app/components/shell/shell.component.scss new file mode 100644 index 0000000..0b5d436 --- /dev/null +++ b/src/angular/frontend/src/app/components/shell/shell.component.scss @@ -0,0 +1,9 @@ +.shell-nav-bar { + .logo { + height: 3rem; + } + app-nav-profile { + margin-left: auto; + } +} + diff --git a/src/angular/frontend/src/app/components/shell/shell.component.spec.ts b/src/angular/frontend/src/app/components/shell/shell.component.spec.ts new file mode 100644 index 0000000..233b07b --- /dev/null +++ b/src/angular/frontend/src/app/components/shell/shell.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ShellComponent } from './shell.component'; + +describe('ShellComponent', () => { + let component: ShellComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ShellComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ShellComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/angular/frontend/src/app/components/shell/shell.component.ts b/src/angular/frontend/src/app/components/shell/shell.component.ts new file mode 100644 index 0000000..97c3a8d --- /dev/null +++ b/src/angular/frontend/src/app/components/shell/shell.component.ts @@ -0,0 +1,19 @@ +import { Component } from '@angular/core'; +import {NavProfileComponent} from './nav-profile/nav-profile.component'; +import {RouterOutlet} from '@angular/router'; +import {PanelComponent} from '../panel/panel.component'; + +@Component({ + selector: 'app-shell', + imports: [ + NavProfileComponent, + RouterOutlet, + PanelComponent + ], + templateUrl: './shell.component.html', + styleUrl: './shell.component.scss', + standalone: true, +}) +export class ShellComponent { + +} diff --git a/src/angular/frontend/src/app/guards/auth.guard.spec.ts b/src/angular/frontend/src/app/guards/auth.guard.spec.ts new file mode 100644 index 0000000..4ae275e --- /dev/null +++ b/src/angular/frontend/src/app/guards/auth.guard.spec.ts @@ -0,0 +1,17 @@ +import { TestBed } from '@angular/core/testing'; +import { CanActivateFn } from '@angular/router'; + +import { authGuard } from './auth.guard'; + +describe('authGuard', () => { + const executeGuard: CanActivateFn = (...guardParameters) => + TestBed.runInInjectionContext(() => authGuard(...guardParameters)); + + beforeEach(() => { + TestBed.configureTestingModule({}); + }); + + it('should be created', () => { + expect(executeGuard).toBeTruthy(); + }); +}); diff --git a/src/angular/frontend/src/app/guards/auth.guard.ts b/src/angular/frontend/src/app/guards/auth.guard.ts new file mode 100644 index 0000000..8af5e6c --- /dev/null +++ b/src/angular/frontend/src/app/guards/auth.guard.ts @@ -0,0 +1,15 @@ +import {CanActivateFn, MaybeAsync, Router, UrlTree} from '@angular/router'; +import {inject} from '@angular/core'; +import {AuthService} from '../clients/gandalf/mithrandir/auth.service'; +import { map } from 'rxjs'; + +export const authGuard: CanActivateFn = (route, state): MaybeAsync => { + const authService = inject(AuthService); + const router = inject(Router); + return authService.check$().pipe(map(can => { + if (!can) { + return router.parseUrl('/login'); + } + return can; + })) +}; diff --git a/src/angular/frontend/src/color-theme.scss b/src/angular/frontend/src/color-theme.scss new file mode 100644 index 0000000..ef4b219 --- /dev/null +++ b/src/angular/frontend/src/color-theme.scss @@ -0,0 +1,69 @@ +@use 'sass:color'; + +$primary-color: hsl(160, 100%, 50%); +$secondary-color: hsl(270, 100%, 50%); + +$info-color: hsl(180, 60%, 50%); +$success-color: hsl(110, 60%, 50%); +$warn-color: hsl(50, 70%, 50%); +$danger-color: hsl(10, 80%, 50%); + +@mixin set-color-shades($name, $color, $step: 10) { + @for $i from 1 through (100/$step)-1 { + --#{$name}-#{$i * $step}: hsl(#{color.hue($color)}, #{color.saturation($color)}, #{$i * $step}%); + } +} + +@mixin set-neutral-colors($step: 10) { + @for $i from 0 through 100/$step { + --neutral-#{$i * $step}: hsl(0, 0%, #{$i * $step}%); + } +} + +@mixin set-common-colors() { + --primary-color: #{$primary-color}; + --secondary-color: #{$secondary-color}; + --info-color: #{$info-color}; + --success-color: #{$success-color}; + --warn-color: #{$warn-color}; + --danger-color: #{$danger-color}; +} + +@mixin set-color-classes($name, $color, $step: 10, $padded: false) { + $from: if($padded, 0, 1); + $to: if($padded, 100/$step, (100/$step)-1); + + + @for $i from $from through $to { + .#{$name}-#{$i * $step} { + --bg-color: hsl(#{color.hue($color)}, #{color.saturation($color)}, #{$i * $step}%); + --text-color: var(--neutral-10); + } + } +} + +:root { + @include set-neutral-colors(); + @include set-common-colors(); + @include set-color-shades("primary", $primary-color, 10); + @include set-color-shades("secondary", $secondary-color, 10); + + --bg-color: var(--neutral-90); + --text-color: var(--neutral-10); +} + +@media (prefers-color-scheme: dark) { + :root { + --bg-color: var(--neutral-10); + --text-color: var(--neutral-90); + } +} + +@include set-color-classes("primary", $primary-color, 10, true); +@include set-color-classes("secondary", $secondary-color, 10); + + + + + + diff --git a/src/angular/frontend/src/styles.scss b/src/angular/frontend/src/styles.scss index dc07e62..b0b7c10 100644 --- a/src/angular/frontend/src/styles.scss +++ b/src/angular/frontend/src/styles.scss @@ -1,4 +1,5 @@ /* You can add global styles to this file, and also import other style files */ +@use "color-theme"; html, input { font-size: 18px; @@ -11,6 +12,8 @@ html, input { body { margin: 0; + background-color: var(--bg-color); + color: var(--text-color); } #path1 { fill: black; } diff --git a/src/dotnet/.idea/.idea.Suspectus.Gandalf/.idea/copilot.data.migration.agent.xml b/src/dotnet/.idea/.idea.Suspectus.Gandalf/.idea/copilot.data.migration.agent.xml new file mode 100644 index 0000000..4ea72a9 --- /dev/null +++ b/src/dotnet/.idea/.idea.Suspectus.Gandalf/.idea/copilot.data.migration.agent.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/src/dotnet/.idea/.idea.Suspectus.Gandalf/.idea/copilot.data.migration.ask.xml b/src/dotnet/.idea/.idea.Suspectus.Gandalf/.idea/copilot.data.migration.ask.xml new file mode 100644 index 0000000..7ef04e2 --- /dev/null +++ b/src/dotnet/.idea/.idea.Suspectus.Gandalf/.idea/copilot.data.migration.ask.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/src/dotnet/.idea/.idea.Suspectus.Gandalf/.idea/copilot.data.migration.ask2agent.xml b/src/dotnet/.idea/.idea.Suspectus.Gandalf/.idea/copilot.data.migration.ask2agent.xml new file mode 100644 index 0000000..1f2ea11 --- /dev/null +++ b/src/dotnet/.idea/.idea.Suspectus.Gandalf/.idea/copilot.data.migration.ask2agent.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/src/dotnet/.idea/.idea.Suspectus.Gandalf/.idea/copilot.data.migration.edit.xml b/src/dotnet/.idea/.idea.Suspectus.Gandalf/.idea/copilot.data.migration.edit.xml new file mode 100644 index 0000000..8648f94 --- /dev/null +++ b/src/dotnet/.idea/.idea.Suspectus.Gandalf/.idea/copilot.data.migration.edit.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file