From 966418704949febca8b157ee7e768e9c2d375a8f Mon Sep 17 00:00:00 2001 From: Bastian Wagner Date: Sat, 1 Aug 2026 15:45:49 +0200 Subject: [PATCH] altes backend entfenrt --- myteamwallet_frontend/.editorconfig | 16 - myteamwallet_frontend/.gitignore | 49 --- myteamwallet_frontend/.vscode/extensions.json | 4 - myteamwallet_frontend/.vscode/launch.json | 20 - myteamwallet_frontend/.vscode/settings.json | 3 - myteamwallet_frontend/.vscode/tasks.json | 42 -- myteamwallet_frontend/README.md | 27 -- myteamwallet_frontend/angular.json | 135 ------- .../plans/2026-07-31-design-foundation.md | 374 ------------------ myteamwallet_frontend/ngsw-config.json | 29 -- myteamwallet_frontend/package.json | 51 --- .../public/icons/icon-128x128.png | Bin 2875 -> 0 bytes .../public/icons/icon-144x144.png | Bin 3077 -> 0 bytes .../public/icons/icon-152x152.png | Bin 3293 -> 0 bytes .../public/icons/icon-192x192.png | Bin 4306 -> 0 bytes .../public/icons/icon-384x384.png | Bin 11028 -> 0 bytes .../public/icons/icon-512x512.png | Bin 16332 -> 0 bytes .../public/icons/icon-72x72.png | Bin 1995 -> 0 bytes .../public/icons/icon-96x96.png | Bin 2404 -> 0 bytes .../src/app/app.component.html | 2 - .../src/app/app.component.scss | 9 - .../src/app/app.component.spec.ts | 29 -- .../src/app/app.component.ts | 46 --- myteamwallet_frontend/src/app/app.module.ts | 55 --- myteamwallet_frontend/src/app/app.routes.ts | 18 - .../src/app/core/guards/auth.guard.ts | 38 -- .../app/core/interceptor/auth.interceptor.ts | 34 -- .../app/core/translate/translate-loader.ts | 13 - .../src/app/core/user/user.service.spec.ts | 19 - .../src/app/core/user/user.service.ts | 30 -- myteamwallet_frontend/src/app/model/index.ts | 3 - myteamwallet_frontend/src/app/model/player.ts | 16 - .../src/app/model/teamrole.ts | 4 - .../src/app/model/transaction.ts | 9 - myteamwallet_frontend/src/app/model/user.ts | 17 - .../src/app/modules/auth.service.spec.ts | 37 -- .../src/app/modules/auth.service.ts | 117 ------ .../src/app/modules/auth/auth.component.html | 12 - .../src/app/modules/auth/auth.component.scss | 25 -- .../app/modules/auth/auth.component.spec.ts | 27 -- .../src/app/modules/auth/auth.component.ts | 63 --- .../src/app/modules/auth/auth.routes.ts | 18 - .../forgot-password.component.html | 29 -- .../forgot-password.component.scss | 13 - .../forgot-password.component.ts | 56 --- .../auth/login/login-routing.module.ts | 16 - .../modules/auth/login/login.component.html | 31 -- .../modules/auth/login/login.component.scss | 13 - .../auth/login/login.component.spec.ts | 35 -- .../app/modules/auth/login/login.component.ts | 42 -- .../app/modules/auth/login/login.module.ts | 25 -- .../password-change.component.html | 45 --- .../password-change.component.scss | 26 -- .../password-change.component.ts | 65 --- .../no-token-provided.component.html | 9 - .../no-token-provided.component.scss | 0 .../no-token-provided.component.spec.ts | 23 -- .../no-token-provided.component.ts | 10 - .../register-base.component.html | 1 - .../register-base.component.scss | 0 .../register-base.component.spec.ts | 23 -- .../register-base/register-base.component.ts | 10 - .../register-form.component.html | 30 -- .../register-form.component.scss | 5 - .../register-form.component.spec.ts | 23 -- .../register-form/register-form.component.ts | 37 -- .../register/register.component.html | 27 -- .../register/register.component.scss | 12 - .../register/register.component.spec.ts | 23 -- .../components/register/register.component.ts | 85 ---- .../auth/register/register-routing.module.ts | 24 -- .../modules/auth/register/register.module.ts | 35 -- .../home/dashboard/dashboard.component.html | 34 -- .../home/dashboard/dashboard.component.scss | 38 -- .../dashboard/dashboard.component.spec.ts | 25 -- .../home/dashboard/dashboard.component.ts | 60 --- .../home/dashboard/dashboard.routes.ts | 7 - .../player-card/player-card.component.html | 11 - .../player-card/player-card.component.scss | 31 -- .../player-card/player-card.component.spec.ts | 23 -- .../player-card/player-card.component.ts | 27 -- .../player-details.component.html | 9 - .../player-details.component.scss | 10 - .../player-details.component.ts | 59 --- .../team-details/team-details.component.html | 92 ----- .../team-details/team-details.component.scss | 59 --- .../team-details.component.spec.ts | 93 ----- .../team-details/team-details.component.ts | 303 -------------- .../src/app/modules/home/home.component.html | 9 - .../src/app/modules/home/home.component.scss | 18 - .../src/app/modules/home/home.component.ts | 73 ---- .../src/app/modules/home/home.routes.ts | 9 - .../app/modules/teams/model/team-invite.ts | 6 - .../src/app/modules/teams/model/team.ts | 11 - .../overview/details/details.component.html | 48 --- .../overview/details/details.component.scss | 61 --- .../details/details.component.spec.ts | 81 ---- .../overview/details/details.component.ts | 38 -- .../teams/overview/overview-routing.module.ts | 15 - .../teams/overview/overview.component.html | 72 ---- .../teams/overview/overview.component.scss | 41 -- .../teams/overview/overview.component.spec.ts | 40 -- .../teams/overview/overview.component.ts | 100 ----- .../modules/teams/overview/overview.module.ts | 43 -- .../app/modules/teams/teams-routing.module.ts | 19 - .../app/modules/teams/teams.component.html | 12 - .../app/modules/teams/teams.component.scss | 11 - .../app/modules/teams/teams.component.spec.ts | 56 --- .../src/app/modules/teams/teams.component.ts | 41 -- .../src/app/modules/teams/teams.module.ts | 26 -- .../app/modules/teams/teams.service.spec.ts | 19 - .../src/app/modules/teams/teams.service.ts | 61 --- .../player-info-form.component.html | 32 -- .../player-info-form.component.scss | 16 - .../player-info-form.component.spec.ts | 23 -- .../player-info-form.component.ts | 27 -- .../transaction-form.component.html | 36 -- .../transaction-form.component.scss | 28 -- .../transaction-form.component.spec.ts | 23 -- .../transaction-form.component.ts | 71 ---- .../confirm-dialog.component.html | 8 - .../confirm-dialog.component.ts | 33 -- .../create-player.dialog.component.html | 10 - .../create-player.dialog.component.scss | 6 - .../create-player.dialog.component.spec.ts | 23 -- .../create-player.dialog.component.ts | 36 -- .../src/app/shared/dialog/dialog.module.ts | 60 --- .../src/app/shared/dialog/index.ts | 2 - .../model/transaction-type.enum.ts | 8 - .../new-transaction.component.html | 27 -- .../new-transaction.component.scss | 30 -- .../new-transaction.component.spec.ts | 51 --- .../new-transaction.component.ts | 121 ------ .../privileges-info-dialog.component.html | 46 --- .../privileges-info-dialog.component.scss | 9 - .../privileges-info-dialog.component.spec.ts | 23 -- .../privileges-info-dialog.component.ts | 14 - .../show-team-transactions.component.html | 118 ------ .../show-team-transactions.component.scss | 172 -------- .../show-team-transactions.component.spec.ts | 23 -- .../show-team-transactions.component.ts | 137 ------- .../team-transaction-dialog.component.html | 10 - .../team-transaction-dialog.component.scss | 6 - .../team-transaction-dialog.component.spec.ts | 23 -- .../team-transaction-dialog.component.ts | 51 --- myteamwallet_frontend/src/app/shared/index.ts | 1 - .../penalties/model/penalty.interface.ts | 6 - .../shared/penalties/penalties.component.html | 19 - .../shared/penalties/penalties.component.scss | 0 .../penalties/penalties.component.spec.ts | 23 -- .../shared/penalties/penalties.component.ts | 49 --- .../src/app/shared/shared.module.ts | 15 - .../under-construction.component.html | 4 - .../under-construction.component.scss | 8 - .../under-construction.component.spec.ts | 23 -- .../under-construction.component.ts | 10 - myteamwallet_frontend/src/assets/.gitkeep | 0 myteamwallet_frontend/src/assets/favicon.png | Bin 926 -> 0 bytes .../src/assets/screenshots/screen_mobile.png | Bin 118299 -> 0 bytes .../src/assets/screenshots/screen_wide.png | Bin 225454 -> 0 bytes myteamwallet_frontend/src/assets/sports.svg | 84 ---- .../src/environments/environment.dev.ts | 5 - .../src/environments/environment.prod.ts | 5 - .../src/environments/environment.ts | 5 - myteamwallet_frontend/src/favicon.ico | Bin 948 -> 0 bytes myteamwallet_frontend/src/index.html | 19 - myteamwallet_frontend/src/main.ts | 7 - .../src/manifest.webmanifest | 34 -- myteamwallet_frontend/src/styles.scss | 118 ------ myteamwallet_frontend/src/styles/_theme.scss | 16 - myteamwallet_frontend/src/styles/_tokens.scss | 30 -- myteamwallet_frontend/tsconfig.app.json | 14 - myteamwallet_frontend/tsconfig.json | 36 -- myteamwallet_frontend/tsconfig.spec.json | 14 - 174 files changed, 5803 deletions(-) delete mode 100644 myteamwallet_frontend/.editorconfig delete mode 100644 myteamwallet_frontend/.gitignore delete mode 100644 myteamwallet_frontend/.vscode/extensions.json delete mode 100644 myteamwallet_frontend/.vscode/launch.json delete mode 100644 myteamwallet_frontend/.vscode/settings.json delete mode 100644 myteamwallet_frontend/.vscode/tasks.json delete mode 100644 myteamwallet_frontend/README.md delete mode 100644 myteamwallet_frontend/angular.json delete mode 100644 myteamwallet_frontend/docs/superpowers/plans/2026-07-31-design-foundation.md delete mode 100644 myteamwallet_frontend/ngsw-config.json delete mode 100644 myteamwallet_frontend/package.json delete mode 100644 myteamwallet_frontend/public/icons/icon-128x128.png delete mode 100644 myteamwallet_frontend/public/icons/icon-144x144.png delete mode 100644 myteamwallet_frontend/public/icons/icon-152x152.png delete mode 100644 myteamwallet_frontend/public/icons/icon-192x192.png delete mode 100644 myteamwallet_frontend/public/icons/icon-384x384.png delete mode 100644 myteamwallet_frontend/public/icons/icon-512x512.png delete mode 100644 myteamwallet_frontend/public/icons/icon-72x72.png delete mode 100644 myteamwallet_frontend/public/icons/icon-96x96.png delete mode 100644 myteamwallet_frontend/src/app/app.component.html delete mode 100644 myteamwallet_frontend/src/app/app.component.scss delete mode 100644 myteamwallet_frontend/src/app/app.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/app.component.ts delete mode 100644 myteamwallet_frontend/src/app/app.module.ts delete mode 100644 myteamwallet_frontend/src/app/app.routes.ts delete mode 100644 myteamwallet_frontend/src/app/core/guards/auth.guard.ts delete mode 100644 myteamwallet_frontend/src/app/core/interceptor/auth.interceptor.ts delete mode 100644 myteamwallet_frontend/src/app/core/translate/translate-loader.ts delete mode 100644 myteamwallet_frontend/src/app/core/user/user.service.spec.ts delete mode 100644 myteamwallet_frontend/src/app/core/user/user.service.ts delete mode 100644 myteamwallet_frontend/src/app/model/index.ts delete mode 100644 myteamwallet_frontend/src/app/model/player.ts delete mode 100644 myteamwallet_frontend/src/app/model/teamrole.ts delete mode 100644 myteamwallet_frontend/src/app/model/transaction.ts delete mode 100644 myteamwallet_frontend/src/app/model/user.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth.service.spec.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth.service.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth/auth.component.html delete mode 100644 myteamwallet_frontend/src/app/modules/auth/auth.component.scss delete mode 100644 myteamwallet_frontend/src/app/modules/auth/auth.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth/auth.component.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth/auth.routes.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.html delete mode 100644 myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.scss delete mode 100644 myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth/login/login-routing.module.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth/login/login.component.html delete mode 100644 myteamwallet_frontend/src/app/modules/auth/login/login.component.scss delete mode 100644 myteamwallet_frontend/src/app/modules/auth/login/login.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth/login/login.component.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth/login/login.module.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.html delete mode 100644 myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.scss delete mode 100644 myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.html delete mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.scss delete mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.html delete mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.scss delete mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.html delete mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.scss delete mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.html delete mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.scss delete mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth/register/register-routing.module.ts delete mode 100644 myteamwallet_frontend/src/app/modules/auth/register/register.module.ts delete mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.html delete mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.scss delete mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.ts delete mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.routes.ts delete mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.html delete mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.scss delete mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.ts delete mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.html delete mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.scss delete mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.ts delete mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.html delete mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.scss delete mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.ts delete mode 100644 myteamwallet_frontend/src/app/modules/home/home.component.html delete mode 100644 myteamwallet_frontend/src/app/modules/home/home.component.scss delete mode 100644 myteamwallet_frontend/src/app/modules/home/home.component.ts delete mode 100644 myteamwallet_frontend/src/app/modules/home/home.routes.ts delete mode 100644 myteamwallet_frontend/src/app/modules/teams/model/team-invite.ts delete mode 100644 myteamwallet_frontend/src/app/modules/teams/model/team.ts delete mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.html delete mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.scss delete mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.ts delete mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/overview-routing.module.ts delete mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/overview.component.html delete mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/overview.component.scss delete mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/overview.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/overview.component.ts delete mode 100644 myteamwallet_frontend/src/app/modules/teams/overview/overview.module.ts delete mode 100644 myteamwallet_frontend/src/app/modules/teams/teams-routing.module.ts delete mode 100644 myteamwallet_frontend/src/app/modules/teams/teams.component.html delete mode 100644 myteamwallet_frontend/src/app/modules/teams/teams.component.scss delete mode 100644 myteamwallet_frontend/src/app/modules/teams/teams.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/modules/teams/teams.component.ts delete mode 100644 myteamwallet_frontend/src/app/modules/teams/teams.module.ts delete mode 100644 myteamwallet_frontend/src/app/modules/teams/teams.service.spec.ts delete mode 100644 myteamwallet_frontend/src/app/modules/teams/teams.service.ts delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.html delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.scss delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.ts delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.html delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.scss delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.ts delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/confirm-dialog/confirm-dialog.component.html delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/confirm-dialog/confirm-dialog.component.ts delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.html delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.scss delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.ts delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/dialog.module.ts delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/index.ts delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/new-transaction/model/transaction-type.enum.ts delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.html delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.scss delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.ts delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.html delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.scss delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.ts delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.html delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.scss delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.ts delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.html delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.scss delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.ts delete mode 100644 myteamwallet_frontend/src/app/shared/index.ts delete mode 100644 myteamwallet_frontend/src/app/shared/penalties/model/penalty.interface.ts delete mode 100644 myteamwallet_frontend/src/app/shared/penalties/penalties.component.html delete mode 100644 myteamwallet_frontend/src/app/shared/penalties/penalties.component.scss delete mode 100644 myteamwallet_frontend/src/app/shared/penalties/penalties.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/shared/penalties/penalties.component.ts delete mode 100644 myteamwallet_frontend/src/app/shared/shared.module.ts delete mode 100644 myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.html delete mode 100644 myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.scss delete mode 100644 myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.spec.ts delete mode 100644 myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.ts delete mode 100644 myteamwallet_frontend/src/assets/.gitkeep delete mode 100644 myteamwallet_frontend/src/assets/favicon.png delete mode 100644 myteamwallet_frontend/src/assets/screenshots/screen_mobile.png delete mode 100644 myteamwallet_frontend/src/assets/screenshots/screen_wide.png delete mode 100644 myteamwallet_frontend/src/assets/sports.svg delete mode 100644 myteamwallet_frontend/src/environments/environment.dev.ts delete mode 100644 myteamwallet_frontend/src/environments/environment.prod.ts delete mode 100644 myteamwallet_frontend/src/environments/environment.ts delete mode 100644 myteamwallet_frontend/src/favicon.ico delete mode 100644 myteamwallet_frontend/src/index.html delete mode 100644 myteamwallet_frontend/src/main.ts delete mode 100644 myteamwallet_frontend/src/manifest.webmanifest delete mode 100644 myteamwallet_frontend/src/styles.scss delete mode 100644 myteamwallet_frontend/src/styles/_theme.scss delete mode 100644 myteamwallet_frontend/src/styles/_tokens.scss delete mode 100644 myteamwallet_frontend/tsconfig.app.json delete mode 100644 myteamwallet_frontend/tsconfig.json delete mode 100644 myteamwallet_frontend/tsconfig.spec.json diff --git a/myteamwallet_frontend/.editorconfig b/myteamwallet_frontend/.editorconfig deleted file mode 100644 index 59d9a3a..0000000 --- a/myteamwallet_frontend/.editorconfig +++ /dev/null @@ -1,16 +0,0 @@ -# Editor configuration, see https://editorconfig.org -root = true - -[*] -charset = utf-8 -indent_style = space -indent_size = 2 -insert_final_newline = true -trim_trailing_whitespace = true - -[*.ts] -quote_type = single - -[*.md] -max_line_length = off -trim_trailing_whitespace = false diff --git a/myteamwallet_frontend/.gitignore b/myteamwallet_frontend/.gitignore deleted file mode 100644 index 6edc436..0000000 --- a/myteamwallet_frontend/.gitignore +++ /dev/null @@ -1,49 +0,0 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. - -# Compiled output -/dist -/tmp -/out-tsc -/bazel-out - -# Node -/node_modules -npm-debug.log -yarn-error.log - -# IDEs and editors -.idea/ -.project -.classpath -.c9/ -*.launch -.settings/ -*.sublime-workspace - -# Visual Studio Code -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -.history/* - -# Miscellaneous -/.angular/cache -.sass-cache/ -/connect.lock -/coverage -/libpeerconnection.log -testem.log -/typings - -# System files -.DS_Store -Thumbs.db - -# Claude Code worktrees / plan tooling -/.claude -/.superpowers - -# git -package-lock.json diff --git a/myteamwallet_frontend/.vscode/extensions.json b/myteamwallet_frontend/.vscode/extensions.json deleted file mode 100644 index 77b3745..0000000 --- a/myteamwallet_frontend/.vscode/extensions.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 - "recommendations": ["angular.ng-template"] -} diff --git a/myteamwallet_frontend/.vscode/launch.json b/myteamwallet_frontend/.vscode/launch.json deleted file mode 100644 index 740e35a..0000000 --- a/myteamwallet_frontend/.vscode/launch.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "ng serve", - "type": "pwa-chrome", - "request": "launch", - "preLaunchTask": "npm: start", - "url": "http://localhost:4200/" - }, - { - "name": "ng test", - "type": "chrome", - "request": "launch", - "preLaunchTask": "npm: test", - "url": "http://localhost:9876/debug.html" - } - ] -} diff --git a/myteamwallet_frontend/.vscode/settings.json b/myteamwallet_frontend/.vscode/settings.json deleted file mode 100644 index 36c12fd..0000000 --- a/myteamwallet_frontend/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "CodeGPT.apiKey": "CodeGPT Plus Beta" -} \ No newline at end of file diff --git a/myteamwallet_frontend/.vscode/tasks.json b/myteamwallet_frontend/.vscode/tasks.json deleted file mode 100644 index a298b5b..0000000 --- a/myteamwallet_frontend/.vscode/tasks.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 - "version": "2.0.0", - "tasks": [ - { - "type": "npm", - "script": "start", - "isBackground": true, - "problemMatcher": { - "owner": "typescript", - "pattern": "$tsc", - "background": { - "activeOnStart": true, - "beginsPattern": { - "regexp": "(.*?)" - }, - "endsPattern": { - "regexp": "bundle generation complete" - } - } - } - }, - { - "type": "npm", - "script": "test", - "isBackground": true, - "problemMatcher": { - "owner": "typescript", - "pattern": "$tsc", - "background": { - "activeOnStart": true, - "beginsPattern": { - "regexp": "(.*?)" - }, - "endsPattern": { - "regexp": "bundle generation complete" - } - } - } - } - ] -} diff --git a/myteamwallet_frontend/README.md b/myteamwallet_frontend/README.md deleted file mode 100644 index 5d4bb95..0000000 --- a/myteamwallet_frontend/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# MyteamwalletFrontend - -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 15.0.1. - -## Development server - -Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files. - -## Code scaffolding - -Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. - -## Build - -Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. - -## Running unit tests - -Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). - -## Running end-to-end tests - -Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. - -## Further help - -To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. diff --git a/myteamwallet_frontend/angular.json b/myteamwallet_frontend/angular.json deleted file mode 100644 index 944229f..0000000 --- a/myteamwallet_frontend/angular.json +++ /dev/null @@ -1,135 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "newProjectRoot": "projects", - "projects": { - "myteamwallet_frontend": { - "projectType": "application", - "schematics": { - "@schematics/angular:component": { - "style": "scss" - } - }, - "root": "", - "sourceRoot": "src", - "prefix": "app", - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:browser", - "options": { - "outputPath": "dist", - "index": "src/index.html", - "main": "src/main.ts", - "polyfills": [ - "zone.js" - ], - "statsJson": true, - "tsConfig": "tsconfig.app.json", - "inlineStyleLanguage": "scss", - "assets": [ - "src/favicon.ico", - "src/assets", - "src/manifest.webmanifest" - ], - "styles": [ - "src/styles.scss" - ], - "scripts": [], - "serviceWorker": true, - "ngswConfigPath": "ngsw-config.json" - }, - "configurations": { - "production": { - "budgets": [ - { - "type": "initial", - "maximumWarning": "500kb", - "maximumError": "1mb" - }, - { - "type": "anyComponentStyle", - "maximumWarning": "2kb", - "maximumError": "4kb" - } - ], - "outputHashing": "all", - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" - } - ] - }, - "development": { - "buildOptimizer": false, - "optimization": false, - "vendorChunk": true, - "extractLicenses": false, - "sourceMap": true, - "namedChunks": true, - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.dev.ts" - } - ] - }, - "remote": { - "buildOptimizer": false, - "optimization": false, - "vendorChunk": true, - "extractLicenses": false, - "sourceMap": true, - "namedChunks": true, - "fileReplacements": [] - } - }, - "defaultConfiguration": "production" - }, - "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "configurations": { - "production": { - "buildTarget": "myteamwallet_frontend:build:production" - }, - "development": { - "buildTarget": "myteamwallet_frontend:build:development" - }, - "remote": { - "buildTarget": "myteamwallet_frontend:build:remote" - } - }, - "defaultConfiguration": "development" - }, - "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", - "options": { - "buildTarget": "myteamwallet_frontend:build" - } - }, - "test": { - "builder": "@angular-devkit/build-angular:karma", - "options": { - "polyfills": [ - "zone.js", - "zone.js/testing" - ], - "tsConfig": "tsconfig.spec.json", - "inlineStyleLanguage": "scss", - "assets": [ - "src/favicon.ico", - "src/assets" - ], - "styles": [ - "src/styles.scss" - ], - "scripts": [] - } - } - } - } - }, - "cli": { - "analytics": false - } -} diff --git a/myteamwallet_frontend/docs/superpowers/plans/2026-07-31-design-foundation.md b/myteamwallet_frontend/docs/superpowers/plans/2026-07-31-design-foundation.md deleted file mode 100644 index 2c0f415..0000000 --- a/myteamwallet_frontend/docs/superpowers/plans/2026-07-31-design-foundation.md +++ /dev/null @@ -1,374 +0,0 @@ -# Design-System-Fundament Implementation Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Legt die technische und visuelle Basis für das TeamWallet-Redesign: Design-Tokens, ein eigenes Material-3-Theme (fintech-modern, Indigo/Grün), ein konsistentes Icon-System und ein bereinigtes Notification-System — ohne die bestehenden Bildschirme inhaltlich umzubauen (das folgt in Folge-Plänen für Public-Übersicht, Dashboard/Team-Workspace, Auth-Flows). - -**Architecture:** Zwei neue SCSS-Partials (`src/styles/_tokens.scss`, `src/styles/_theme.scss`) werden aus `src/styles.scss` eingebunden. Die Angular-Material-Theming-API (`mat.define-theme`, installiert in `node_modules/@angular/material/core/theming/_definition.scss`) erzeugt das Theme aus vordefinierten M3-Paletten (`mat.$blue-palette` als Primary, `mat.$spring-green-palette` als Tertiary) statt des Stock-Themes `azure-blue`. Reine CSS-Custom-Properties (nicht Sass-Variablen) tragen Spacing/Radius/Elevation/Balance-Farben, damit sie direkt in Komponenten-Templates/-Styles nutzbar sind, auch außerhalb von Sass-Kontext. - -**Tech Stack:** Angular 18.1, Angular Material 18.1 (M3-Theming-API), SCSS, Angular CLI Builder (`@angular-devkit/build-angular:browser`), Karma/Jasmine. - -## Global Constraints - -- Kein Dark Mode in diesem Plan — Tokens müssen aber so benannt/strukturiert sein, dass ein späteres Dark-Theme sie überschreiben kann (semantische Namen, keine rohen Paletten-Referenzen in Komponenten). -- Keine neuen Abhängigkeiten hinzufügen; stattdessen wird die ungenutzte Abhängigkeit `@ngxpert/hot-toast` entfernt. -- Bestehende deutsche UI-Texte bleiben unverändert (i18n-Audit ist ein separater Folge-Plan). -- Nach jedem Task muss `npm run build` (aus `myteamwallet_frontend/`) fehlerfrei durchlaufen. -- Angular Material 18 M3-Theming bietet **keine** Funktion, aus einem beliebigen Hex-Wert eine Palette zu generieren (verifiziert: `_palettes.scss` enthält nur die zwölf vordefinierten Paletten `red/green/blue/yellow/cyan/magenta/orange/chartreuse/spring-green/azure/violet/rose`). Primary/Tertiary werden daher aus diesen vordefinierten Paletten gewählt, nicht aus Wunsch-Hexcodes. - ---- - -### Task 1: Design-Tokens (Spacing, Radius, Elevation, Balance-Farben) - -**Files:** -- Create: `myteamwallet_frontend/src/styles/_tokens.scss` -- Modify: `myteamwallet_frontend/src/styles.scss` - -**Interfaces:** -- Produces: CSS-Custom-Properties auf `:root` — `--tw-space-{1,2,3,4,6,8}`, `--tw-radius-{sm,md,lg}`, `--tw-elevation-{1,2}`, `--tw-balance-positive`, `--tw-balance-negative`, `--tw-balance-neutral`, `--tw-surface-bg`, `--tw-surface-card`. Alle Folge-Tasks/-Pläne referenzieren ausschließlich diese Namen, nie rohe Hex-Werte. - -- [ ] **Step 1: `_tokens.scss` anlegen** - -```scss -// myteamwallet_frontend/src/styles/_tokens.scss -:root { - // Spacing (8px-Grid) - --tw-space-1: 4px; - --tw-space-2: 8px; - --tw-space-3: 12px; - --tw-space-4: 16px; - --tw-space-6: 24px; - --tw-space-8: 32px; - - // Radius - --tw-radius-sm: 8px; - --tw-radius-md: 12px; - --tw-radius-lg: 16px; - - // Elevation (ersetzt die bisher wiederholte box-shadow-Deklaration) - --tw-elevation-1: 0 1px 2px rgba(15, 23, 42, 0.06), 0 1px 3px rgba(15, 23, 42, 0.1); - --tw-elevation-2: 0 2px 4px rgba(15, 23, 42, 0.06), 0 4px 8px rgba(15, 23, 42, 0.1); - - // Semantische Saldo-Farben (fintech-modern: gedämpftes Grün/Rot statt Signalfarben) - --tw-balance-positive: #1b8a5a; - --tw-balance-negative: #c4351c; - --tw-balance-neutral: #64748b; - - // Flächen - --tw-surface-bg: #f7f8fa; - --tw-surface-card: #ffffff; -} -``` - -- [ ] **Step 2: In `styles.scss` einbinden und bestehende Hardcodes ersetzen** - -In `myteamwallet_frontend/src/styles.scss` ganz oben ergänzen: - -```scss -@use './styles/tokens'; -``` - -Danach folgende bestehende Stellen in derselben Datei ersetzen: - -```scss -// vorher: body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; background-color: #fafafa;} -body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; background-color: var(--tw-surface-bg); } -``` - -```scss -// vorher in .card: -// box-shadow: 0 2px 1px -1px #0003, 0 1px 1px #00000024, 0 1px 3px #0000001f; -.card { - padding: var(--tw-space-3); - box-shadow: var(--tw-elevation-1); - margin: var(--tw-space-1); - background-color: var(--tw-surface-card); - border-radius: var(--tw-radius-md); - - &.flat { - background-color: transparent; - box-shadow: none; - outline: #ddd solid 1px; - } -} -``` - -```scss -// vorher: background-color: rgb(148, 16, 16) !important; -.snackbar_error > .mdc-snackbar__surface { - background-color: var(--tw-balance-negative) !important; - - .mat-mdc-snack-bar-label { - color: white !important; - } -} -``` - -- [ ] **Step 3: Build verifizieren** - -Run: `cd myteamwallet_frontend && npm run build` -Expected: Build erfolgreich, keine Sass-/Compile-Fehler. - -- [ ] **Step 4: Commit** - -```bash -git add myteamwallet_frontend/src/styles/_tokens.scss myteamwallet_frontend/src/styles.scss -git commit -m "feat(design): add design tokens and wire into global styles" -``` - ---- - -### Task 2: Eigenes Material-3-Theme statt Stock-Theme - -**Files:** -- Create: `myteamwallet_frontend/src/styles/_theme.scss` -- Modify: `myteamwallet_frontend/src/styles.scss` -- Modify: `myteamwallet_frontend/angular.json:35` (build-Styles), `myteamwallet_frontend/angular.json:125` (test-Styles) -- Modify: `myteamwallet_frontend/src/index.html` - -**Interfaces:** -- Consumes: nichts aus Task 1 direkt (unabhängiges Partial), wird aber in derselben `styles.scss` eingebunden. -- Produces: Sass-Variable `theme.$teamwallet-theme`, die alle Material-Komponentenstyles erzeugt. Spätere Pläne fügen hier bei Bedarf `mat.theme-overrides()` hinzu, ändern aber nicht den Namen `$teamwallet-theme`. - -- [ ] **Step 1: `_theme.scss` anlegen** - -```scss -// myteamwallet_frontend/src/styles/_theme.scss -@use '@angular/material' as mat; - -$teamwallet-theme: mat.define-theme(( - color: ( - theme-type: light, - primary: mat.$blue-palette, - tertiary: mat.$spring-green-palette, - ), - typography: ( - brand-family: 'Inter, Roboto, "Helvetica Neue", sans-serif', - plain-family: 'Inter, Roboto, "Helvetica Neue", sans-serif', - ), - density: ( - scale: 0, - ), -)); -``` - -- [ ] **Step 2: Theme in `styles.scss` einbinden (ersetzt Stock-Theme-Import)** - -Am Anfang von `myteamwallet_frontend/src/styles.scss` ergänzen (vor den bestehenden Regeln): - -```scss -@use '@angular/material' as mat; -@use './styles/theme'; - -@include mat.core(); -@include mat.all-component-themes(theme.$teamwallet-theme); -``` - -- [ ] **Step 3: Stock-Theme aus `angular.json` entfernen** - -In `myteamwallet_frontend/angular.json` im `build`-Target die Zeile entfernen: - -```json -"@angular/material/prebuilt-themes/azure-blue.css", -``` - -Im `test`-Target die Zeile entfernen: - -```json -"@angular/material/prebuilt-themes/cyan-orange.css", -``` - -In beiden Targets bleibt `"src/styles.scss"` als einziger globaler Stylesheet-Eintrag stehen. - -- [ ] **Step 4: Google-Font auf Inter umstellen** - -In `myteamwallet_frontend/src/index.html` die bestehende Roboto-Zeile ersetzen: - -```html - -``` - -- [ ] **Step 5: Build und Tests verifizieren** - -Run: `cd myteamwallet_frontend && npm run build` -Expected: Build erfolgreich, Material-Komponenten (Buttons, Toolbar, Cards) werden aus dem neuen Theme gestylt statt aus `azure-blue.css`. - -Run: `cd myteamwallet_frontend && npm test -- --watch=false` -Expected: Bestehende Karma-Suite läuft weiterhin durch (keine Test-Regression durch den Theme-Wechsel). - -- [ ] **Step 6: Commit** - -```bash -git add myteamwallet_frontend/src/styles/_theme.scss myteamwallet_frontend/src/styles.scss myteamwallet_frontend/angular.json myteamwallet_frontend/src/index.html -git commit -m "feat(design): replace stock Material azure-blue theme with custom M3 theme" -``` - ---- - -### Task 3: Icon-System auf Material Symbols umstellen, PNG-Icon-Klassen entfernen - -**Files:** -- Modify: `myteamwallet_frontend/src/index.html` -- Modify: `myteamwallet_frontend/src/app/app.component.ts` -- Modify: `myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.ts` -- Modify: `myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.html` -- Modify: `myteamwallet_frontend/src/styles.scss` -- Delete: `myteamwallet_frontend/src/assets/edit.png`, `myteamwallet_frontend/src/assets/dashboard.png`, `myteamwallet_frontend/src/assets/tacho.png` - -**Interfaces:** -- Consumes: nichts. -- Produces: ``-basierte Icons überall; keine PNG-Icon-Klassen (`icon`, `icon_edit`, `icon_dashboard`, `icon_tacho`) mehr im Code. Verifiziert: diese Klassen werden ausschließlich in `dashboard.component.html` verwendet (`icon_tacho`, `icon_edit`; `icon_dashboard` ist bereits toter Code). - -- [ ] **Step 1: Material Symbols statt Material Icons laden** - -In `myteamwallet_frontend/src/index.html` die Material-Icons-Zeile ersetzen: - -```html - -``` - -- [ ] **Step 2: Default-Fontset der App auf Material Symbols umstellen** - -In `myteamwallet_frontend/src/app/app.component.ts`: - -```ts -import { Component } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { environment } from './../environments/environment'; -import { SwUpdate } from '@angular/service-worker'; -import { MatIconRegistry } from '@angular/material/icon'; - -@Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'] -}) -export class AppComponent { - version = environment.appVersion; - - constructor(translate: TranslateService, updates: SwUpdate, iconRegistry: MatIconRegistry) { - iconRegistry.setDefaultFontSetClass('material-symbols-outlined'); - translate.setDefaultLang('de'); - translate.use('de'); - this.update(updates); - } - // ... rest unverändert -``` - -(Restlichen Methodenkörper `update()` unverändert lassen.) - -- [ ] **Step 3: Dashboard-Icons auf `mat-icon` umstellen** - -In `myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.ts` `MatIconModule` importieren: - -```ts -import { MatIconModule } from '@angular/material/icon'; -// ... -@Component({ - selector: 'app-dashboard', - templateUrl: './dashboard.component.html', - styleUrls: ['./dashboard.component.scss'], - standalone: true, - imports: [ CommonModule, TranslateModule, MatButtonModule, MatIconModule ] -}) -``` - -In `myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.html` ersetzen: - -```html - -
-
-
-
-``` - -```html - -
- - -
-``` - -- [ ] **Step 4: Tote Icon-Klassen aus `styles.scss` entfernen** - -In `myteamwallet_frontend/src/styles.scss` den gesamten Block entfernen: - -```scss -.icon { ... } -.icon_edit { ... } -.icon_dashboard { ... } -.icon_tacho { ... } -``` - -(Alle vier Regeln inkl. der `.icon:hover`-Verschachtelung löschen — keine andere Datei referenziert diese Klassen mehr.) - -- [ ] **Step 5: Ungenutzte PNG-Assets löschen** - -```bash -git rm myteamwallet_frontend/src/assets/edit.png myteamwallet_frontend/src/assets/dashboard.png myteamwallet_frontend/src/assets/tacho.png -``` - -- [ ] **Step 6: Build verifizieren und visuell prüfen** - -Run: `cd myteamwallet_frontend && npm run build` -Expected: Build erfolgreich, keine fehlenden Asset-Referenzen. - -Run: `cd myteamwallet_frontend && npm start`, Dashboard im Browser öffnen (`http://localhost:4200/dashboard`, eingeloggt). -Expected: Statt der beiden PNG-Icons erscheinen die Material-Symbols-Icons „speed“ und „edit“, klickbar wie zuvor. - -- [ ] **Step 7: Commit** - -```bash -git add myteamwallet_frontend/src/index.html myteamwallet_frontend/src/app/app.component.ts myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.ts myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.html myteamwallet_frontend/src/styles.scss -git commit -m "feat(design): migrate to Material Symbols, remove PNG icon classes" -``` - ---- - -### Task 4: Notification-System bereinigen - -**Files:** -- Modify: `myteamwallet_frontend/package.json` - -**Interfaces:** -- Consumes: `--tw-balance-negative`-Token aus Task 1 (bereits in `.snackbar_error` verdrahtet). -- Produces: keine neuen Symbole — reine Bereinigung. - -Verifiziert: `@ngxpert/hot-toast` ist in `package.json` als Abhängigkeit deklariert, wird aber im gesamten `src/`-Verzeichnis nirgends importiert (`HotToastService`/`@ngxpert/hot-toast` liefert null Treffer). Es gibt also kein zweites, konkurrierendes Toast-System im Code — nur eine tote Abhängigkeit. Die tatsächliche Benachrichtigung läuft ausschließlich über `MatSnackBar` (3 Aufrufstellen, alle in `team-details.component.ts`), deren Fehler-Variante bereits in Task 1 auf den neuen Token umgestellt wurde. - -- [ ] **Step 1: Ungenutzte Abhängigkeit entfernen** - -In `myteamwallet_frontend/package.json` die Zeile aus `dependencies` entfernen: - -```json -"@ngxpert/hot-toast": "3.0.0", -``` - -- [ ] **Step 2: Lockfile aktualisieren** - -Run: `cd myteamwallet_frontend && npm install` -Expected: `package-lock.json` aktualisiert sich, `@ngxpert/hot-toast` verschwindet aus dem Dependency-Baum, keine anderen Pakete werden unerwartet verändert. - -- [ ] **Step 3: Build verifizieren** - -Run: `cd myteamwallet_frontend && npm run build` -Expected: Build weiterhin erfolgreich (bestätigt, dass das Paket wirklich ungenutzt war). - -- [ ] **Step 4: Commit** - -```bash -git add myteamwallet_frontend/package.json myteamwallet_frontend/package-lock.json -git commit -m "chore(deps): remove unused @ngxpert/hot-toast dependency" -``` - ---- - -## Hinweis für Folge-Pläne - -Die Wrapper-Komponenten-Bibliothek (`BalanceDisplay`, `PageHeader`, `SectionCard`, `EmptyState`, `StatTile` aus dem Gesamtplan) wird bewusst **nicht** in diesem Fundament-Plan gebaut, sondern erst in dem Folge-Plan, der ihren ersten echten Verwendungsort umbaut (Public-Team-Übersicht bzw. Dashboard/Team-Workspace) — YAGNI: eine Komponenten-Bibliothek ohne Konsumenten lässt sich nicht sinnvoll gegen echte Anforderungen entwerfen. Dieser Fundament-Plan liefert die Basis (Tokens, Theme, Icons, saubere Notifications), auf der diese Komponenten aufbauen. diff --git a/myteamwallet_frontend/ngsw-config.json b/myteamwallet_frontend/ngsw-config.json deleted file mode 100644 index 6c8ccf4..0000000 --- a/myteamwallet_frontend/ngsw-config.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "./node_modules/@angular/service-worker/config/schema.json", - "index": "/index.html", - "assetGroups": [ - { - "name": "app", - "installMode": "prefetch", - "resources": { - "files": [ - "/favicon.ico", - "/index.html", - "/manifest.webmanifest", - "/*.css", - "/*.js" - ] - } - }, - { - "name": "assets", - "installMode": "lazy", - "updateMode": "prefetch", - "resources": { - "files": [ - "/**/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)" - ] - } - } - ] -} diff --git a/myteamwallet_frontend/package.json b/myteamwallet_frontend/package.json deleted file mode 100644 index 19e58f8..0000000 --- a/myteamwallet_frontend/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "myteamwallet-frontend", - "version": "1.0.49", - "scripts": { - "ng": "ng", - "start": "ng serve", - "start:remote": "ng serve --configuration=remote", - "build": "ng build", - "watch": "ng build --watch --configuration development", - "test": "ng test", - "patch": "npm --no-git-tag-version version patch", - "post_patch": "git add package.json" - }, - "pre-commit": [ - "patch", - "post_patch" - ], - "private": true, - "dependencies": { - "@angular/animations": "^18.1.4", - "@angular/cdk": "^18.1.4", - "@angular/common": "^18.1.4", - "@angular/compiler": "^18.1.4", - "@angular/core": "^18.1.4", - "@angular/forms": "^18.1.4", - "@angular/material": "^18.1.4", - "@angular/platform-browser": "^18.1.4", - "@angular/platform-browser-dynamic": "^18.1.4", - "@angular/router": "^18.1.4", - "@angular/service-worker": "^18.1.4", - "@ngx-translate/core": "^15.0.0", - "@ngx-translate/http-loader": "^8.0.0", - "rxjs": "~7.5.0", - "tslib": "^2.3.0", - "zone.js": "~0.14.8" - }, - "devDependencies": { - "@angular-devkit/build-angular": "^18.1.4", - "@angular/cli": "~18.1.4", - "@angular/compiler-cli": "^18.1.4", - "@types/jasmine": "~4.3.0", - "jasmine-core": "~4.5.0", - "karma": "~6.4.0", - "karma-chrome-launcher": "~3.1.0", - "karma-coverage": "~2.2.0", - "karma-jasmine": "~5.1.0", - "karma-jasmine-html-reporter": "~2.0.0", - "pre-commit": "^1.2.2", - "typescript": "~5.4.5" - } -} diff --git a/myteamwallet_frontend/public/icons/icon-128x128.png b/myteamwallet_frontend/public/icons/icon-128x128.png deleted file mode 100644 index 5a9a2ccdb34a97a06510d04238d8bedd8e063d3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2875 zcmV-B3&iw^P)C0008_P)t-s0002& z9EbENqopD5@(y0~Ac4&(;F%uw?h$_L3~Rb4@Sh>}?lk4{A#>dpkIgIViW&F%F}(B? zSI#Ko-665>9e3aedGj;V?;nisG~&uE@!BTIsUYpu3W?t$vbrbqDfEpQ^!YHm_Aa;gF0b?~uc09I z!6@*Z9PFwe>h&?n^Do8tFSGY8s`V$5^d*JzB6;ctX7dkLr6Tu{8S%y`?!PDQwIuHI zG}-qu&Gjz3^)0gF9GvO`U-Af9wkP=YGu8Mox6~cC-WHeT8kFq^VeSQ7pd$H{9rwE@ z^R6WGnH}=FCGPPu)!7}c<`|6C27>GXTJ{A?_X0(q9`Ugw@3JB4_A}9$9`~Ie_028v zsUh&KA?~Ce?YSiC@-WNzGRX5SyWSqE_XkL&Ao78}srm!1FA&+8?yi8L-$IsNNZ!*cF`K19I{qap3}Nq#fz+G~(JL z!P+6a-yEdb8KUVJhTtKu(-ot_2%X3WmCFZ_&e$%S$i%~zlzw4hAp7y}?dj;} z;oslf&(FWMvapSBK>PRh^78TU@9*#G&&RT;Pv0?%000M;NklCo2*8x$)93d|qJeXTx^d$M0)Q>! z`}gm+Z3_jCwE9nlIR1gl2~@VekbuzjA)EV~9n0jEwSjjVL?>tH5fm?t5C(&5zrOR?_VJ?7V~TQ{0Iz+3_W zb_+sEP%7frfcpA;EQkuAUq316*s)`^YQym#2}CZyR8GO9!ILIUA^=7JIlrD70Fwf0 zI3@wHK(Qo~L@TuU_3In+)c|w*X&D4+_ij**=C4>G0QIrhM;cvggf(4br>37G5&sHX~uF=B)S^zYw)8g-UR2^NZj^ARvv z%wJ{zx^xMs@(~z8;douJckf;Vqz4P7+qLT(Ks^HZ1%)I)ClCOO1(wQ&g2|I7Z^Zcm z&{fXw0xAs{Fkr+0A($=+5)hxc+sq3-@~&OG1YqMbtbNz6UF(hSq70y>%le-aA%M9! zQY7XF4M2jf*m!lo$dM#45JZT|T>SAP_et{D0L`}mz{oHV(+O^70UtjyEATZp(A5Ae zRt8Yjg@6?70usOYn3!F`rcF41#|{Iqc(EEFcJta;a4guI{8PG^%5`38JD&M>J_WXGQa36$d8eqeqty>YWMGX+X zabqG#M8#V~QmMsB5C3j=YM5Jae^AUhm0)Rya=Bqq( z=ye^iWy=;{P)Y)%qH!Z&dbw}kzI&^50Wb}{?g;?3M#&_BTR@DLLa=WY5`-WIw*n17 z^OvXt%z!ECOHF_wASy5kz>p0amM^ye=wvo3Eqe#B+qX>tFa^GTeTV>{V2MQl6`uQK z&X_Ud_H7}!h=2@oB!0cR`&G6C0W(GhGucKPz@0ASHaeBz7@dLt5*YotwpvBaDlD)wF(FWHW$|-ASBpa5Nm*7V0)!40K(7$ zY+pfKP|g2UaG<^cL0te26cD_5`{P3T`=&s8VMS3y@#4kv0jJ8+(&(gUAvSjG*ki|@ zKY#Y@-Mgb}o;-g2=;5of;7~4ezDY0z2tWY>9=O1nvW(MfIjiL?>}!F!g7V-*kUb&%yArH#n*h9d^XAQ)H*f!U ZUjT_fSx^~10a*Y5002ovPDHLkV1ljCVV(d0 diff --git a/myteamwallet_frontend/public/icons/icon-144x144.png b/myteamwallet_frontend/public/icons/icon-144x144.png deleted file mode 100644 index 11702cd7bd67cee3c26172d0b69968b568c210e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3077 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 diff --git a/myteamwallet_frontend/public/icons/icon-384x384.png b/myteamwallet_frontend/public/icons/icon-384x384.png deleted file mode 100644 index 613ac793e063b1da8d0dc36dcbd1cc0ae620291d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11028 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 diff --git a/myteamwallet_frontend/public/icons/icon-72x72.png b/myteamwallet_frontend/public/icons/icon-72x72.png deleted file mode 100644 index 033724e15f5485c4d86af398a68ca293e6116f72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1995 zcmV;+2Q>JJP)291V+*= z^06lJ@iNwq8T9WTgUAk`+9JF2BZb^3%m;Ym7q0XGMcgOF zo*(n@GuZeu%=Iw5@*;!h3u5#YR+k?7ogMGqEYs})RJtkn_%qPMDD2W6x#A(I$Sm}o zA^G<$pUy4t>@(lADEhM@>G?Ft@+z(JAaC^$NSYe!pBv}r0bck9LaiqJxheViGtbl@ zy}}5d^Cy_k1%~qyQ1%W*(l7GuH0Hbrq4E(+ix>0pA#9i%>7pLz?J&~A37p9UhRiMW z^fTl6FSzm!Tkir^@&Zxx15Nb|N%sguuqOGsDE7%K^7t~w^AA?`3QY9^NuwkBv?uuV zG0F8Uv-A#5_yj_%CHkKs`M)Xk%`NiuGuQbt!SpV^`7ylqF1h$Fukg`I;a1 zlpOZND)p%%^`9X1u_g4sDDk2n@w_GM^fJx(Gt1j0#_}w=_%FED8maawpV}9m^e340 zCzSOkk@O{s+XQy!2W;&KW9tH5?E+f#4^s6BQK%*Rr6TsMBlMRX^t&hWogMPTDe<@_ z@tGX(wIuJjBX;8kfijmgE?a^d*MW27~eIY}!0%!3FTBIQJjv4c+A@Ig2@4+YSr628< z8ttMT>hd((@i5NuF2&pw9<Kg+s;a1{rKNOoa8*@RRaI3rE*=;6@9*Q|U3Qy|k;Vs;a80s;a80s*R0^h=hc4RaI3vEiEf^xaC#=00bjRL_t(o!|l{%P*hPA z!0{_EF$B`*s`{HM-~hB}QNAp^;Xci8 z+_(->TwGk{EjUgHNt^X9W%!s*`}Xa-0n+tr*RIvcye~Gx*U4!SKvJnm2LorB8XFsf zw0G}bl!!>azD~P$3yz7&^y%VC{>rANC>hV43sPXE^FB3cVSfE={Y!i5WKlgv$63T@c1;pWYo2vrh?3j6svI9y!2)?^Jr=Nb`_4jedu z5>i1yK?TL3LVh+j7XjL}W(_#!h*%aDK$)2>!Gho*#z_LS3n428WNrbOL1@)uLHTSh zU%IplAuB7ZIpUDHxy3xlY(J#CXwrn}WOMoQrS|9mOdb4jgU+fdI~ADRDRugEnC}KM5j_8V%GckSliprk%>dg zp^ccLGc^wm);pZ1hc@gDD;JGV6^qPe+k5~@y3RjQDLgm`LH?dsLXd-ecC zSdiOcXcIN8o}yAEhKBZ~hFWMF3p#=wKHQ%gwn|A+B_@Wpq)!6K(UA!q6*@xA3c9-9 zzI{76IkXTp4hVSf=y+i}19|~{`BI;nrK?f0OHN9n#-jjoW2mMx#-y!%?b1ExN}#UtmI8FnW}c;jYoVI&>)9?$#}O6YKB1 zoduQMvL#aQpok22_vg<+diG53q;CG})|FvExg#SZi_&yNM8t2Y9JLw=P#zZK;o(6~ zjIdn4qIdr59vOh@lPp);0QB}P;m8m~xO$YAu_)4o4=TfiM({zynGoTO1vTV_8j=6n zL~Scqo;>;B#EGvjU#{5v?d~0Zr@_pbGZFIoEv>k}`OV!i+z>dJrI!~_AbGxnliu*3 zRPc<@SxZPOy*myky}nb36B;;Q=qzMuIqCGNtq(jwf|L4jLV(QDc6RdQNhm$^gpYSTjcV2; dIpy?!`T;k-MF8k)@eTk0002ovPDHLkV1mgk?e+iw diff --git a/myteamwallet_frontend/public/icons/icon-96x96.png b/myteamwallet_frontend/public/icons/icon-96x96.png deleted file mode 100644 index 3090dc2d8f93429535c667e616e367c010d941ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2404 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 W@LC!C(#4Aa0000{{version}} - \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/app.component.scss b/myteamwallet_frontend/src/app/app.component.scss deleted file mode 100644 index 41cc31a..0000000 --- a/myteamwallet_frontend/src/app/app.component.scss +++ /dev/null @@ -1,9 +0,0 @@ -.app_version{ - position: absolute; - left: 0px; - bottom: 0px; - font-size: 0.6rem; - line-height: 0.6rem; - color: rgb(190, 190, 190); - pointer-events: none; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/app.component.spec.ts b/myteamwallet_frontend/src/app/app.component.spec.ts deleted file mode 100644 index a49cddf..0000000 --- a/myteamwallet_frontend/src/app/app.component.spec.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { AppComponent } from './app.component'; - -describe('AppComponent', () => { - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - RouterTestingModule - ], - declarations: [ - AppComponent - ], - }).compileComponents(); - }); - - it('should create the app', () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app).toBeTruthy(); - }); - - it(`should have as title 'myteamwallet_frontend'`, () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app.title).toEqual('myteamwallet_frontend'); - }); - -}); diff --git a/myteamwallet_frontend/src/app/app.component.ts b/myteamwallet_frontend/src/app/app.component.ts deleted file mode 100644 index 674426f..0000000 --- a/myteamwallet_frontend/src/app/app.component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Component } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; -import { environment } from './../environments/environment'; -import { SwUpdate } from '@angular/service-worker'; -import { MatIconRegistry } from '@angular/material/icon'; - -@Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'] -}) -export class AppComponent { - version = environment.appVersion; - - constructor(translate: TranslateService, updates: SwUpdate, iconRegistry: MatIconRegistry) { - iconRegistry.setDefaultFontSetClass('material-symbols-outlined'); - translate.setDefaultLang('de'); - translate.use('de'); - this.update(updates); - } - - update(updates: SwUpdate) { - console.log("Checking for updates: ", updates.isEnabled); - if (!updates.isEnabled) { return; } - - updates.versionUpdates.subscribe(evt => { - - switch (evt.type) { - case 'VERSION_DETECTED': - console.log(`Downloading new app version: ${evt.version.hash}`); - break; - case 'VERSION_READY': - console.log(`Current app version: ${evt.currentVersion.hash}`); - console.log(`New app version ready for use: ${evt.latestVersion.hash}`); - window.location.reload(); - break; - case 'VERSION_INSTALLATION_FAILED': - console.log(`Failed to install app version '${evt.version.hash}': ${evt.error}`); - break; - case 'NO_NEW_VERSION_DETECTED': - break; - default: - } - }); - } -} diff --git a/myteamwallet_frontend/src/app/app.module.ts b/myteamwallet_frontend/src/app/app.module.ts deleted file mode 100644 index 25d6efa..0000000 --- a/myteamwallet_frontend/src/app/app.module.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; - -import { AppComponent } from './app.component'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; - -import { LOCALE_ID, isDevMode} from '@angular/core'; -import localeDe from '@angular/common/locales/de'; -import localeDeExtra from '@angular/common/locales/extra/de'; -import { registerLocaleData } from '@angular/common'; -import { HttpClient, HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; -import { AuthInterceptorService } from './core/interceptor/auth.interceptor'; -import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { CustomTranslateLoader } from './core/translate/translate-loader'; -import { provideRouter, RouterModule } from '@angular/router'; -import { routes } from './app.routes'; -import { ServiceWorkerModule } from '@angular/service-worker'; -registerLocaleData(localeDe, localeDeExtra); - -@NgModule({ - declarations: [ - AppComponent - ], - imports: [ - BrowserModule, - RouterModule, - BrowserAnimationsModule, - HttpClientModule, - TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useClass: CustomTranslateLoader, - deps: [HttpClient], - }, - defaultLanguage: 'de', - }), - ServiceWorkerModule.register('ngsw-worker.js', { - enabled: !isDevMode(), - // Register the ServiceWorker as soon as the application is stable - // or after 30 seconds (whichever comes first). - registrationStrategy: 'registerWhenStable:30000' - }), - ], - providers: [ - { provide: LOCALE_ID, useValue: 'de' }, - { - provide: HTTP_INTERCEPTORS, - useClass: AuthInterceptorService, - multi: true - }, - provideRouter(routes) - ], - bootstrap: [AppComponent] -}) -export class AppModule { } diff --git a/myteamwallet_frontend/src/app/app.routes.ts b/myteamwallet_frontend/src/app/app.routes.ts deleted file mode 100644 index 7926ec3..0000000 --- a/myteamwallet_frontend/src/app/app.routes.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Routes } from '@angular/router'; -import { homeRoutes } from './modules/home/home.routes'; -import { authRoutes } from './modules/auth/auth.routes'; - -export const routes: Routes = [ - { - path: '', children: homeRoutes - }, - { - path: 'auth', children: authRoutes - }, - { - path: 'password-change/:hash', loadComponent: () => import('./modules/auth/password-change/password-change.component').then(m => m.PasswordChangeComponent) - }, - { - path: 'teams', loadChildren: () => import('./modules/teams/teams.module').then(m => m.TeamsModule) - } -]; diff --git a/myteamwallet_frontend/src/app/core/guards/auth.guard.ts b/myteamwallet_frontend/src/app/core/guards/auth.guard.ts deleted file mode 100644 index ffb61aa..0000000 --- a/myteamwallet_frontend/src/app/core/guards/auth.guard.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRoute, ActivatedRouteSnapshot, Route, Router, RouterStateSnapshot, UrlSegment, UrlTree } from '@angular/router'; -import { Observable } from 'rxjs'; -import { AuthService } from 'src/app/modules/auth.service'; - - -@Injectable({ - providedIn: 'root' -}) -export class AuthGuard { - constructor(private router: Router, private activatedRoute: ActivatedRoute, private authService: AuthService) {} - - private async check(): Promise { - console.log("checking") - if (this.authService.isLoggedIn()) { return true; } - const success = await this.authService.loginFromLocalStorage(); - if (success) { - return true; - } - - this.router.navigate(['/auth']).then(); - return false; - } - - canActivate( - route: ActivatedRouteSnapshot, - state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { - return this.check(); - } - canActivateChild( - childRoute: ActivatedRouteSnapshot, - state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { - return this.check(); - } - canLoad(): Observable | Promise | boolean | UrlTree { - return this.check(); - } -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/core/interceptor/auth.interceptor.ts b/myteamwallet_frontend/src/app/core/interceptor/auth.interceptor.ts deleted file mode 100644 index a51f2f7..0000000 --- a/myteamwallet_frontend/src/app/core/interceptor/auth.interceptor.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpErrorResponse } from '@angular/common/http'; -import { Injectable } from '@angular/core'; -import { MatSnackBar } from '@angular/material/snack-bar'; -import { Observable, catchError, throwError } from 'rxjs'; -import { AuthService } from 'src/app/modules/auth.service'; - -@Injectable({ - providedIn: 'root' -}) -export class AuthInterceptorService implements HttpInterceptor { - constructor(private authService: AuthService, private snackBar: MatSnackBar) {} - intercept(request: HttpRequest, next: HttpHandler): Observable> { - const token = this.authService.getAuthToken(); - - if (token) { - // If we have a token, we set it to the header - request = request.clone({ - setHeaders: {Authorization: `Bearer ${token}`} - }); - } - - return next.handle(request).pipe( - catchError((err) => { - if (err instanceof HttpErrorResponse) { - if (err.status === 401 && this.authService.isLoggedIn()) { - this.snackBar.open('Sitzung abgelaufen, bitte erneut anmelden', undefined, { duration: 5000 }); - this.authService.logout(); - } - } - return throwError(err); - }) - ) - } -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/core/translate/translate-loader.ts b/myteamwallet_frontend/src/app/core/translate/translate-loader.ts deleted file mode 100644 index d2eae50..0000000 --- a/myteamwallet_frontend/src/app/core/translate/translate-loader.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { HttpClient } from '@angular/common/http'; -import { TranslateLoader } from '@ngx-translate/core'; -import { Observable } from 'rxjs'; - -import { environment } from '../../../environments/environment'; - -export class CustomTranslateLoader implements TranslateLoader { - constructor(private http: HttpClient) {} - - getTranslation(lang: string): Observable { - return this.http.get(`${environment.apiUrl}translations/${lang}`); - } -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/core/user/user.service.spec.ts b/myteamwallet_frontend/src/app/core/user/user.service.spec.ts deleted file mode 100644 index 7c7ef51..0000000 --- a/myteamwallet_frontend/src/app/core/user/user.service.spec.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { HttpClientModule } from '@angular/common/http'; -import { TestBed } from '@angular/core/testing'; - -import { UserService } from './user.service'; - -describe('UserService', () => { - let service: UserService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ HttpClientModule ] - }); - service = TestBed.inject(UserService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/myteamwallet_frontend/src/app/core/user/user.service.ts b/myteamwallet_frontend/src/app/core/user/user.service.ts deleted file mode 100644 index fd3750d..0000000 --- a/myteamwallet_frontend/src/app/core/user/user.service.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { HttpClient } from '@angular/common/http'; -import { Injectable } from '@angular/core'; -import { MatSnackBar } from '@angular/material/snack-bar'; -import { AuthService } from 'src/app/modules/auth.service'; -import { environment } from 'src/environments/environment'; - -@Injectable({ - providedIn: 'root' -}) -export class UserService { - - players: any[] = []; - - constructor(private http: HttpClient, private authService: AuthService, private snackBar: MatSnackBar) { } - - - loadTeamsOfUser() { - this.http.get(`${environment.apiUrl}users/${this.authService.user.id}/teams`).subscribe({ - next: data => { this.players = data as any[]; }, - error: () => { this.onUserLoadFailure(); } - }) - } - - onUserLoadFailure() { - this.snackBar.open('Teams konnten nicht geladen werden', undefined, { - duration: 5000, - panelClass: 'snackbar_error' - }) - } -} diff --git a/myteamwallet_frontend/src/app/model/index.ts b/myteamwallet_frontend/src/app/model/index.ts deleted file mode 100644 index 2736192..0000000 --- a/myteamwallet_frontend/src/app/model/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './player'; -export * from './teamrole'; -export * from './transaction'; \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/model/player.ts b/myteamwallet_frontend/src/app/model/player.ts deleted file mode 100644 index ef02bf2..0000000 --- a/myteamwallet_frontend/src/app/model/player.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Team } from '../modules/teams/model/team'; -import { TeamRole } from './teamrole'; - -export interface Player { - firstName: string; - lastName: string; - id: number; - balance: number; - team: Team; - teamRole: TeamRole; - active: boolean; - - hide: boolean; - - usersPlayer?: boolean; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/model/teamrole.ts b/myteamwallet_frontend/src/app/model/teamrole.ts deleted file mode 100644 index 681ffa1..0000000 --- a/myteamwallet_frontend/src/app/model/teamrole.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface TeamRole { - id: number; - name: string; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/model/transaction.ts b/myteamwallet_frontend/src/app/model/transaction.ts deleted file mode 100644 index 7d97e32..0000000 --- a/myteamwallet_frontend/src/app/model/transaction.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface Transaction { - id: number; - amount: number; - playerName?: string; - date: string; - type: string; - note: string; - isTeamWalletTransaction: boolean; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/model/user.ts b/myteamwallet_frontend/src/app/model/user.ts deleted file mode 100644 index a1e5d4e..0000000 --- a/myteamwallet_frontend/src/app/model/user.ts +++ /dev/null @@ -1,17 +0,0 @@ -export interface User { - createdAt: string; - deletedAt: string; - email: string; - firstName: string; - lastName: string; - id: number; - photo: string; - role: Role; - status: any; - updatedAt: string; -} - -export interface Role { - id: number; - name: string; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/auth.service.spec.ts b/myteamwallet_frontend/src/app/modules/auth.service.spec.ts deleted file mode 100644 index 38fde55..0000000 --- a/myteamwallet_frontend/src/app/modules/auth.service.spec.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { HttpClient } from '@angular/common/http'; -import { TestBed } from '@angular/core/testing'; -import { of } from 'rxjs'; - -import { AuthService } from './auth.service'; - -describe('AuthService', () => { - let service: AuthService; - const mockHttp = jasmine.createSpyObj('HttpClient', ['post']); - mockHttp.post.and.returnValue(of({ - token: 'token', - user: {id: 1, email: 'mail', firstName: 'first', lastName: 'last'} - })) - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [], - providers: [{ provide: HttpClient, useValue: mockHttp }] - }); - service = TestBed.inject(AuthService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); - - it('should log in', async () => { - expect(service['authInfoSubject'].value).toBeNull(); - const success = await service.login('mail', 'passwort123'); - expect(success).toBeTrue(); - expect(service['authInfoSubject'].value).not.toBeNull(); - expect(service['authInfoSubject'].value.id).toBe(1); - expect(service['authInfoSubject'].value.email).toEqual('mail'); - expect(service['authInfoSubject'].value.firstName).toEqual('first'); - expect(service['authInfoSubject'].value.lastName).toEqual('last'); - }) -}); diff --git a/myteamwallet_frontend/src/app/modules/auth.service.ts b/myteamwallet_frontend/src/app/modules/auth.service.ts deleted file mode 100644 index 1f699b5..0000000 --- a/myteamwallet_frontend/src/app/modules/auth.service.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { HttpClient } from '@angular/common/http'; -import { Injectable } from '@angular/core'; -import { Router } from '@angular/router'; -import { BehaviorSubject, Observable } from 'rxjs'; -import { environment } from 'src/environments/environment'; -import { User } from '../model/user'; - -@Injectable({ - providedIn: 'root' -}) -export class AuthService { - - private authInfoSubject: BehaviorSubject = new BehaviorSubject(null as any); - authInfo$: Observable = this.authInfoSubject.asObservable(); - - private token: string = ''; - - constructor(private http: HttpClient, private router: Router) { - } - - get isAdmin(): boolean { - return this.user != null && this.user.role != null && this.user.role.id == 1; - } - - isLoggedIn(): boolean { - return this.authInfoSubject.value != null; - } - - get user(): User { - return this.authInfoSubject.value; - } - - public async login(email: string, password: string): Promise { - return new Promise(resolve => { - this.http.post(`${environment.apiUrl}auth/email/login`, { email, password }).subscribe((result: any) => { - localStorage.setItem('accessToken', window.btoa(result['token'])); - this.authInfoSubject.next(result['user']); - this.token = result['token']; - resolve(true); - }, error => { - this.http.post(`${environment.apiUrl}auth/admin/email/login`, { email, password }).subscribe((result: any) => { - if (result && result['token']) { - localStorage.setItem('accessToken', window.btoa(result['token'])); - this.authInfoSubject.next(result['user']); - this.token = result['token']; - resolve(true) - } - }, error => { - resolve(false); - }) - }) - }) - } - - getAuthToken(): string { - return this.token; - } - - async verifyAccessToken(token: string): Promise { - this.token = token; - return new Promise(resolve => { - this.http.get(`${environment.apiUrl}auth/me`).subscribe(res => { - if (res && res.firstName) { - this.authInfoSubject.next(res); - if ((res as any)['token']) { - const token = (res as any)['token']; - this.token = token; - localStorage.setItem('accessToken', window.btoa(token)); - } - return resolve(true); - } - return resolve(false); - - }, () => { - return resolve(false); - }) - }) - - } - - logout() { - this.authInfoSubject.next(null as any); - localStorage.removeItem('accessToken'); - this.router.navigate(['auth']) - } - - register(data: {email: string, password: string, firstName: string, lastName: string, linkPlayerId?: number}): Observable { - return this.http.post(`${environment.apiUrl}auth/email/register`, data); - } - - forgotPassword(email: string): Observable { - return this.http.post(`${environment.apiUrl}auth/forgot/password`, { email }); - } - - resetPassword(hash: string, password: string): Observable { - return this.http.post(`${environment.apiUrl}auth/reset/password`, { hash, password }); - } - - async loginFromLocalStorage(suppressNavigation = false): Promise { - return new Promise(async resolve => { - const authToken = localStorage.getItem('accessToken'); - - if (!authToken || authToken.length == 0) { - if (!suppressNavigation) { - this.router.navigate(['/auth']).then(); - } - return resolve(false); - } - - const accessToken = window.atob(authToken); - - - const success = await this.verifyAccessToken(accessToken); - resolve(success) - }) - } -} diff --git a/myteamwallet_frontend/src/app/modules/auth/auth.component.html b/myteamwallet_frontend/src/app/modules/auth/auth.component.html deleted file mode 100644 index ee410ce..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/auth.component.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - -
-
Teams:
- @for(t of cachedTeams; track t) { - - } - - -
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/auth/auth.component.scss b/myteamwallet_frontend/src/app/modules/auth/auth.component.scss deleted file mode 100644 index abf38c8..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/auth.component.scss +++ /dev/null @@ -1,25 +0,0 @@ -:host { - display: flex; - justify-content: center; - align-items: center; - width: 100vw; - height: 100%; - flex-direction: column; - gap: 64px; -} - -mat-card { - width: 500px; - max-width: 90vw; -} - -.cached_teams { - display: flex; - flex-direction: column; - justify-content: stretch; - gap: 4px; - - button { - width: 100%; - } -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/auth/auth.component.spec.ts b/myteamwallet_frontend/src/app/modules/auth/auth.component.spec.ts deleted file mode 100644 index 00cff93..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/auth.component.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatCardModule } from '@angular/material/card'; -import { RouterModule } from '@angular/router'; - -import { AuthComponent } from './auth.component'; - -describe('AuthComponent', () => { - let component: AuthComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ AuthComponent ], - imports: [ MatCardModule, RouterModule ], - providers: [ ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(AuthComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/myteamwallet_frontend/src/app/modules/auth/auth.component.ts b/myteamwallet_frontend/src/app/modules/auth/auth.component.ts deleted file mode 100644 index a8b3a86..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/auth.component.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Component, inject } from '@angular/core'; -import { AuthService } from '../auth.service'; -import { Router, RouterModule } from '@angular/router'; -import { CommonModule } from '@angular/common'; -import { HttpClientModule } from '@angular/common/http'; -import { MatCardModule } from '@angular/material/card'; -import { AuthGuard } from '../../core/guards/auth.guard'; -import { MatButtonModule } from '@angular/material/button'; - -@Component({ - selector: 'app-auth', - templateUrl: './auth.component.html', - styleUrls: ['./auth.component.scss'], - standalone: true, - imports: [ - CommonModule, - MatCardModule, - HttpClientModule, - RouterModule, - MatButtonModule - ], - providers: [ AuthGuard ] -}) -export class AuthComponent { - - private auth: AuthService = inject(AuthService); - private router: Router = inject(Router); - - cachedTeams: any[] = []; - - constructor() { - // this.login(); - this.getCachedTeams(); - } - - login() { - this.auth.loginFromLocalStorage().then(res => { - if (res) { - this.router.navigate(['/dashboard']); - } - }) - } - - - getCachedTeams() { - let t = localStorage.getItem('cached_teams'); - if (!t) { return; } - - let teams = JSON.parse(t); - this.cachedTeams = Object.keys(teams).map((k: any) => { - return { alias: k, name: teams[k] } - }); - } - - openTeam(alias: string) { - this.router.navigate([`teams/${alias}`]) - } - - clear() { - localStorage.removeItem('cached_teams'); - this.cachedTeams = []; - } -} diff --git a/myteamwallet_frontend/src/app/modules/auth/auth.routes.ts b/myteamwallet_frontend/src/app/modules/auth/auth.routes.ts deleted file mode 100644 index e0d74b1..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/auth.routes.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Routes } from '@angular/router'; -import { AuthComponent } from './auth.component'; - -export const authRoutes: Routes = [ - { - path: '', component: AuthComponent, - children: [{ - path: '', loadChildren: () => import('./login/login.module').then(m => m.LoginModule) - }, - { - path: 'register', loadChildren: () => import('./register/register.module').then(m => m.RegisterModule) - }, - { - path: 'forgot-password', loadComponent: () => import('./forgot-password/forgot-password.component').then(m => m.ForgotPasswordComponent) - }] - }, - -]; diff --git a/myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.html b/myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.html deleted file mode 100644 index a75c67b..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.html +++ /dev/null @@ -1,29 +0,0 @@ - - Passwort vergessen - - - - - -

Gib deine E-Mail-Adresse ein. Falls sie bei uns registriert ist, schicken wir dir einen Link zum Zurücksetzen des Passworts.

- -
- - Email - - -
- -

Anfrage konnte nicht gesendet werden. Bitte später erneut versuchen.

-
- - -

Falls die E-Mail-Adresse bei uns registriert ist, wurde eine Nachricht mit einem Link zum Zurücksetzen des Passworts verschickt. Bitte Posteingang (und Spam-Ordner) prüfen.

-
- -
- - - Zurück zum Login - - diff --git a/myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.scss b/myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.scss deleted file mode 100644 index 44fc5a7..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.scss +++ /dev/null @@ -1,13 +0,0 @@ -mat-form-field { - width: 100%; -} - -mat-card-header { - margin-bottom: 16px; -} - -.forgot-error { - color: #b3261e; - margin: 8px 0 0; - font-size: 0.9rem; -} diff --git a/myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.ts b/myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.ts deleted file mode 100644 index 6dda896..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/forgot-password/forgot-password.component.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { Component } from '@angular/core'; -import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { RouterModule } from '@angular/router'; -import { AuthService } from '../../auth.service'; - -@Component({ - selector: 'app-forgot-password', - templateUrl: './forgot-password.component.html', - styleUrls: ['./forgot-password.component.scss'], - standalone: true, - imports: [ - CommonModule, - ReactiveFormsModule, - MatCardModule, - MatFormFieldModule, - MatInputModule, - MatButtonModule, - RouterModule - ] -}) -export class ForgotPasswordComponent { - - submitted = false; - error = false; - - form = new FormGroup({ - email: new FormControl('', [Validators.required, Validators.email]) - }); - - constructor(private authService: AuthService) {} - - submit() { - if (this.form.invalid) { return; } - const email = this.form.controls.email.value + ''; - this.error = false; - - this.authService.forgotPassword(email).subscribe({ - next: () => { this.submitted = true; }, - error: (err) => { - // Aus Datenschutzgründen wird bei unbekannter E-Mail dieselbe - // Erfolgsmeldung angezeigt wie bei einer bekannten Adresse. - if (err?.error?.errors?.email === 'emailNotExists') { - this.submitted = true; - return; - } - this.error = true; - } - }); - } - -} diff --git a/myteamwallet_frontend/src/app/modules/auth/login/login-routing.module.ts b/myteamwallet_frontend/src/app/modules/auth/login/login-routing.module.ts deleted file mode 100644 index 502fa32..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/login/login-routing.module.ts +++ /dev/null @@ -1,16 +0,0 @@ - -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { LoginComponent } from './login.component'; - -const routes: Routes = [ - { - path: '', component: LoginComponent - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class LoginRoutingModule { } \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/auth/login/login.component.html b/myteamwallet_frontend/src/app/modules/auth/login/login.component.html deleted file mode 100644 index c19032d..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/login/login.component.html +++ /dev/null @@ -1,31 +0,0 @@ - - Login - - - -
- -
- - Email - - -
- -
- - Passwort - - -
- - - -
- -
- - - Passwort vergessen? - - \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/auth/login/login.component.scss b/myteamwallet_frontend/src/app/modules/auth/login/login.component.scss deleted file mode 100644 index d6a6c0d..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/login/login.component.scss +++ /dev/null @@ -1,13 +0,0 @@ -mat-form-field { - width: 100%; -} - -mat-card-header { - margin-bottom: 24px; -} - -.login-error { - color: #b3261e; - margin: 0 0 8px; - font-size: 0.9rem; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/auth/login/login.component.spec.ts b/myteamwallet_frontend/src/app/modules/auth/login/login.component.spec.ts deleted file mode 100644 index e642643..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/login/login.component.spec.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { AuthService } from '../../auth.service'; - -import { LoginComponent } from './login.component'; - -describe('LoginComponent', () => { - let component: LoginComponent; - let fixture: ComponentFixture; - const mockAuthService = jasmine.createSpyObj('AuthService', ['']) - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ LoginComponent ], - providers: [ - { provide: AuthService, useValue: mockAuthService } - ], - imports: [ MatCardModule, FormsModule, MatFormFieldModule, ReactiveFormsModule, MatInputModule, MatButtonModule, MatSnackBarModule, NoopAnimationsModule ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(LoginComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/myteamwallet_frontend/src/app/modules/auth/login/login.component.ts b/myteamwallet_frontend/src/app/modules/auth/login/login.component.ts deleted file mode 100644 index 825b8aa..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/login/login.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Component } from '@angular/core'; -import { FormGroup, FormControl, Validators } from '@angular/forms'; -import { Router } from '@angular/router'; -import { MatSnackBar } from '@angular/material/snack-bar'; -import { AuthService } from '../../auth.service'; - -@Component({ - selector: 'app-login', - templateUrl: './login.component.html', - styleUrls: ['./login.component.scss'] -}) -export class LoginComponent { - - loginFailed = false; - - constructor(private authService: AuthService, private router: Router, private snackBar: MatSnackBar) { - } - - loginForm = new FormGroup({ - email: new FormControl('', [Validators.required, Validators.email]), - password: new FormControl('', [Validators.required]) - }); - - - async login() { - const email = this.loginForm.controls.email.value + ''; - const password = this.loginForm.controls.password.value + '' - this.loginFailed = false; - const success = await this.authService.login(email, password); - - if (success) { - this.router.navigate(['/dashboard']).then(); - } else { - this.loginFailed = true; - this.snackBar.open('E-Mail oder Passwort ist falsch', undefined, { - duration: 5000, - panelClass: 'snackbar_error' - }); - } - } - -} diff --git a/myteamwallet_frontend/src/app/modules/auth/login/login.module.ts b/myteamwallet_frontend/src/app/modules/auth/login/login.module.ts deleted file mode 100644 index 600b982..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/login/login.module.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { LoginComponent } from './login.component'; -import { LoginRoutingModule } from './login-routing.module'; -import { MatCardModule } from '@angular/material/card'; -import {MatButtonModule} from '@angular/material/button'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import { ReactiveFormsModule } from '@angular/forms'; -import {MatInputModule} from '@angular/material/input'; - -@NgModule({ - declarations: [ - LoginComponent - ], - imports: [ - CommonModule, - LoginRoutingModule, - MatCardModule, - MatButtonModule, - MatFormFieldModule, - MatInputModule, - ReactiveFormsModule - ] -}) -export class LoginModule { } diff --git a/myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.html b/myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.html deleted file mode 100644 index 9ba41b6..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.html +++ /dev/null @@ -1,45 +0,0 @@ - - - Neues Passwort vergeben - - - - - -
- - Neues Passwort - - Mindestens 6 Zeichen - - - - Passwort wiederholen - - - -

- Die Passwörter stimmen nicht überein. -

-
- -

- Der Link ist ungültig oder abgelaufen. Bitte fordere über "Passwort vergessen" einen neuen Link an. -

-
- - -

Dein Passwort wurde geändert. Du wirst gleich zum Login weitergeleitet.

-
- - -

Dieser Link ist unvollständig. Bitte fordere über "Passwort vergessen" einen neuen Link an.

-
- -
- - - Zurück zum Login - - -
diff --git a/myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.scss b/myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.scss deleted file mode 100644 index a1f7fa8..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.scss +++ /dev/null @@ -1,26 +0,0 @@ -:host { - display: flex; - justify-content: center; - align-items: center; - width: 100vw; - height: 100%; -} - -mat-card { - width: 500px; - max-width: 90vw; -} - -mat-form-field { - width: 100%; -} - -mat-card-header { - margin-bottom: 16px; -} - -.password-error { - color: #b3261e; - margin: 8px 0 0; - font-size: 0.9rem; -} diff --git a/myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.ts b/myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.ts deleted file mode 100644 index 5b7cadd..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/password-change/password-change.component.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { Component, OnInit } from '@angular/core'; -import { AbstractControl, FormControl, FormGroup, ReactiveFormsModule, ValidationErrors, Validators } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { ActivatedRoute, Router, RouterModule } from '@angular/router'; -import { AuthService } from '../../auth.service'; - -function passwordsMatch(control: AbstractControl): ValidationErrors | null { - const password = control.get('password')?.value; - const confirmPassword = control.get('confirmPassword')?.value; - return password && confirmPassword && password !== confirmPassword ? { passwordMismatch: true } : null; -} - -@Component({ - selector: 'app-password-change', - templateUrl: './password-change.component.html', - styleUrls: ['./password-change.component.scss'], - standalone: true, - imports: [ - CommonModule, - ReactiveFormsModule, - MatCardModule, - MatFormFieldModule, - MatInputModule, - MatButtonModule, - RouterModule - ] -}) -export class PasswordChangeComponent implements OnInit { - - hash: string | null = null; - success = false; - error = false; - - form = new FormGroup({ - password: new FormControl('', [Validators.required, Validators.minLength(6)]), - confirmPassword: new FormControl('', [Validators.required]), - }, { validators: passwordsMatch }); - - constructor(private route: ActivatedRoute, private router: Router, private authService: AuthService) {} - - ngOnInit(): void { - this.hash = this.route.snapshot.paramMap.get('hash'); - if (!this.hash) { - this.error = true; - } - } - - submit() { - if (this.form.invalid || !this.hash) { return; } - this.error = false; - - this.authService.resetPassword(this.hash, this.form.controls.password.value + '').subscribe({ - next: () => { - this.success = true; - setTimeout(() => this.router.navigateByUrl('/auth'), 3000); - }, - error: () => { this.error = true; } - }); - } - -} diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.html b/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.html deleted file mode 100644 index af896cc..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - Registrieren nicht möglich - - - -
- Es ist kein gültiger Registrierungstoken vorhanden. Das Registrieren ist derzeit nur über einen Link mit gültigem Token möglich. -
-
diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.scss b/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.spec.ts b/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.spec.ts deleted file mode 100644 index ef92e00..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { NoTokenProvidedComponent } from './no-token-provided.component'; - -describe('NoTokenProvidedComponent', () => { - let component: NoTokenProvidedComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ NoTokenProvidedComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(NoTokenProvidedComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.ts b/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.ts deleted file mode 100644 index 1ba449c..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/register/components/no-token-provided/no-token-provided.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-no-token-provided', - templateUrl: './no-token-provided.component.html', - styleUrls: ['./no-token-provided.component.scss'] -}) -export class NoTokenProvidedComponent { - -} diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.html b/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.html deleted file mode 100644 index 0680b43..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.scss b/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.spec.ts b/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.spec.ts deleted file mode 100644 index e70a319..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { RegisterBaseComponent } from './register-base.component'; - -describe('RegisterBaseComponent', () => { - let component: RegisterBaseComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ RegisterBaseComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(RegisterBaseComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.ts b/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.ts deleted file mode 100644 index af4fbe6..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/register/components/register-base/register-base.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-register-base', - templateUrl: './register-base.component.html', - styleUrls: ['./register-base.component.scss'] -}) -export class RegisterBaseComponent { - -} diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.html b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.html deleted file mode 100644 index bd18ed8..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.html +++ /dev/null @@ -1,30 +0,0 @@ -
- -
- - Vorname - - - - - Nachname - - -
- -
- - Email - - -
- -
- - Passwort - - Mindestens 6 Zeichen - -
- -
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.scss b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.scss deleted file mode 100644 index de0feff..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.scss +++ /dev/null @@ -1,5 +0,0 @@ -mat-form-field { - width: 100%; -} - - diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.spec.ts b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.spec.ts deleted file mode 100644 index e0fc93b..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { RegisterFormComponent } from './register-form.component'; - -describe('RegisterFormComponent', () => { - let component: RegisterFormComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ RegisterFormComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(RegisterFormComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.ts b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.ts deleted file mode 100644 index b9eef47..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register-form/register-form.component.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { FormGroup, FormControl, Validators } from '@angular/forms'; -import { TeamInvite } from 'src/app/modules/teams/model/team-invite'; - -@Component({ - selector: 'app-register-form', - templateUrl: './register-form.component.html', - styleUrls: ['./register-form.component.scss'] -}) -export class RegisterFormComponent implements OnInit { - - - @Input('teamInfo') teamInfo: TeamInvite | undefined; - - registerForm = new FormGroup({ - email: new FormControl('', [Validators.required, Validators.email]), - password: new FormControl('', [Validators.required, Validators.minLength(6)]), - lastName: new FormControl('', [Validators.required]), - firstName: new FormControl('', [Validators.required]), - }); - - - - ngOnInit(): void { - if (this.teamInfo) { - let names = this.teamInfo.playerName.split(' '); - if (names && names.length == 2) { - this.registerForm.controls.firstName.patchValue(names[0]) - this.registerForm.controls.lastName.patchValue(names[1]) - } - } - } - - register() { - - } -} diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.html b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.html deleted file mode 100644 index 7005d40..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.html +++ /dev/null @@ -1,27 +0,0 @@ - - Registrieren - - - - -
Hallo {{ teamInfo.playerName }},
- - - du wurdes eingeladen dich für das Team {{ teamInfo.teamName }} zu registrieren. - - -
- -
- -
- -
- Registrierung fehlgeschlagen. Bitte wende dich an deinen Ansprechpartner. -
- -
- - - - \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.scss b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.scss deleted file mode 100644 index 9dba3cd..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.scss +++ /dev/null @@ -1,12 +0,0 @@ -.info { - font-weight: bold; -} - -.register_form { - margin-top: 24px; -} - -.error { - margin-top: 24px; - color: red; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.spec.ts b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.spec.ts deleted file mode 100644 index f975533..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { RegisterComponent } from './register.component'; - -describe('RegisterComponent', () => { - let component: RegisterComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ RegisterComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(RegisterComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.ts b/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.ts deleted file mode 100644 index 2ddebf8..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/register/components/register/register.component.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; -import { MatSnackBar } from '@angular/material/snack-bar'; -import { ActivatedRoute, Router } from '@angular/router'; -import { AuthService } from 'src/app/modules/auth.service'; -import { TeamsService } from 'src/app/modules/teams/teams.service'; -import { RegisterFormComponent } from './register-form/register-form.component'; - -@Component({ - selector: 'app-register', - templateUrl: './register.component.html', - styleUrls: ['./register.component.scss'] -}) -export class RegisterComponent implements OnInit { - - private token: string | null= null; - public teamInfo: { playerId: number, playerName: string, teamId: number, teamName: string} | undefined; - error: boolean = false; - - constructor(private route: ActivatedRoute, private router: Router, private teamsService: TeamsService, private authService: AuthService, private snackBar: MatSnackBar) {} - - - @ViewChild('formComponent') formComponent!: RegisterFormComponent; - - - ngOnInit(): void { - this.validateToken(this.route.snapshot.paramMap.get('token')); - - } - - private async validateToken(token: string | null) { - - if (!token) { - return this.onNoTokenProvided(); - } else { - this.teamsService.validateRegistrationToken(token).subscribe({ - next: data => { this.teamInfo = data; }, - error: () => { return this.onNoTokenProvided(); } - }); - } - - this.token = token; - } - - private onNoTokenProvided() { - this.router.navigateByUrl('auth/register/no-token'); - } - - get registerForm() { - return this.formComponent?.registerForm; - } - - get registerFormInvalid(): boolean { - return !this.registerForm || this.registerForm.invalid; - } - - register() { - const data = this.registerForm.value as any; - data.linkPlayerId = this.teamInfo?.playerId; - - this.authService.register(data).subscribe({ - next: () => { this.onPlayerRegistrationSuccess() }, - error: () => { this.onPlayerRegistrationFailure() } - }) - } - - onPlayerRegistrationSuccess() { - this.error = false; - this.snackBar.open('Erfolgreich registriert', undefined, { - duration: 5000 - }); - - this.router.navigateByUrl('/auth') - } - - onPlayerRegistrationFailure() { - - this.snackBar.open('Registrierung nicht möglich', undefined, { - duration: 5000, - panelClass: 'snackbar_error' - }); - - this.registerForm.reset() - } - -} diff --git a/myteamwallet_frontend/src/app/modules/auth/register/register-routing.module.ts b/myteamwallet_frontend/src/app/modules/auth/register/register-routing.module.ts deleted file mode 100644 index 97d7dd6..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/register/register-routing.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { NoTokenProvidedComponent } from './components/no-token-provided/no-token-provided.component'; -import { RegisterBaseComponent } from './components/register-base/register-base.component'; -import { RegisterComponent } from './components/register/register.component'; - -const routes: Routes = [ - { path: '', component: RegisterBaseComponent, children: [ - { - path: 'no-token', - component: NoTokenProvidedComponent - }, - { - path: ':token', - component: RegisterComponent - } - ] } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class RegisterRoutingModule { } diff --git a/myteamwallet_frontend/src/app/modules/auth/register/register.module.ts b/myteamwallet_frontend/src/app/modules/auth/register/register.module.ts deleted file mode 100644 index 764ae3e..0000000 --- a/myteamwallet_frontend/src/app/modules/auth/register/register.module.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { RegisterRoutingModule } from './register-routing.module'; -import { NoTokenProvidedComponent } from './components/no-token-provided/no-token-provided.component'; -import { RegisterBaseComponent } from './components/register-base/register-base.component'; -import { MatCardModule } from '@angular/material/card'; -import { RegisterComponent } from './components/register/register.component'; -import { RegisterFormComponent } from './components/register/register-form/register-form.component'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatButtonModule } from '@angular/material/button'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; - - -@NgModule({ - declarations: [ - NoTokenProvidedComponent, - RegisterBaseComponent, - RegisterComponent, - RegisterFormComponent - ], - imports: [ - CommonModule, - RegisterRoutingModule, - MatCardModule, - MatFormFieldModule, - MatInputModule, - ReactiveFormsModule, - MatButtonModule, - MatSnackBarModule - ] -}) -export class RegisterModule { } diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.html b/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.html deleted file mode 100644 index 4fb291c..0000000 --- a/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.html +++ /dev/null @@ -1,34 +0,0 @@ - -
- Welcome {{ name }}, your Role is {{ role }} -
- - -
-
Deine Teams
-
Klicke auf eins der Teams um es zu verwalten
-
-
-
- {{ p.team.name }} -
-
Balance: {{ p.team.balance | currency:'EUR' }}
-
- {{ p.firstName }} {{ p.lastName }} -
-
- Rolle: {{ p.teamRole.name | translate }} -
- -
-
- - -
-
-
- diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.scss b/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.scss deleted file mode 100644 index 67a0621..0000000 --- a/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.scss +++ /dev/null @@ -1,38 +0,0 @@ - - -.icons { - display: flex; - align-items: center; - opacity: 0; - pointer-events: none; - transition: opacity 0.2s ease-in-out; -} - -.team_row { - padding: 2px 8px; - border: 1px solid #ccc; - border-radius: 4px; - align-items: stretch; - - &:hover > .icons { - opacity: 1; - pointer-events: all; - } - - &:not(:first-of-type) { - margin-top: 8px; - } -} - -@media screen and (max-width: 700px) { - .icons { - opacity: 1; - pointer-events: all; - align-items: stretch; - - button { - height: inherit; - width: 48px; - } - } -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.spec.ts b/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.spec.ts deleted file mode 100644 index f041725..0000000 --- a/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { HttpClientModule } from '@angular/common/http'; -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { DashboardComponent } from './dashboard.component'; - -describe('DashboardComponent', () => { - let component: DashboardComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ DashboardComponent ], - imports: [ HttpClientModule ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(DashboardComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.ts b/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.ts deleted file mode 100644 index 101f9e7..0000000 --- a/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.component.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Component } from '@angular/core'; -import { Router } from '@angular/router'; -import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { UserService } from 'src/app/core/user/user.service'; -import { AuthService } from '../../auth.service'; -import { CommonModule } from '@angular/common'; -import { Player } from 'src/app/model'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; - -@Component({ - selector: 'app-dashboard', - templateUrl: './dashboard.component.html', - styleUrls: ['./dashboard.component.scss'], - standalone: true, - imports: [ CommonModule, TranslateModule, MatButtonModule, MatIconModule ] -}) -export class DashboardComponent { - - link: string = window.location.host; - - constructor( - private authService: AuthService - , private userService: UserService - , private router: Router - , public translate: TranslateService) {} - - - - get role(): string { - - if (!this.authService || !this.authService.isLoggedIn()) { return ''} - - return this.authService.user.role.name; - } - - get name(): string { - if (!this.authService || !this.authService.isLoggedIn()) { return ''} - - return this.authService.user.firstName + ' ' + this.authService.user.lastName; - } - - get players(): any[] { - return this.userService.players; - } - - onTeamClick(team: any) { - this.router.navigate([`dashboard/${team.alias}/details`]) - } - - onLinkClick(event: any) { - event.stopPropagation(); - return; - } - - async copyLink(p: Player) { - const link = `https://${this.link}/teams/${p.team.alias}` - await navigator.clipboard.writeText(link); - } -} diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.routes.ts b/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.routes.ts deleted file mode 100644 index 93f6319..0000000 --- a/myteamwallet_frontend/src/app/modules/home/dashboard/dashboard.routes.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Routes } from '@angular/router'; - -export const dashboardRoutes: Routes = [ - { path: '', loadComponent: () => import('./dashboard.component').then(m => m.DashboardComponent) }, - { path: ':id/details', loadComponent: () => import('./team-details/team-details.component').then(m => m.TeamDetailsComponent) } -]; - diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.html b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.html deleted file mode 100644 index 63efba2..0000000 --- a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.html +++ /dev/null @@ -1,11 +0,0 @@ -
- {{ playerInitials }} -
- -
- -
{{ player.firstName}} {{ player.lastName }}
-
{{ player.teamRole.name | translate }}
- -
{{ 'balance' | translate }}: {{ player.balance | currency:'EUR' }}
-
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.scss b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.scss deleted file mode 100644 index c9627aa..0000000 --- a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.scss +++ /dev/null @@ -1,31 +0,0 @@ -:host { - display: flex; - flex: 250px 1 1; - cursor: pointer; -} - -.player_icon { - width: 48px; - height: 48px; - line-height: 48px; - text-align: center; - font-size: 20px; - border-radius: 50%; - border: 1px solid #ccc - -} -.content{ - margin-left: 12px; -} - -.name { - font-weight: bold; -} - -.line_through{ - text-decoration: line-through; -} - -.inactive { - opacity: 0.5; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.spec.ts b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.spec.ts deleted file mode 100644 index 99efc21..0000000 --- a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PlayerCardComponent } from './player-card.component'; - -describe('PlayerCardComponent', () => { - let component: PlayerCardComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ PlayerCardComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(PlayerCardComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.ts b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.ts deleted file mode 100644 index 355306b..0000000 --- a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-card.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { Component, Input, OnInit, Output } from '@angular/core'; -import { TranslateModule } from '@ngx-translate/core'; -import { Player } from 'src/app/model'; - -@Component({ - selector: 'app-player-card', - templateUrl: './player-card.component.html', - styleUrls: ['./player-card.component.scss'], - standalone: true, - imports: [CommonModule, TranslateModule] -}) -export class PlayerCardComponent implements OnInit { - - @Input() player!: Player; - - - ngOnInit(): void {} - - - get playerInitials(): string { - if (!this.player) { return ' '; } - - return this.player.firstName.substring(0, 1) + this.player.lastName.substring(0, 1); - } - -} diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.html b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.html deleted file mode 100644 index aee3c79..0000000 --- a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.html +++ /dev/null @@ -1,9 +0,0 @@ -

{{ player.firstName }} {{ player.lastName }}

- -
- -
- Spieler aktiv -
- -
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.scss b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.scss deleted file mode 100644 index 55b1cda..0000000 --- a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.scss +++ /dev/null @@ -1,10 +0,0 @@ -:host { - display: flex; - overflow: hidden; - flex-direction: column; - padding: 8px 14px 8px 14px; -} - -.body { - padding: 6px 12px 24px 6px; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.ts b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.ts deleted file mode 100644 index 106cfb5..0000000 --- a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/player-card/player-details/player-details.component.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { HttpClient } from '@angular/common/http'; -import { Component, EventEmitter, inject, Inject, Output } from '@angular/core'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { MatSlideToggleModule } from '@angular/material/slide-toggle'; -import { MatSnackBar } from '@angular/material/snack-bar'; -import { Player } from '../../../../../../model'; -import { AuthService } from 'src/app/modules/auth.service'; -import { environment } from 'src/environments/environment'; - -@Component({ - selector: 'app-player-details', - templateUrl: './player-details.component.html', - styleUrls: ['./player-details.component.scss'], - standalone: true, - imports: [CommonModule, MatSlideToggleModule] -}) -export class PlayerDetailsComponent { - - player: Player; - loading: boolean = false; - private auth: AuthService = inject(AuthService); - - @Output('onReload') changed = new EventEmitter(); - - constructor(@Inject(MAT_DIALOG_DATA) public data: DialogData, private http: HttpClient, private snackBar: MatSnackBar) { - this.player = data.player; - } - - - get isAdmin() { - return this.auth.isAdmin; - } - - setPlayerActive(event: any) { - this.loading = true; - const copy = { ...this.player } - this.player.active = event.checked; - this.http.put(`${environment.apiUrl}teams/${this.player.team.id}/players`, this.player).subscribe({ - next: r => { - this.changed.emit(); - }, - error: e => { - this.player.active = copy.active; - - this.snackBar.open('Spieler konnte nicht aktualisiert werden', undefined, { - duration: 5000, - panelClass: 'snackbar_error' - }) - - }, - complete: () => { this.loading = false; } - }) - } -} - -interface DialogData { - player: Player; -} diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.html b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.html deleted file mode 100644 index c5270be..0000000 --- a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.html +++ /dev/null @@ -1,92 +0,0 @@ -
-
- {{ team.name }} ({{ translateRolename(roleName) }}) -
Spieleranzahl: {{ team.players?.length }} (aktiv: {{ activePlayerCount }})
-
-
-
Saldo: {{ team.balance | currency:'EUR' }}
-
Ausstehend: {{ team.outstanding | currency:'EUR' }} -
-
- -
- - - - - - - -
- - -
- - - - - s - - -
- -
-
-
- - - -
-
-
-
Alle
-
- -
- - Suche - - - - - - -
{{ p.firstName}} {{ p.lastName }} - Ich
-
{{ p.balance | currency:'EUR'}}
- -
- -
- -
-
-
-
- -
- -
- -
- -
- - {{players.selectedOptions.selected.length}} Spieler gewählt - Spieler für einen Eintrag wählen - -
-
- - - - - - - \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.scss b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.scss deleted file mode 100644 index ec220ce..0000000 --- a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.scss +++ /dev/null @@ -1,59 +0,0 @@ -.title-row { - display: flex; - justify-content: space-between; -} - -:host { - display: flex; - flex-direction: column; - overflow: hidden; - flex: 1 1 auto; -} - -.list{ - flex: 1 1 100%; - overflow: auto; -} - -.back { - width: 28px; - height: 28px; - background-color: red; - cursor: pointer; -} - -.select_all { - margin-right: 52px; - text-decoration: underline; - cursor: pointer; - color: #646464; - - &:hover { - color: black; - } -} - -.buttons { - margin-top: 6px; -} - -.highlight { - // text-decoration: wavy; - font-style: italic; -} - -mat-tab-group { - flex: 1 1 100%; - height: 257px; -} - -.mat-tab__content { - height: 100%; - overflow: hidden; - display: flex; - flex-direction: column; -} - -.break { - flex-wrap: wrap; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.spec.ts b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.spec.ts deleted file mode 100644 index 278b460..0000000 --- a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.spec.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { HttpClient } from '@angular/common/http'; -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatListModule } from '@angular/material/list'; -import { By } from '@angular/platform-browser'; -import { ActivatedRoute } from '@angular/router'; -import { of } from 'rxjs'; - -import { TeamDetailsComponent } from './team-details.component'; - -describe('TeamDetailsComponent', () => { - let component: TeamDetailsComponent; - let fixture: ComponentFixture; - const paramMap = jasmine.createSpyObj('ParamMap', ['get']) - const fakeActivatedRoute = { - snapshot: { paramMap: paramMap } - } - - paramMap.get.and.returnValue('9999'); - - const mockhttp = jasmine.createSpyObj('HttpClient', ['get']); - mockhttp.get.and.returnValue(of({ - alias: "9999", - balance: 48.09, - name: "Development Team", - outstanding: -582.00, - players: [{id: 1, firstName: 'Filiberto', lastName: 'Spencer', balance: -32.97}, {id: 2, firstName: 'Adam', lastName: 'West', balance: -50}], - settings: [] - })) - - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ TeamDetailsComponent ], - providers: [ - {provide: ActivatedRoute, useValue: fakeActivatedRoute}, - {provide: HttpClient, useValue: mockhttp}, - ], - imports: [ MatListModule ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(TeamDetailsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should extract the id from the url', () => { - expect(component.id).toEqual("9999"); - }); - - it('should load the teams data', () => { - expect(component.team).not.toBeNull(); - }); - - it('should display name and alias', () => { - const nameElement = fixture.debugElement.query(By.css('#teamName')); - const text = (nameElement.nativeElement as HTMLElement).textContent; - expect(text).toEqual(`${component.team.name} (${component.team.alias})`) - - // const htmlList = (list.nativeElement as HTMLElement).children; - // expect(htmlList).not.toBeNull(); - // expect(htmlList.length).toBe(4) - }); - - it('should display a list with players', () => { - const element = fixture.debugElement.query(By.css('#playerlist')); - const ch = (element.nativeElement as HTMLElement).children; - expect(ch.length).toBe(component.team.players.length); - for (let index = 0; index < component.team.players.length; index++) { - const playerName = ch[index].textContent?.trim(); - const expectedName = `${component.team.players[index].firstName} ${component.team.players[index].lastName}`; - expect(playerName).toEqual(expectedName) - } - }); - - it('button should be disabled', () => { - const element = fixture.debugElement.query(By.css('#buttonNewTransaction')); - expect(element.nativeElement.disabled).toBeTrue(); - }); - - it('should enable the button when selecting a player', () => { - const element = fixture.debugElement.query(By.css('.mdc-checkbox')); - element.nativeElement.click(); - fixture.detectChanges(); - const buttonelement = fixture.debugElement.query(By.css('#buttonNewTransaction')); - expect(buttonelement.nativeElement.disabled).toBeFalse(); - - }) -}); \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.ts b/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.ts deleted file mode 100644 index 88cbd1f..0000000 --- a/myteamwallet_frontend/src/app/modules/home/dashboard/team-details/team-details.component.ts +++ /dev/null @@ -1,303 +0,0 @@ -import { Component, createNgModuleRef, Injector, OnInit, ViewChild } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; -import { MatSnackBar } from '@angular/material/snack-bar'; -import { ActivatedRoute, Router } from '@angular/router'; -import { Player } from 'src/app/model'; -import { AuthService } from 'src/app/modules/auth.service'; -import { Team } from 'src/app/modules/teams/model/team'; -import { TeamInvite } from 'src/app/modules/teams/model/team-invite'; -import { TeamsService } from 'src/app/modules/teams/teams.service'; -import { NewTransactionDialogComponent, TeamTransactionDialogComponent } from 'src/app/shared'; -import { CreatePlayerDialogComponent } from 'src/app/shared/dialog/create-player-dialog/create-player.dialog.component'; -import { PrivilegesInfoDialogComponent } from 'src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component'; -import { PlayerDetailsComponent } from './player-card/player-details/player-details.component'; -import { CommonModule } from '@angular/common'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatTabsModule } from '@angular/material/tabs'; -import { PlayerCardComponent } from './player-card/player-card.component'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatListModule } from '@angular/material/list'; -import { MatSlideToggleModule } from '@angular/material/slide-toggle'; -import { MatInputModule } from '@angular/material/input'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; - -@Component({ - selector: 'app-team-details', - templateUrl: './team-details.component.html', - styleUrls: ['./team-details.component.scss'], - standalone: true, - imports: [ - CommonModule - , ReactiveFormsModule - , FormsModule - , MatProgressSpinnerModule - , MatDividerModule - , MatButtonModule - , MatIconModule - , MatMenuModule - , MatTabsModule - , MatFormFieldModule - , MatListModule - , MatSlideToggleModule - , MatInputModule - , PlayerCardComponent - ] -}) -export class TeamDetailsComponent implements OnInit { - id: string | null = null; - - team: Team | undefined; - - correspondingPlayer: Player | undefined; - - canDoTransactions: boolean = false; - canInvite: boolean = false; - roleName: string = ''; - - isLoading: boolean = true; - - selectedPlayers: Player[] = []; - - usersPlayers: Player[] = []; - - @ViewChild('players') players: any; - - constructor(private route: ActivatedRoute, private teamsService: TeamsService, private authService: AuthService, - private router: Router, public dialog: MatDialog, private injector: Injector, private _snackBar: MatSnackBar) {} - - ngOnInit(): void { - this.id = this.route.snapshot.paramMap.get('id'); - - if (this.id) { - this.loadTeamDetails(); - } - } - - protected loadTeamDetails() { - if (!this.id) { return; } - this.teamsService.loadTeamDetails(this.id).subscribe(result => { - this.team = result; - this.findCorrespondingPlayer(); - this.isLoading = false; - }) - } - - back() { - this.router.navigate(['../dashboard']) - } - - openDialog(): void { - - const dialogRef = this.dialog.open(NewTransactionDialogComponent, { - data: { - team: this.team, - players: this.selectedPlayers - } - }); - - dialogRef.afterClosed().subscribe(async result => { - if (result && result.length > 0) { - this.isLoading = true; - this.teamsService.createTransactions(result).subscribe(res => { - if (res && res.length > 0) { - this.loadTeamDetails(); - } - }) - - } - }); - } - - - openTeamTransactionDialog() { - if (!this.team) { return; } - const dialogRef = this.dialog.open(TeamTransactionDialogComponent, { - data: { - teamId: this.team.id - } - }); - - dialogRef.afterClosed().subscribe(async result => { - - if (result) { this.saveTeamTransaction(result); } - }); - } - - saveTeamTransaction(transaction: any) { - this.isLoading = true; - this.teamsService.createTeamTransaction(transaction).subscribe(res => { - if (res && res['id']) { - this.loadTeamDetails(); - } - }) - } - - selectAll() { - if (this.team == null || this.team.players == null) { return; } - if (this.selectedPlayers.length < this.team.players.length) { - this.selectedPlayers = []; - for (let p of this.team.players) { - this.selectedPlayers.push(p); - } - } else { - this.selectedPlayers = []; - } - - } - - onAllClick() { - if (!this.team) { return; } - const dialogRef = this.dialog.open(NewTransactionDialogComponent, { - data: { - team: this.team, - players: this.selectedPlayers, - all: this.team.players?.length == this.selectedPlayers.length - } - }); - } - - onAddPlayerClick() { - if (!this.team) { return; } - const dialogRef = this.dialog.open(CreatePlayerDialogComponent, { - data: { }, - width: '350px' - }); - - dialogRef.afterClosed().subscribe(result => { - if (result && this.team) { - this.teamsService.createNewPlayer(this.team.id, result).subscribe({ - next: () => { this.loadTeamDetails()}, - error: () => { this.onPlayerCreateError();} - }) - } - }) - } - - onPlayerCreateError() { - this._snackBar.open('Spieler konnte nicht erstellt werden', undefined, { - duration: 10000, - panelClass: 'snackbar_error' - }) - } - - async onCreateLink() { - if (!this.team) { return; } - - try { - const invite: TeamInvite = { - teamId: this.team.id, - teamName: this.team.name, - playerId: this.selectedPlayers[0].id, - playerName: this.selectedPlayers[0].firstName + ' ' + this.selectedPlayers[0].lastName - } - const token = await this.getInviteFromServer(invite); - - const link = location.origin + '/auth/register/' + token - - await navigator.clipboard.writeText(link); - this._snackBar.open('Einladungslink für ' + invite.playerName + ' in die Zwischenablage kopiert. Der Link ist auf den gewählten Spieler personalisiert und darf nicht an mehrere Spieler verteilt werden.', undefined, { - duration: 10000, - - }); - - } catch { - this._snackBar.open('Der Einladungslink konnte nicht erzeugt werden.', undefined, { - panelClass: 'snackbar_error', - duration: 5000, - }); - } - } - - private async getInviteFromServer(invite: TeamInvite): Promise { - return new Promise((resolve, reject) => { - this.teamsService.createRegisterLink(invite).subscribe({ - next: token => { return resolve(token.token); }, - error: () => { return reject(null); } - }) - }) - } - - findCorrespondingPlayer() { - if (!this.team || !this.team.players) { return; } - const id = this.authService.user?.id; - this.usersPlayers = this.team.players.filter((p: any) => { return p.user?.id == id }); - this.canInvite = this.authService.isAdmin || this.usersPlayers.find(p => p.teamRole.id > 2) != null; - this.canDoTransactions = this.authService.isAdmin || this.usersPlayers.find(p => p.teamRole.id >= 2) != null; - - this.roleName = this.usersPlayers.reduce((prev, curr) => { return (prev.teamRole.id > curr.teamRole.id) ? prev : curr})?.teamRole.name; - - for (let u of this.usersPlayers) { - u.usersPlayer = true; - } - } - - onShowPrivileges() { - const dialogRef = this.dialog.open(PrivilegesInfoDialogComponent, { - data: null - }); - - - } - - translateRolename(roleName: string): string { - switch (roleName) { - case 'treasurer': - return 'Kassenwart' - case 'scnd_treasurer': - return 'zweiter Kassenwart' - case 'captain': - return 'Kapitän' - case 'coach': - return 'Trainer' - default: - return 'Spieler' - } - } - - - - async onShowTeamTransactions() { - if (!this.team) { return; } - - const { ShowTeamTransactionsComponent } = await import( - 'src/app/shared/dialog/show-team-transactions/show-team-transactions.component' - ); - - this.dialog.open(ShowTeamTransactionsComponent, { - data: { - id: this.team.id - } - }); - } - - openPlayerdetails(player: Player) { - if (!player) { return; } - const dialogRef = this.dialog.open(PlayerDetailsComponent, { - data: { - player - } - }); - - dialogRef.componentInstance.changed.subscribe(() => { - this.loadTeamDetails(); - }) - } - - filter(event: any) { - const search = event.target.value; - const s = search.toLowerCase().trim(); - this.team?.players?.map(p => { - const n = p.firstName.toLowerCase().trim() + '' + p.lastName.toLowerCase().trim(); - p.hide = !n.includes(s); - }); - } - - get activePlayerCount(): number { - if (!this.team || !this.team.players) { return 0; } - return this.team.players.filter(p => p.active).length; - } -} diff --git a/myteamwallet_frontend/src/app/modules/home/home.component.html b/myteamwallet_frontend/src/app/modules/home/home.component.html deleted file mode 100644 index a47e106..0000000 --- a/myteamwallet_frontend/src/app/modules/home/home.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - {{ username }} - - - - -
- -
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/home.component.scss b/myteamwallet_frontend/src/app/modules/home/home.component.scss deleted file mode 100644 index 0616313..0000000 --- a/myteamwallet_frontend/src/app/modules/home/home.component.scss +++ /dev/null @@ -1,18 +0,0 @@ -.content_container { - display: flex; - flex-direction: column; - padding: 8px; - flex: 1 1 auto; - overflow: hidden; - - .card { - padding: 12px; - } -} - -:host { - height: 100%; - display: flex; - flex-direction: column; - overflow: hidden; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/home/home.component.ts b/myteamwallet_frontend/src/app/modules/home/home.component.ts deleted file mode 100644 index ca5b4b0..0000000 --- a/myteamwallet_frontend/src/app/modules/home/home.component.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Component, inject } from '@angular/core'; -import { Router, RouterModule } from '@angular/router'; -import { UserService } from 'src/app/core/user/user.service'; -import { AuthService } from '../auth.service'; -import { CommonModule } from '@angular/common'; -import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatButtonModule } from '@angular/material/button'; - -@Component({ - selector: 'app-home', - templateUrl: './home.component.html', - styleUrls: ['./home.component.scss'], - standalone: true, - imports: [ - CommonModule, - MatToolbarModule, - RouterModule, - MatButtonModule - ] -}) -export class HomeComponent { - private authService: AuthService = inject(AuthService); - private userService: UserService = inject(UserService); - private router: Router = inject(Router); - - - constructor( - ) {} - - - ngOnInit(): void { - this.loginFromLocalStorage(); - - } - - get username(): string { - if (!this.authService || !this.authService.isLoggedIn()) { return ''} - return this.authService.user.firstName + ' ' + this.authService.user.lastName - } - - logout() { - this.authService.logout(); - } - - get isLoggedIn(): boolean { - return this.authService.isLoggedIn() - } - - private async loginFromLocalStorage() { - const success = await this.authService.loginFromLocalStorage(); - - if (!success) { - this.router.navigate(['/auth']).then(); - return; - } - - if (this.authService && this.authService.isLoggedIn()) { - this.userService.loadTeamsOfUser(); - } - - if (this.router.url == '/') { - this.router.navigate(['/dashboard']).then(); - } - } - - async login() { - - - // this.router.navigate(['/auth']).then(); - - } - -} diff --git a/myteamwallet_frontend/src/app/modules/home/home.routes.ts b/myteamwallet_frontend/src/app/modules/home/home.routes.ts deleted file mode 100644 index d8bca69..0000000 --- a/myteamwallet_frontend/src/app/modules/home/home.routes.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { AuthGuard } from 'src/app/core/guards/auth.guard'; -import { Route } from '@angular/router'; -import { dashboardRoutes } from './dashboard/dashboard.routes'; - -export const homeRoutes: Route[] = [ - { path: '', loadComponent: () => import('./home.component').then(m => m.HomeComponent), children: [ - { path: 'dashboard', canLoad: [AuthGuard], children: dashboardRoutes }, - ] }, -]; \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/teams/model/team-invite.ts b/myteamwallet_frontend/src/app/modules/teams/model/team-invite.ts deleted file mode 100644 index e8ae1b3..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/model/team-invite.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface TeamInvite { - teamId: number; - teamName: string; - playerId: number; - playerName: string; -} diff --git a/myteamwallet_frontend/src/app/modules/teams/model/team.ts b/myteamwallet_frontend/src/app/modules/teams/model/team.ts deleted file mode 100644 index 37c1737..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/model/team.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Player } from 'src/app/model'; - -export interface Team { - id: number; - alias: string; - balance: number; - name: string; - outstanding?: number; - players?: Player[]; - settings?: any[]; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.html b/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.html deleted file mode 100644 index b4ebc9d..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.html +++ /dev/null @@ -1,48 +0,0 @@ - - -
-
{{ data.user.firstName }}: {{ data.user.balance | currency:'EUR' }}
-
- -@if(isLoading) { - -} @else if (transactions.length > 0) { - - - - {{ transaction.date | date }} - - - - - {{transaction.amount | currency:'EUR' }} - - {{ transaction.type.name | translate }} - - - {{ transaction.note }} - - - - - -} @else { -
Es sind keine Einträge vorhanden
-} - - - - \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.scss b/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.scss deleted file mode 100644 index 128e0cb..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.scss +++ /dev/null @@ -1,61 +0,0 @@ -:host { - display: flex; - flex-direction: column; - height: 100%; - overflow: hidden; - min-height: 200px; -} - -.row { - display: flex; -} - -.list { - max-height: 500px; - overflow: auto; -} - -.amount { - color: rgb(49, 119, 49); -} - -.negative { - color: rgb(202, 62, 62); -} - -.actions { - display: flex; - flex-direction: row; - justify-content: space-between; - padding-left: 8px; - align-items: center; - - .name { - font-weight: bold; - } - - &__buttons { - display: flex; - flex-direction: row; - padding-right: 2px; - button { - margin: 4px 2px; - } - } -} - -.balance { - - color: #fff; - padding: 12px; - text-align: center; - font-size: 1.5rem; - - &.pos { - background-color: rgb(49, 119, 49); - } - - &.neg { - background-color: rgb(202, 62, 62); - } -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.spec.ts b/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.spec.ts deleted file mode 100644 index 63aa403..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.spec.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { HttpClientModule } from '@angular/common/http'; -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { MatListModule } from '@angular/material/list'; -import { By } from '@angular/platform-browser'; -import { TeamsService } from '../../teams.service'; - -import { DetailsComponent } from './details.component'; - -describe('DetailsComponent', () => { - let component: DetailsComponent; - let fixture: ComponentFixture; - const mockTeamService = jasmine.createSpyObj('TeamsService', ['loadTransactionsOfUser']); - mockTeamService.selectedUserTransaction = [ - {id: 1, note: 'dev1', createdAt: '', date: '', amount: 100, type: {id: 1}}, - {id: 2, note: 'dev2', createdAt: '', date: '', amount: 100, type: {id: 1}}, - {id: 3, note: 'dev3', createdAt: '', date: '', amount: 100, type: {id: 1}}, - {id: 4, note: 'dev4', createdAt: '', date: '', amount: 100, type: {id: 1}}, - ]; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ DetailsComponent ], - imports: [ MatDialogModule, HttpClientModule, MatListModule ], - providers: [ - { provide: MAT_DIALOG_DATA, useValue: {} }, - { provide: MatDialogRef, useValue: {} }, - { provide: TeamsService, useValue: mockTeamService } - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(DetailsComponent); - - component = fixture.componentInstance; - - component.data.user = { - id: 2, - balance: 46.64, - firstName: 'Rover', - lastName: 'Stiedeman', - user: null - } - - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should initialise the user', () => { - - - expect(component.data.user).not.toBeNull(); - }) - - it('should have a users transactions', () => { - expect(component.transactions).not.toBeNull(); - expect(component.transactions.length).toBe(4) - }) - - it('should display the users balance', () => { - const balance = 46.64; - component.data.user.balance = balance; - const el = fixture.debugElement.query(By.css('#userBalance')); - expect(el).not.toBeNull(); - expect(el.nativeElement.textContent.trim()).toEqual('Rover: €' + balance); - }) - - it('should display users transactions', () => { - const list = fixture.debugElement.query(By.css('#transactionsList')); - const htmlList = (list.nativeElement as HTMLElement).children; - expect(htmlList).not.toBeNull(); - expect(htmlList.length).toBe(4) - - - }) -}); - - diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.ts b/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.ts deleted file mode 100644 index 200cb66..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/overview/details/details.component.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Component, Inject, OnInit } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; -import { TeamsService } from '../../teams.service'; -import {MatListModule} from '@angular/material/list'; -import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; -import { CommonModule } from '@angular/common'; -import { TranslateModule, TranslatePipe } from '@ngx-translate/core'; - -@Component({ - selector: 'app-details', - templateUrl: './details.component.html', - styleUrls: ['./details.component.scss'], - standalone: true, - imports: [CommonModule, MatDialogModule, MatListModule, MatProgressSpinnerModule, TranslateModule], - providers: [] -}) -export class DetailsComponent implements OnInit { - - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: { user: any }, - private teamService: TeamsService - ) {} - - ngOnInit(): void { - console.log("Onmit") - this.teamService.loadTransactionsOfUser(this.data.user.id); - } - - get transactions(): any[] { - return this.teamService.selectedUserTransaction; - } - - get isLoading(): boolean { - return this.teamService.transactionsLoading; - } - -} diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/overview-routing.module.ts b/myteamwallet_frontend/src/app/modules/teams/overview/overview-routing.module.ts deleted file mode 100644 index b425c6a..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/overview/overview-routing.module.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { OverviewComponent } from './overview.component'; - -const routes: Routes = [ - { - path: '', component: OverviewComponent, pathMatch: 'full' - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class OverviewRoutingModule { } diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.html b/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.html deleted file mode 100644 index 983f851..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.html +++ /dev/null @@ -1,72 +0,0 @@ - - - {{ teamsService.team?.name }} - - - - -
- -
- Kontostand: {{ teamsService.team.balance | currency:'EUR' }} -
-
- Ausstehend: {{ teamsService.team.outstanding | currency:'EUR' }} -
-
- Total: {{ teamsService.team.outstanding + teamsService.team.balance | currency:'EUR' }} -
-
- - - -
- -
- - Suche - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Vorname {{element.firstName}} Nachname {{element.lastName}} Total Saldo {{element.balance | currency:'EUR' }} {{getTotalBalance() | currency:'EUR' }}
-
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.scss b/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.scss deleted file mode 100644 index 829518b..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.scss +++ /dev/null @@ -1,41 +0,0 @@ -:host { - width: 100vw; - height: 100%; -} - -.table-container { - position: relative; - min-height: 200px; - max-height: calc(100% - 280px); - width: calc(100vw - 48px); - margin: 12px 24px; - overflow: auto; -} - -.mat-mdc-table-sticky { - border-top: 1px solid #e0e0e0; -} - -.align-end { - text-align: end; - width: 120px; -} - -.team-info { - width: calc(100vw - 48px); - margin: 12px 24px; - height: 100px; - display: flex; - align-items: center; - justify-content: space-around; -} - -.blurr { - color: transparent; - text-shadow: 1px 1px 5px #000000; - pointer-events: none; -} - -.tr { - cursor: pointer; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.spec.ts b/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.spec.ts deleted file mode 100644 index 95d33c6..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { HttpClientModule } from '@angular/common/http'; -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatTableModule } from '@angular/material/table'; -import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { TeamsService } from '../teams.service'; - -import { OverviewComponent } from './overview.component'; - -describe('OverviewComponent', () => { - let component: OverviewComponent; - let fixture: ComponentFixture; - const mockTeamsService = jasmine.createSpyObj('TeamsService', ['']); - mockTeamsService.team = { players: []} - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ OverviewComponent ], - imports: [ HttpClientModule, MatDialogModule, MatToolbarModule, MatTableModule, MatTooltipModule ], - providers: [ - { provide: TeamsService, useValue: mockTeamsService } - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(OverviewComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should initialise the datasource', () => { - expect(component.dataSource).not.toBeNull(); - }) -}); -// this.teamsService.team.players \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.ts b/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.ts deleted file mode 100644 index db1120b..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/overview/overview.component.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { LiveAnnouncer } from '@angular/cdk/a11y'; -import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; -import { MatSort, Sort } from '@angular/material/sort'; -import { MatTableDataSource } from '@angular/material/table'; -import { Router } from '@angular/router'; -import { AuthService } from '../../auth.service'; -import { TeamsService } from '../teams.service'; -import { DetailsComponent } from './details/details.component'; -import { Player } from 'src/app/model'; -import { PenaltiesComponent } from '../../../shared/penalties/penalties.component'; - -@Component({ - selector: 'app-overview', - templateUrl: './overview.component.html', - styleUrls: ['./overview.component.scss'] -}) -export class OverviewComponent implements OnInit, AfterViewInit { - - displayedColumns: string[] = ['firstName', 'lastName', 'balance']; - dataSource: any; - - @ViewChild(MatSort) sort!: MatSort; - - constructor(public teamsService: TeamsService - , private _liveAnnouncer: LiveAnnouncer - , public dialog: MatDialog, private authService: AuthService - , private router: Router) {} - ngAfterViewInit(): void { - this.dataSource.sort = this.sort; - } - - - ngOnInit(): void { - if (this.teamsService.team && this.teamsService.team.players) { - this.dataSource = new MatTableDataSource(this.teamsService.team.players.filter((p: Player) => p.active)); - this.addCachedTeam(); - } - } - - addCachedTeam() { - let t = localStorage.getItem('cached_teams'); - let teams: any = {}; - if (t) { - teams = JSON.parse(t); - - } - const key = this.teamsService.team.alias as any; - const name = this.teamsService.team.name as any; - teams[key] = name; - localStorage.setItem('cached_teams', JSON.stringify(teams)); - } - - - getTotalBalance(): number { - if (!this.teamsService || !this.teamsService.team || !this.teamsService.team.players) { return 0 } - const sum = this.teamsService.team.players.filter((p: Player) => p.active).reduce((acc: any, succ: { balance: any; }) => acc + succ.balance, 0); - return sum; - } - /** Announce the change in sort state for assistive technology. */ - announceSortChange(sortState: any) { - // This example uses English messages. If your application supports - // multiple language, you would internationalize these strings. - // Furthermore, you can customize the message to add additional - // details about the values being sorted. - if (sortState.direction) { - this._liveAnnouncer.announce(`Sorted ${sortState.direction}ending`); - } else { - this._liveAnnouncer.announce('Sorting cleared'); - } - } - - openDetails(row: any) { - this.dialog.open(DetailsComponent, { - width: '500px', - enterAnimationDuration: 500, - data: { user: row } - }) - } - - onLoginClick() { - if (this.authService.isLoggedIn()) { return; } - - this.router.navigate(['auth']) - } - - - applyFilter(event: Event) { - const filterValue = (event.target as HTMLInputElement).value; - this.dataSource.filter = filterValue.trim().toLowerCase(); - } - - openPenalties() { - this.dialog.open(PenaltiesComponent, { - data: this.teamsService.team.id, - height: '80vh' - }) - } - -} diff --git a/myteamwallet_frontend/src/app/modules/teams/overview/overview.module.ts b/myteamwallet_frontend/src/app/modules/teams/overview/overview.module.ts deleted file mode 100644 index eb5a869..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/overview/overview.module.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import {MatToolbarModule} from '@angular/material/toolbar'; -import {MatTableModule} from '@angular/material/table'; -import {MatButtonModule} from '@angular/material/button'; -import { MatSortModule } from '@angular/material/sort'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatListModule} from '@angular/material/list'; -import {MatTooltipModule} from '@angular/material/tooltip'; -import {MatInputModule} from '@angular/material/input'; -import {MatFormFieldModule} from '@angular/material/form-field'; - -import { OverviewRoutingModule } from './overview-routing.module'; -import { OverviewComponent } from './overview.component'; -import { TeamsService } from '../teams.service'; -import { DetailsComponent } from './details/details.component'; -import { TranslateModule } from '@ngx-translate/core'; - - -@NgModule({ - declarations: [ - OverviewComponent, - ], - imports: [ - CommonModule, - OverviewRoutingModule, - MatToolbarModule, - MatTableModule, - MatSortModule, - MatButtonModule, - MatDialogModule, - MatListModule, - MatTooltipModule, - TranslateModule, - MatInputModule, - MatFormFieldModule, - DetailsComponent - ], - providers: [ TeamsService ], - exports: [ OverviewComponent ] -}) -export class OverviewModule { } diff --git a/myteamwallet_frontend/src/app/modules/teams/teams-routing.module.ts b/myteamwallet_frontend/src/app/modules/teams/teams-routing.module.ts deleted file mode 100644 index 1767e90..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/teams-routing.module.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { OverviewComponent } from './overview/overview.component'; -import { TeamsComponent } from './teams.component'; - -const routes: Routes = [ - { - path: ':hash', component: TeamsComponent - }, - { - path: 'overview', loadChildren: () => import('./overview/overview.module').then(m => m.OverviewModule) - } -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class TeamsRoutingModule { } diff --git a/myteamwallet_frontend/src/app/modules/teams/teams.component.html b/myteamwallet_frontend/src/app/modules/teams/teams.component.html deleted file mode 100644 index f8ba862..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/teams.component.html +++ /dev/null @@ -1,12 +0,0 @@ - -
-
- -
Loading Data...
-
-
-
- - - - \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/teams/teams.component.scss b/myteamwallet_frontend/src/app/modules/teams/teams.component.scss deleted file mode 100644 index 1214678..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/teams.component.scss +++ /dev/null @@ -1,11 +0,0 @@ -.loading-indicator { - display: flex; - align-items: center; - justify-content: center; - width: 100vw; - height: 100%; - - .loading-text { - margin-top: 24px; - } -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/modules/teams/teams.component.spec.ts b/myteamwallet_frontend/src/app/modules/teams/teams.component.spec.ts deleted file mode 100644 index 95b36a5..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/teams.component.spec.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { HttpClient } from '@angular/common/http'; -import { Component } from '@angular/core'; -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { ActivatedRoute, Router } from '@angular/router'; -import { of } from 'rxjs'; - -import { TeamsComponent } from './teams.component'; -import { TeamsService } from './teams.service'; - -describe('TeamsComponent', () => { - let component: TeamsComponent; - let fixture: ComponentFixture; - const mockRoute = jasmine.createSpyObj('ActivatedRoute', ['']); - const mockParam = jasmine.createSpyObj('P', ['get']); - mockParam.get.and.returnValue('abc'); - mockRoute.snapshot = { paramMap: mockParam }; - - const mockTeamService = jasmine.createSpyObj('TeamsService', ['']); - const mockRouter = jasmine.createSpyObj('Router', ['']); - const mockHttp = jasmine.createSpyObj('HttpClient', ['get']); - mockHttp.get.and.returnValue(of({})) - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ TeamsComponent, MockOverviewComponent ], - imports: [ MatProgressSpinnerModule ], - providers: [ - { provide: ActivatedRoute, useValue: mockRoute}, - { provide: Router, useValue: mockRouter}, - { provide: TeamsService, useValue: mockTeamService}, - { provide: HttpClient, useValue: mockHttp}, - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(TeamsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should load a team', () => { - expect(component.teamsService.team).not.toBeNull(); - }) -}); - -@Component({ - selector: 'app-overview', - template: '', -}) -class MockOverviewComponent { -} diff --git a/myteamwallet_frontend/src/app/modules/teams/teams.component.ts b/myteamwallet_frontend/src/app/modules/teams/teams.component.ts deleted file mode 100644 index 10e44c0..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/teams.component.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { HttpClient } from '@angular/common/http'; -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { environment } from 'src/environments/environment'; -import { TeamsService } from './teams.service'; - -@Component({ - selector: 'app-teams', - templateUrl: './teams.component.html', - styleUrls: ['./teams.component.scss'] -}) -export class TeamsComponent implements OnInit { - - constructor( - private route: ActivatedRoute, - private http: HttpClient, - private router: Router, - public teamsService: TeamsService) {} - -ngOnInit() { - const hash = this.route.snapshot.paramMap.get('hash'); - if (hash) { - this.loadTeamOverviewByAlias(hash); - } - -} - - private async loadTeamOverviewByAlias(alias: string) { - const url = `${environment.apiUrl}teams/` + alias; - this.http.get(url).subscribe(result => { - if (result) { - this.teamsService.team = result; - } else { - this.router.navigate(['/auth']) - } - }, error => { - this.router.navigate(['/auth']) - }) - } - -} diff --git a/myteamwallet_frontend/src/app/modules/teams/teams.module.ts b/myteamwallet_frontend/src/app/modules/teams/teams.module.ts deleted file mode 100644 index 9d90726..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/teams.module.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { HttpClientModule } from '@angular/common/http'; - -import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; - -import { TeamsRoutingModule } from './teams-routing.module'; -import { TeamsComponent } from './teams.component'; -import { TeamsService } from './teams.service'; -import { OverviewModule } from './overview/overview.module'; - - -@NgModule({ - declarations: [ - TeamsComponent - ], - imports: [ - CommonModule, - TeamsRoutingModule, - HttpClientModule, - OverviewModule, - MatProgressSpinnerModule - ], - providers: [ TeamsService ] -}) -export class TeamsModule { } diff --git a/myteamwallet_frontend/src/app/modules/teams/teams.service.spec.ts b/myteamwallet_frontend/src/app/modules/teams/teams.service.spec.ts deleted file mode 100644 index f9bfbad..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/teams.service.spec.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { HttpClientModule } from '@angular/common/http'; -import { TestBed } from '@angular/core/testing'; - -import { TeamsService } from './teams.service'; - -describe('TeamsService', () => { - let service: TeamsService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ HttpClientModule ] - }); - service = TestBed.inject(TeamsService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/myteamwallet_frontend/src/app/modules/teams/teams.service.ts b/myteamwallet_frontend/src/app/modules/teams/teams.service.ts deleted file mode 100644 index 4c4b888..0000000 --- a/myteamwallet_frontend/src/app/modules/teams/teams.service.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { HttpClient } from '@angular/common/http'; -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; -import { Transaction } from '../../model'; -import { environment } from 'src/environments/environment'; -import { TeamInvite } from './model/team-invite'; - -@Injectable({ - providedIn: 'root' -}) -export class TeamsService { - - team: any; - selectedUserTransaction: any[]; - transactionsLoading: boolean = false; - - constructor(private http: HttpClient) { - this.selectedUserTransaction = []; - } - - loadTransactionsOfUser(userId: number) { - this.transactionsLoading = true; - const url = `${environment.apiUrl}teams/${this.team.id}/${userId}`; - this.http.get(url).subscribe(res => { - this.selectedUserTransaction = res as any; - this.transactionsLoading = false; - }) - } - - loadTeamDetails(id: string): Observable { - return this.http.get(`${environment.apiUrl}teams/${id}`); - } - - createTransactions(transactions: any[]): Observable { - return this.http.post(`${environment.apiUrl}transactions`, transactions); - } - - reverseTransaction(transactionId: number): Observable { - return this.http.post(`${environment.apiUrl}transactions/${transactionId}/reverse`, {}); - } - - createTeamTransaction(transaction: any): Observable { - return this.http.post(`${environment.apiUrl}team-wallet-transactions`, transaction); - } - - createNewPlayer(teamId: number, player: {firstName: string, lastName: string, teamRole: number}) { - return this.http.post(`${environment.apiUrl}teams/${teamId}/players`, player); - } - - createRegisterLink(invite: TeamInvite): Observable { - return this.http.post(`${environment.apiUrl}auth/invite`, invite); - } - - validateRegistrationToken(token: string): Observable { - return this.http.post(`${environment.apiUrl}auth/verify-invite`, { token }); - } - - loadTeamsTransactions(id: number): Observable { - return this.http.get(`${environment.apiUrl}teams/${id}/transactions`); - } -} diff --git a/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.html b/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.html deleted file mode 100644 index 42b726d..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.html +++ /dev/null @@ -1,32 +0,0 @@ -
-
- - Vorname - - - - -
- -
- - Nachname - - -
- -
- - Rolle - - Spieler - zweiter Kassenwart - Kapitän - Kassenwart - Trainer - - -
- - -
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.scss b/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.scss deleted file mode 100644 index 2e8484f..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.scss +++ /dev/null @@ -1,16 +0,0 @@ -:host { - display: block; -} - -mat-form-field { - width: 100%; -} - -.form-field-container { - margin-bottom: 12px; -} - - -.mat-body{ - margin-bottom: 24px; -} diff --git a/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.spec.ts b/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.spec.ts deleted file mode 100644 index 7fe3868..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PlayerInfoFormComponent } from './player-info-form.component'; - -describe('PlayerInfoFormComponent', () => { - let component: PlayerInfoFormComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ PlayerInfoFormComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(PlayerInfoFormComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.ts b/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.ts deleted file mode 100644 index aeed5f7..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/components/player-info-form/player-info-form.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { Component } from '@angular/core'; -import { FormGroup, FormControl, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatOptionModule } from '@angular/material/core'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; - -@Component({ - selector: 'app-player-info-form', - templateUrl: './player-info-form.component.html', - styleUrls: ['./player-info-form.component.scss'], - standalone: true, - imports: [CommonModule, FormsModule, ReactiveFormsModule, MatFormFieldModule, MatOptionModule, MatSelectModule, MatInputModule] -}) -export class PlayerInfoFormComponent { - disableSelect = new FormControl(true); - - form = new FormGroup({ - firstName: new FormControl('', [Validators.required]), - lastName: new FormControl(null, [Validators.required]), - teamRole: new FormControl({value: 1, disabled: false}) - }); - - -} diff --git a/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.html b/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.html deleted file mode 100644 index 8484817..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.html +++ /dev/null @@ -1,36 +0,0 @@ -
- {{ text }} -
- -
-
- - Anmerkung - - Optionale Bemerkung / Erklärung - -
- - - Art der Buchung - - - {{ transactionType(t) }} - - - {{ description }} - - - - Betrag - - - als positiver Betrag, z. B. 12,50 - Bitte Betrag prüfen, maximal 10.000 € - Betrag muss größer als 0 € sein - - -
- Betrag gleichmäßig aufteilen -
-
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.scss b/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.scss deleted file mode 100644 index 73067af..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.scss +++ /dev/null @@ -1,28 +0,0 @@ -:host { - display: flex; - flex-direction: column; - overflow: hidden; -} - -.first { - margin-right: 2px; -} - -.second { - margin-left: 2px; -} - -.input_note { - width: 100%; - margin-bottom: 24px; -} - -.mat-body{ - margin-bottom: 24px; -} - -@media screen and (max-width: 700px) { - mat-form-field { - width: 100%; - } -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.spec.ts b/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.spec.ts deleted file mode 100644 index 81e86fe..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { TransactionFormComponent } from './transaction-form.component'; - -describe('TransactionFormComponent', () => { - let component: TransactionFormComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ TransactionFormComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(TransactionFormComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.ts b/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.ts deleted file mode 100644 index 8d78ef7..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/components/transaction-form/transaction-form.component.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { FormGroup, FormControl, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { TransactionType } from '../../new-transaction/model/transaction-type.enum'; -import { CommonModule } from '@angular/common'; -import { MatOptionModule } from '@angular/material/core'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatSelectModule } from '@angular/material/select'; -import { MatInputModule } from '@angular/material/input'; -import { MatButtonModule } from '@angular/material/button'; -import { MatSlideToggleModule } from '@angular/material/slide-toggle'; - -@Component({ - selector: 'app-transaction-form', - templateUrl: './transaction-form.component.html', - styleUrls: ['./transaction-form.component.scss'], - standalone: true, - imports: [ - CommonModule - , FormsModule - , ReactiveFormsModule - , MatFormFieldModule - , MatOptionModule - , MatSelectModule - , MatInputModule - , MatButtonModule - , MatSlideToggleModule - ] -}) -export class TransactionFormComponent { - - @Input('transactionTypes') transactionTypes = [TransactionType.credit, TransactionType.fee, TransactionType.fine, TransactionType.levy, TransactionType.payment]; - - @Input('totalSlider') showTotalSlider: boolean = true; - @Input('text') text: string | undefined; - - description = 'Art wählen'; - - translations = { - fee: 'Gebühr', - fine: 'Strafe', - levy: 'Umlage', - payment: 'Zahlung', - credit: 'Guthaben', - expense: 'Ausgabe' - } - - - form = new FormGroup({ - note: new FormControl('', []), - amount: new FormControl(null, [Validators.required, Validators.min(0.01), Validators.max(10000)]), - type: new FormControl(null, [Validators.required]), - total: new FormControl(false, []) - }); - - transactionType(id: number | null): string { - if (id == null) { return ''; } - const key: any = TransactionType[id]; - const t = this.translations as any; - return t[key]; - } - - onTypeChange() { - if (this.form.controls.type.value != null && this.form.controls.type.value < 10) { - this.description = 'Spieler bekommt Geld' - } else { - this.description = 'Spieler zahlt Geld' - } - - } - -} diff --git a/myteamwallet_frontend/src/app/shared/dialog/confirm-dialog/confirm-dialog.component.html b/myteamwallet_frontend/src/app/shared/dialog/confirm-dialog/confirm-dialog.component.html deleted file mode 100644 index c2a1875..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/confirm-dialog/confirm-dialog.component.html +++ /dev/null @@ -1,8 +0,0 @@ -

{{ data.title }}

-
-

{{ data.message }}

-
-
- - -
diff --git a/myteamwallet_frontend/src/app/shared/dialog/confirm-dialog/confirm-dialog.component.ts b/myteamwallet_frontend/src/app/shared/dialog/confirm-dialog/confirm-dialog.component.ts deleted file mode 100644 index 6dc2202..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/confirm-dialog/confirm-dialog.component.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { Component, Inject } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog'; - -@Component({ - selector: 'app-confirm-dialog', - templateUrl: './confirm-dialog.component.html', - standalone: true, - imports: [CommonModule, MatButtonModule, MatDialogModule] -}) -export class ConfirmDialogComponent { - - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: ConfirmDialogData, - ) {} - - confirm(): void { - this.dialogRef.close(true); - } - - cancel(): void { - this.dialogRef.close(false); - } -} - -export interface ConfirmDialogData { - title: string; - message: string; - confirmLabel?: string; - cancelLabel?: string; -} diff --git a/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.html b/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.html deleted file mode 100644 index e6e482c..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.html +++ /dev/null @@ -1,10 +0,0 @@ -

Spieler anlegen

- -
- -
- -
- - -
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.scss b/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.scss deleted file mode 100644 index 8bc9896..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.scss +++ /dev/null @@ -1,6 +0,0 @@ -:host { - display: flex; - overflow: hidden; - flex-direction: column; - padding: 8px 14px 8px 14px; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.spec.ts b/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.spec.ts deleted file mode 100644 index 65fdf25..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { CreatePlayerDialogComponent } from './create-player.dialog.component'; - -describe('CreatePlayerDialogComponent', () => { - let component: CreatePlayerDialogComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ CreatePlayerDialogComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(CreatePlayerDialogComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.ts b/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.ts deleted file mode 100644 index 24db26a..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/create-player-dialog/create-player.dialog.component.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { MatDialogRef } from '@angular/material/dialog'; -import { PlayerInfoFormComponent } from '../components/player-info-form/player-info-form.component'; -import { CommonModule } from '@angular/common'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatButtonModule } from '@angular/material/button'; - -@Component({ - selector: 'app-create-player.dialog', - templateUrl: './create-player.dialog.component.html', - styleUrls: ['./create-player.dialog.component.scss'], - standalone: true, - imports: [ CommonModule, PlayerInfoFormComponent, MatButtonModule ] -}) -export class CreatePlayerDialogComponent { - @ViewChild('formComponent') formComponent!: PlayerInfoFormComponent; - - constructor( - public dialogRef: MatDialogRef - ) {} - - - get disableSave(): boolean { - return !this.formComponent || !this.formComponent.form || this.formComponent?.form.invalid; - } - - close(save?: boolean) { - if (save) { - this.dialogRef.close(this.formComponent.form.value); - return; - } - - this.dialogRef.close(); - - } -} diff --git a/myteamwallet_frontend/src/app/shared/dialog/dialog.module.ts b/myteamwallet_frontend/src/app/shared/dialog/dialog.module.ts deleted file mode 100644 index b03af8d..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/dialog.module.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { NewTransactionDialogComponent } from './new-transaction/new-transaction.component'; -import { MatButtonModule } from '@angular/material/button'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSlideToggleModule } from '@angular/material/slide-toggle'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { TeamTransactionDialogComponent } from './team-transaction-dialog/team-transaction-dialog.component'; -import { TransactionFormComponent } from './components/transaction-form/transaction-form.component'; -import { CreatePlayerDialogComponent } from './create-player-dialog/create-player.dialog.component'; -import { PlayerInfoFormComponent } from './components/player-info-form/player-info-form.component'; -import { PrivilegesInfoDialogComponent } from './privileges-info-dialog/privileges-info-dialog.component'; -import { MatDialogModule } from '@angular/material/dialog'; -import { ShowTeamTransactionsComponent } from './show-team-transactions/show-team-transactions.component'; -import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; -import {MatTableModule} from '@angular/material/table'; -import { MatSortModule } from '@angular/material/sort'; -import { MatPaginatorModule } from '@angular/material/paginator'; - - -const components = [ ] - -@NgModule({ - declarations: [], - imports: [ - CommonModule, - MatFormFieldModule, - MatSelectModule, - MatInputModule, - MatButtonModule, - MatSlideToggleModule, - FormsModule, - ReactiveFormsModule, - MatDialogModule, - MatProgressSpinnerModule, - MatTableModule, - MatSortModule, - MatPaginatorModule, - PlayerInfoFormComponent, - TransactionFormComponent, - TeamTransactionDialogComponent, - PrivilegesInfoDialogComponent, - CreatePlayerDialogComponent, - ShowTeamTransactionsComponent, - NewTransactionDialogComponent - ], - exports: [ - PlayerInfoFormComponent, - TransactionFormComponent, - TeamTransactionDialogComponent, - PrivilegesInfoDialogComponent, - CreatePlayerDialogComponent, - ShowTeamTransactionsComponent, - NewTransactionDialogComponent - ] -}) -export class DialogModule { -} diff --git a/myteamwallet_frontend/src/app/shared/dialog/index.ts b/myteamwallet_frontend/src/app/shared/dialog/index.ts deleted file mode 100644 index 8ad253c..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './new-transaction/new-transaction.component'; -export * from './team-transaction-dialog/team-transaction-dialog.component'; \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/new-transaction/model/transaction-type.enum.ts b/myteamwallet_frontend/src/app/shared/dialog/new-transaction/model/transaction-type.enum.ts deleted file mode 100644 index 542c5cb..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/new-transaction/model/transaction-type.enum.ts +++ /dev/null @@ -1,8 +0,0 @@ -export enum TransactionType { - payment = 0, - credit = 1, - fine = 11, - levy = 12, - fee = 13, - expense = 14 -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.html b/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.html deleted file mode 100644 index 067de71..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.html +++ /dev/null @@ -1,27 +0,0 @@ -

Buchung anlegen

- -
-
Gewählte Spieler:
- -
{{ p.firstName }} {{ p.lastName }}
-
- + {{ data.players.length - 5 }} weitere -
-
- - -
Gesamte Mannschaft
-
-
- - -
- -
-
Jeder Spieler bekommt {{ transactionType }} über {{ amount | currency:'EUR' }}
-
- - - - - diff --git a/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.scss b/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.scss deleted file mode 100644 index f576fcd..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.scss +++ /dev/null @@ -1,30 +0,0 @@ -:host { - display: flex; - overflow: hidden; - flex-direction: column; - padding: 2px 4px 4px 4px; -} - -.selected_players { - padding: 2px; - border: 1px solid #ccc; - border-radius: 4px; - margin-bottom: 4px; - - .header { - background-color: #e7e7e7; - margin: -2px -2px 0 -2px; - padding: 2px; - text-align: center; - } -} - -.form { - margin-top: 20px; -} - -.summary { - margin-top: 32px; - margin-bottom: 20px; - text-align: center; -} diff --git a/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.spec.ts b/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.spec.ts deleted file mode 100644 index aa94111..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { forwardRef } from '@angular/core'; -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms'; -import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSlideToggleModule } from '@angular/material/slide-toggle'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; - -import { NewTransactionDialogComponent } from './new-transaction.component'; - -describe('NewTransactionDialogComponent', () => { - let component: NewTransactionDialogComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ NewTransactionDialogComponent ], - providers: [ - - { provide: MatDialogRef, useValue: {} }, - { provide: MAT_DIALOG_DATA, useValue: {} }, - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => NewTransactionDialogComponent), - multi: true, - } - ], - imports: [ - MatDialogModule, - MatFormFieldModule, - ReactiveFormsModule, - MatInputModule, - NoopAnimationsModule, - MatSelectModule, - FormsModule, - MatSlideToggleModule - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(NewTransactionDialogComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.ts b/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.ts deleted file mode 100644 index 12362e4..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/new-transaction/new-transaction.component.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { Component, Inject, OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; -import { MatDialog, MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; -import { Player } from 'src/app/model'; -import { Team } from 'src/app/modules/teams/model/team'; -import { TransactionFormComponent } from '../components/transaction-form/transaction-form.component'; -import { TransactionType } from './model/transaction-type.enum'; -import { CommonModule } from '@angular/common'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; -import { MatButtonModule } from '@angular/material/button'; -import { ConfirmDialogComponent } from '../confirm-dialog/confirm-dialog.component'; - -const HIGH_AMOUNT_CONFIRM_THRESHOLD = 300; - -@Component({ - selector: 'app-new-transaction', - templateUrl: './new-transaction.component.html', - styleUrls: ['./new-transaction.component.scss'], - standalone: true, - imports: [ - CommonModule - , TransactionFormComponent - , MatButtonModule - , MatDialogModule - ] -}) -export class NewTransactionDialogComponent implements OnInit { - - @ViewChild('formComponent') formComponent!: TransactionFormComponent; - - - selectedTransactionType: number | null = null; - - isTotal: boolean = false; - - constructor( - public dialogRef: MatDialogRef, - private dialog: MatDialog, - @Inject(MAT_DIALOG_DATA) public data: DialogData, - ) {} - - ngOnInit(): void { - } - - - close() { - this.dialogRef.close(); - } - - create() { - - const value = this.formComponent.form.value; - if (!value || value.amount == null || value.total == null || value.type == null) { return; } - let amount = value.total ? value.amount / this.data.players.length : value.amount; - amount = Math.round(amount * 100) / 100; - - let res: Transaction[] = []; - for (let p of this.data.players) { - res.push({ - amount, - playerId: p.id, - type: value.type as any, - note: value.note as any - }) - - - } - - if (value.amount >= HIGH_AMOUNT_CONFIRM_THRESHOLD) { - const confirmRef = this.dialog.open(ConfirmDialogComponent, { - data: { - title: 'Betrag prüfen', - message: `Es wird${this.data.players.length > 1 ? ' für jede:n der ' + this.data.players.length + ' gewählten Spieler:innen' : ''} ein Betrag von ${value.amount} € gebucht. Bitte kurz prüfen, bevor du fortfährst.`, - confirmLabel: 'Buchen' - } - }); - - confirmRef.afterClosed().subscribe(confirmed => { - if (confirmed) { - this.dialogRef.close(res); - } - }); - return; - } - - this.dialogRef.close(res); - - } - - get amount(): number { - const value = this.formComponent?.form?.value; - if (!value || value.amount == null) { return 0; } - return Math.round((value.total ? value.amount / this.data.players.length : value.amount) * 100) / 100; - } - - get transactionType(): string { - if (this.formComponent?.form?.value?.type == null) { return ''; } - return this.formComponent.transactionType(this.formComponent.form.value.type); - } - - get formValid(): boolean { - return this.formComponent?.form != null && this.formComponent.form.valid; - } - -} - - -interface DialogData { - team: Team, - players: Player[]; - all?: boolean; -} - -export interface Transaction { - playerId: Number; - amount: number; - type: TransactionType; - note: string; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.html b/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.html deleted file mode 100644 index 24b6811..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.html +++ /dev/null @@ -1,46 +0,0 @@ -

Berechtigungen nach Teamrolle

- - - -
- Für jeden Spieler kann ein Einladungslink erstellt werden, mit dem sich der Spieler registrieren und verknüpfen kann. - Jeder Link darf nur an einen Spieler gegeben werden, da jeder Spieler (pro Team) nur mit einem User-Account verbunden sein kann. - Derzeit ist eine Verlinkung nur mit einer neuen Registrierung möglich. Jeder User-Account erhält pro Team die Rolle seines zugeordneten Spielers. -
- -
Zweiter Kassenwart:
-
-
    -
  • Transaktionen und Buchungen anlegen
  • -
-
- -
Kassenwart:
-
-
    -
  • Transaktionen und Buchungen anlegen
  • -
  • Spieler anlegen & verwalten
  • -
  • Registrierungslinks erstellen
  • -
-
- -
Kapitän:
-
-
    -
  • Transaktionen und Buchungen anlegen
  • -
  • Spieler anlegen & verwalten
  • -
  • Registrierungslinks erstellen
  • -
-
- -
Trainer:
-
-
    -
  • Transaktionen und Buchungen anlegen
  • -
  • Spieler anlegen & verwalten
  • -
  • Registrierungslinks erstellen
  • -
-
- - -
\ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.scss b/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.scss deleted file mode 100644 index 0e1f964..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.scss +++ /dev/null @@ -1,9 +0,0 @@ -:host { - display: flex; - flex-direction: column; - max-width: 850px; -} - -.description{ - margin-bottom: 24px; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.spec.ts b/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.spec.ts deleted file mode 100644 index 2690444..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PrivilegesInfoDialogComponent } from './privileges-info-dialog.component'; - -describe('PrivilegesInfoDialogComponent', () => { - let component: PrivilegesInfoDialogComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ PrivilegesInfoDialogComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(PrivilegesInfoDialogComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.ts b/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.ts deleted file mode 100644 index 8d7a298..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/privileges-info-dialog/privileges-info-dialog.component.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { Component } from '@angular/core'; -import { MatDialogModule } from '@angular/material/dialog'; - -@Component({ - selector: 'app-privileges-info-dialog', - templateUrl: './privileges-info-dialog.component.html', - styleUrls: ['./privileges-info-dialog.component.scss'], - standalone: true, - imports: [CommonModule, MatDialogModule] -}) -export class PrivilegesInfoDialogComponent { - -} diff --git a/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.html b/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.html deleted file mode 100644 index a9730c3..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.html +++ /dev/null @@ -1,118 +0,0 @@ -
-
-

Alle Transaktionen

-

Buchungen des gesamten Teams

-
- - -
- - -
- - Transaktionen werden geladen … -
- -
- error_outline - Transaktionen konnten nicht geladen werden. - -
- - -
- - Transaktionen durchsuchen - search - - - - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Betrag - {{ element.amount | currency:'EUR' }} - Datum{{ element.date | date:'shortDate' }}Typ{{ element.type }}Notiz{{ element.note || '–' }}Spieler{{ element.playerName }} - -
- {{ input.value ? 'Keine passenden Transaktionen gefunden.' : 'Noch keine Transaktionen vorhanden.' }} -
-
- - - -
-
-
diff --git a/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.scss b/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.scss deleted file mode 100644 index f3e06aa..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.scss +++ /dev/null @@ -1,172 +0,0 @@ -:host { - display: block; - width: min(900px, 86vw); -} - -.dialog-header { - display: flex; - align-items: flex-start; - justify-content: space-between; - gap: 24px; - padding: 24px 24px 16px; - border-bottom: 1px solid var(--mat-divider-color, #e0e0e0); - - h2[mat-dialog-title] { - margin: 0; - padding: 0; - line-height: 1.25; - } -} - -.dialog-subtitle { - margin: 4px 0 0; - color: rgba(0, 0, 0, 0.6); -} - -.close-button { - flex: 0 0 auto; - margin: -8px -8px 0 0; -} - -mat-dialog-content { - display: flex; - height: min(70vh, 620px); - max-height: none; - flex-direction: column; - overflow: hidden; - padding: 20px 24px 24px !important; -} - -.dialog-state { - min-height: 260px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - gap: 16px; - color: rgba(0, 0, 0, 0.6); - text-align: center; -} - -.error-state { - mat-icon { - width: 44px; - height: 44px; - color: #ba1a1a; - font-size: 44px; - } - -} - -.table-toolbar { - flex: 0 0 auto; - display: flex; - align-items: center; - justify-content: space-between; - gap: 16px; - margin-bottom: 16px; - - mat-form-field { - flex: 1 1 360px; - max-width: 520px; - } -} - -.note-toggle { - flex: 0 0 auto; - - &.active { - color: var(--mat-sys-primary, #343dff); - background: #eef3ff; - } -} - -.table-shell { - display: flex; - min-height: 0; - flex: 1 1 auto; - flex-direction: column; - overflow: hidden; - border: 1px solid var(--mat-divider-color, #e0e0e0); - border-radius: 12px; - background: #fff; -} - -.table-scroll { - min-height: 0; - flex: 1 1 auto; - overflow: auto; -} - -table { - width: 100%; - min-width: 690px; -} - -th.mat-mdc-header-cell { - color: rgba(0, 0, 0, 0.68); - font-weight: 600; - white-space: nowrap; -} - -td.mat-mdc-cell { - border-bottom-color: rgba(0, 0, 0, 0.08); -} - -.amount-cell { - font-weight: 600; -} - -.note-cell { - min-width: 180px; - max-width: 320px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.actions-cell { - width: 48px; - padding-right: 8px; - text-align: right; -} - -.empty-row td { - height: 128px; - color: rgba(0, 0, 0, 0.6); - text-align: center; -} - -mat-paginator { - flex: 0 0 auto; - border-top: 1px solid var(--mat-divider-color, #e0e0e0); -} - -@media (max-width: 700px) { - :host { - width: 92vw; - } - - .dialog-header { - padding: 20px 16px 14px; - } - - mat-dialog-content { - height: min(72vh, 620px); - padding: 16px !important; - } - - .table-toolbar { - align-items: stretch; - flex-direction: column; - - mat-form-field { - flex-basis: auto; - max-width: none; - } - } - - .note-toggle { - align-self: flex-start; - } -} diff --git a/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.spec.ts b/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.spec.ts deleted file mode 100644 index ebf27b0..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ShowTeamTransactionsComponent } from './show-team-transactions.component'; - -describe('ShowTeamTransactionsComponent', () => { - let component: ShowTeamTransactionsComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ ShowTeamTransactionsComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ShowTeamTransactionsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.ts b/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.ts deleted file mode 100644 index f73a470..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/show-team-transactions/show-team-transactions.component.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { Component, Inject, OnInit, ViewChild } from '@angular/core'; -import { MAT_DIALOG_DATA, MatDialog, MatDialogModule } from '@angular/material/dialog'; -import { MatButtonModule } from '@angular/material/button'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSnackBar } from '@angular/material/snack-bar'; -import { MatSort, MatSortModule } from '@angular/material/sort'; -import { MatTableDataSource, MatTableModule } from '@angular/material/table'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { Transaction } from 'src/app/model'; -import { TeamsService } from 'src/app/modules/teams/teams.service'; -import { ConfirmDialogComponent } from '../confirm-dialog/confirm-dialog.component'; - -@Component({ - selector: 'app-show-team-transactions', - templateUrl: './show-team-transactions.component.html', - styleUrls: ['./show-team-transactions.component.scss'], - standalone: true, - imports: [ CommonModule, MatDialogModule, MatTableModule, MatSortModule, MatPaginatorModule, MatFormFieldModule, MatInputModule, MatProgressSpinnerModule, MatButtonModule, MatIconModule, MatTooltipModule ] -}) -export class ShowTeamTransactionsComponent implements OnInit { - - isLoading: boolean = true; - loadError: boolean = false; - - displayedColumns: string[] = ['amount', 'date', 'type', 'playerName', 'actions']; - dataSource: MatTableDataSource = new MatTableDataSource([]); - - private paginator?: MatPaginator; - private sort?: MatSort; - - @ViewChild(MatPaginator) - set matPaginator(paginator: MatPaginator | undefined) { - this.paginator = paginator; - if (paginator) { - this.dataSource.paginator = paginator; - } - } - - @ViewChild(MatSort) - set matSort(sort: MatSort | undefined) { - this.sort = sort; - if (sort) { - this.dataSource.sort = sort; - } - } - constructor(private teamService: TeamsService, - private dialog: MatDialog, - private snackBar: MatSnackBar, - @Inject(MAT_DIALOG_DATA) public data: DialogData,) {} - - ngOnInit(): void { - this.load(); - } - - load(): void { - this.isLoading = true; - this.loadError = false; - this.teamService.loadTeamsTransactions(this.data.id).subscribe({ - next: data => { - this.setupData(data); - }, - error: () => { - this.isLoading = false; - this.loadError = true; - } - }) - } - - setupData(data: Transaction[]) { - this.isLoading = false; - this.dataSource = new MatTableDataSource(data); - - if (this.paginator) { - this.dataSource.paginator = this.paginator; - } - if (this.sort) { - this.dataSource.sort = this.sort; - } - } - - applyFilter(event: Event) { - const filterValue = (event.target as HTMLInputElement).value; - this.dataSource.filter = filterValue.trim().toLowerCase(); - - if (this.dataSource.paginator) { - this.dataSource.paginator.firstPage(); - } - } - - reverseTransaction(transaction: Transaction) { - if (transaction.isTeamWalletTransaction || transaction.note?.startsWith('Stornierung von Buchung #')) { - return; - } - - const confirmRef = this.dialog.open(ConfirmDialogComponent, { - data: { - title: 'Buchung stornieren', - message: `Buchung über ${transaction.amount} € (${transaction.playerName}, ${transaction.type}) wirklich stornieren? Es wird eine Ausgleichsbuchung erstellt, die Originalbuchung bleibt sichtbar.`, - confirmLabel: 'Stornieren' - } - }); - - confirmRef.afterClosed().subscribe(confirmed => { - if (!confirmed) { return; } - - this.teamService.reverseTransaction(transaction.id).subscribe({ - next: () => { - this.snackBar.open('Buchung wurde storniert', undefined, { duration: 5000 }); - this.load(); - }, - error: (err) => { - const message = err?.error?.message || 'Buchung konnte nicht storniert werden'; - this.snackBar.open(message, undefined, { duration: 5000, panelClass: 'snackbar_error' }); - } - }); - }); - } - - toggleNote() { - const index = this.displayedColumns.indexOf('note'); - if (index != -1) { - this.displayedColumns = this.displayedColumns.filter(column => column !== 'note'); - } else { - this.displayedColumns = [...this.displayedColumns, 'note']; - } - } - -} - -interface DialogData { - id: number; -} diff --git a/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.html b/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.html deleted file mode 100644 index 83d190d..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.html +++ /dev/null @@ -1,10 +0,0 @@ -

Buchung anlegen

- - - - - - - \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.scss b/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.scss deleted file mode 100644 index 34d47c8..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.scss +++ /dev/null @@ -1,6 +0,0 @@ -:host { - display: flex; - overflow: hidden; - flex-direction: column; - padding: 2px 4px 4px 4px; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.spec.ts b/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.spec.ts deleted file mode 100644 index d1e4731..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { TeamTransactionDialogComponent } from './team-transaction-dialog.component'; - -describe('TeamTransactionDialogComponent', () => { - let component: TeamTransactionDialogComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ TeamTransactionDialogComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(TeamTransactionDialogComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.ts b/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.ts deleted file mode 100644 index e5ed721..0000000 --- a/myteamwallet_frontend/src/app/shared/dialog/team-transaction-dialog/team-transaction-dialog.component.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Component, Inject, ViewChild } from '@angular/core'; -import { FormGroup, FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; -import { TransactionFormComponent } from '../components/transaction-form/transaction-form.component'; -import { CommonModule } from '@angular/common'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatButtonModule } from '@angular/material/button'; - -@Component({ - selector: 'app-team-transaction-dialog', - templateUrl: './team-transaction-dialog.component.html', - styleUrls: ['./team-transaction-dialog.component.scss'], - standalone: true, - imports: [CommonModule, FormsModule, ReactiveFormsModule, MatFormFieldModule, TransactionFormComponent, MatButtonModule, MatDialogModule] -}) -export class TeamTransactionDialogComponent { - - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: DialogData, - ) {} - - @ViewChild('formComponent') formComponent!: TransactionFormComponent; - - explanation = 'Hier kann eine Ausgabe oder Einnahme des Teams gebucht werden.'; - - - onOkClick() { - const form = this.formComponent.form; - const transaction = { ...form.value, teamId: this.data.teamId }; - - if (transaction.amount != null && transaction.teamId != null && transaction.type != null) { - this.dialogRef.close(transaction); - } - - - } - - close(): void { - this.dialogRef.close(); - } - - get formInvalid(): boolean { - return !this.formComponent || !this.formComponent.form.value || this.formComponent.form.value.amount == null || - this.formComponent.form.value.total == null || this.formComponent.form.value.type == null; - } -} - -interface DialogData { - teamId: number; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/index.ts b/myteamwallet_frontend/src/app/shared/index.ts deleted file mode 100644 index bb01b0a..0000000 --- a/myteamwallet_frontend/src/app/shared/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './dialog'; \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/penalties/model/penalty.interface.ts b/myteamwallet_frontend/src/app/shared/penalties/model/penalty.interface.ts deleted file mode 100644 index 06bbf62..0000000 --- a/myteamwallet_frontend/src/app/shared/penalties/model/penalty.interface.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface Penalty { - id: number; - description: string; - createdAt: string; - amount: number; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/penalties/penalties.component.html b/myteamwallet_frontend/src/app/shared/penalties/penalties.component.html deleted file mode 100644 index cc16c1e..0000000 --- a/myteamwallet_frontend/src/app/shared/penalties/penalties.component.html +++ /dev/null @@ -1,19 +0,0 @@ -

Strafenkatalog

- -
- - Suche - - -
- @if(penalties.length > 0) { - - - {{ p.description }} - {{ p.amount | currency:'EUR' }} - - - } @else { -
Nix da...
- } -
diff --git a/myteamwallet_frontend/src/app/shared/penalties/penalties.component.scss b/myteamwallet_frontend/src/app/shared/penalties/penalties.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/myteamwallet_frontend/src/app/shared/penalties/penalties.component.spec.ts b/myteamwallet_frontend/src/app/shared/penalties/penalties.component.spec.ts deleted file mode 100644 index 7c9cda5..0000000 --- a/myteamwallet_frontend/src/app/shared/penalties/penalties.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PenaltiesComponent } from './penalties.component'; - -describe('PenaltiesComponent', () => { - let component: PenaltiesComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [PenaltiesComponent] - }) - .compileComponents(); - - fixture = TestBed.createComponent(PenaltiesComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/myteamwallet_frontend/src/app/shared/penalties/penalties.component.ts b/myteamwallet_frontend/src/app/shared/penalties/penalties.component.ts deleted file mode 100644 index 0d88e8d..0000000 --- a/myteamwallet_frontend/src/app/shared/penalties/penalties.component.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { HttpClient } from '@angular/common/http'; -import { Component, Inject, inject } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; -import { environment } from '../../../environments/environment'; -import { Penalty } from './model/penalty.interface'; -import { MatButtonModule } from '@angular/material/button'; -import { MatListModule } from '@angular/material/list'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatInputModule } from '@angular/material/input'; - -@Component({ - selector: 'app-penalties', - standalone: true, - imports: [MatDialogModule, MatButtonModule, MatListModule, CommonModule, MatInputModule, FormsModule, ReactiveFormsModule], - templateUrl: './penalties.component.html', - styleUrl: './penalties.component.scss' -}) -export class PenaltiesComponent { - - searchStr = ""; - - private http: HttpClient = inject(HttpClient); - public penalties: Penalty[] = []; - constructor( - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public teamId: string, - ) {} - - ngOnInit(): void { - this.loadPenalties(); - } - - get getPenalties(): any[] { - - return this.penalties.filter(p => p.description.toLocaleLowerCase().includes(this.searchStr.toLowerCase())) - return []; - } - - loadPenalties() { - const url = `${environment.apiUrl}penalty/` + this.teamId; - this.http.get(url).subscribe({ - next: n => { - this.penalties = n as Penalty[]; - } - }) - } - -} diff --git a/myteamwallet_frontend/src/app/shared/shared.module.ts b/myteamwallet_frontend/src/app/shared/shared.module.ts deleted file mode 100644 index e2f4c49..0000000 --- a/myteamwallet_frontend/src/app/shared/shared.module.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { UnderConstructionComponent } from './under-construction/under-construction.component'; -import { DialogModule } from './dialog/dialog.module'; - - -@NgModule({ - declarations: [ UnderConstructionComponent ], - imports: [ - CommonModule, - DialogModule - ], - exports: [ UnderConstructionComponent ] -}) -export class SharedModule { } diff --git a/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.html b/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.html deleted file mode 100644 index 92af98d..0000000 --- a/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.html +++ /dev/null @@ -1,4 +0,0 @@ - - -
Under Construction
-
please stand by for news
diff --git a/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.scss b/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.scss deleted file mode 100644 index 14df634..0000000 --- a/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.scss +++ /dev/null @@ -1,8 +0,0 @@ -:host { - width: 100vw; - height: 100vh; - display: flex; - justify-content: center; - flex-direction: column; - align-items: center; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.spec.ts b/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.spec.ts deleted file mode 100644 index 338a2ca..0000000 --- a/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { UnderConstructionComponent } from './under-construction.component'; - -describe('UnderConstructionComponent', () => { - let component: UnderConstructionComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ UnderConstructionComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(UnderConstructionComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.ts b/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.ts deleted file mode 100644 index 617f2d3..0000000 --- a/myteamwallet_frontend/src/app/shared/under-construction/under-construction.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-under-construction', - templateUrl: './under-construction.component.html', - styleUrls: ['./under-construction.component.scss'] -}) -export class UnderConstructionComponent { - -} diff --git a/myteamwallet_frontend/src/assets/.gitkeep b/myteamwallet_frontend/src/assets/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/myteamwallet_frontend/src/assets/favicon.png b/myteamwallet_frontend/src/assets/favicon.png deleted file mode 100644 index b92db6830bd5697c3e42fd1237d74e336ffe4b3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 926 zcmV;P17ZA$P)!FfITe`bYXA&9>f(@x^|=UOaL#{ zc@O3F0Wvw{7w|i}LcR)5MKs@FBUa(!;Q)?cQJwqvurzKyFC1-9nDsWk#fO-Nb1(-- zBf>{8rUvN4b7Al)9>>`D_<%y$dAJZi#m&#gI;A!ihmVIa4r|fV0)gI2XbT5>aT^8# zWIy_`suAS^9K+?6?i&1zXIlX8)dwp6XWSC<(|8{{hRN~4hP*E9zs6ij;jC`(d_bXW zPw3u_n{C6a(2c4@F?!a_e$INIP(2wq;`!`jBnrr zr4xLH=W!`|TerSeVaTBK&`-dLxYb@P3H@DorIDKb3ab+C4__zh0}nP*PU7L5^DjnN zDW!=@3+cc;O1*U83#BNRqpOv#Y05+1Smm%A^J8}_lWk?}sg35?r?6)n&Q(~sw4Mi> z1Vbw4r|@I!Q_4dhkG;9^px5DbrKRk|vgW{9q42o9GP+f%iy85MlF}L$U{ZrE+m$}` zmT2cg0OH`H2z52uMlnd*;%pyo$N1sS4PjAAX*}+Wh_)zW@k?dsQ>t?&W<^w+urcTS z*RV{$X*3O>30R^`v953|fR4oO$vOY|e~w%0KS6zlW1Z-|8vp A?f?J) diff --git a/myteamwallet_frontend/src/assets/screenshots/screen_mobile.png b/myteamwallet_frontend/src/assets/screenshots/screen_mobile.png deleted file mode 100644 index dd973c4839deb585cd55de00ad13049008e06a76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118299 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

IbJ9-pKpVX4Ia?{W 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 z�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
    {_z37Q*?Q-=zP= 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 diff --git a/myteamwallet_frontend/src/assets/sports.svg b/myteamwallet_frontend/src/assets/sports.svg deleted file mode 100644 index 5a14a15..0000000 --- a/myteamwallet_frontend/src/assets/sports.svg +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/myteamwallet_frontend/src/environments/environment.dev.ts b/myteamwallet_frontend/src/environments/environment.dev.ts deleted file mode 100644 index 0d3e58b..0000000 --- a/myteamwallet_frontend/src/environments/environment.dev.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const environment = { - production: false, - apiUrl: 'http://localhost:3999/api/v1/', - appVersion: require('../../package.json').version + '-dev', -}; \ No newline at end of file diff --git a/myteamwallet_frontend/src/environments/environment.prod.ts b/myteamwallet_frontend/src/environments/environment.prod.ts deleted file mode 100644 index f065de1..0000000 --- a/myteamwallet_frontend/src/environments/environment.prod.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const environment = { - production: true, - apiUrl: 'https://myteamwallet.de/api/v1/', - appVersion: require('../../package.json').version, -}; \ No newline at end of file diff --git a/myteamwallet_frontend/src/environments/environment.ts b/myteamwallet_frontend/src/environments/environment.ts deleted file mode 100644 index f065de1..0000000 --- a/myteamwallet_frontend/src/environments/environment.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const environment = { - production: true, - apiUrl: 'https://myteamwallet.de/api/v1/', - appVersion: require('../../package.json').version, -}; \ No newline at end of file diff --git a/myteamwallet_frontend/src/favicon.ico b/myteamwallet_frontend/src/favicon.ico deleted file mode 100644 index 997406ad22c29aae95893fb3d666c30258a09537..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 948 zcmV;l155mgP)CBYU7IjCFmI-B}4sMJt3^s9NVg!P0 z6hDQy(L`XWMkB@zOLgN$4KYz;j0zZxq9KKdpZE#5@k0crP^5f9KO};h)ZDQ%ybhht z%t9#h|nu0K(bJ ztIkhEr!*UyrZWQ1k2+YkGqDi8Z<|mIN&$kzpKl{cNP=OQzXHz>vn+c)F)zO|Bou>E z2|-d_=qY#Y+yOu1a}XI?cU}%04)zz%anD(XZC{#~WreV!a$7k2Ug`?&CUEc0EtrkZ zL49MB)h!_K{H(*l_93D5tO0;BUnvYlo+;yss%n^&qjt6fZOa+}+FDO(~2>G z2dx@=JZ?DHP^;b7*Y1as5^uphBsh*s*z&MBd?e@I>-9kU>63PjP&^#5YTOb&x^6Cf z?674rmSHB5Fk!{Gv7rv!?qX#ei_L(XtwVqLX3L}$MI|kJ*w(rhx~tc&L&xP#?cQow zX_|gx$wMr3pRZIIr_;;O|8fAjd;1`nOeu5K(pCu7>^3E&D2OBBq?sYa(%S?GwG&_0-s%_v$L@R!5H_fc)lOb9ZoOO#p`Nn`KU z3LTTBtjwo`7(HA6 z7gmO$yTR!5L>Bsg!X8616{JUngg_@&85%>W=mChTR;x4`P=?PJ~oPuy5 zU-L`C@_!34D21{fD~Y8NVnR3t;aqZI3fIhmgmx}$oc-dKDC6Ap$Gy>a!`A*x2L1v0 WcZ@i?LyX}70000 - - - - My Teamwallet - - - - - - - - - - - - - - diff --git a/myteamwallet_frontend/src/main.ts b/myteamwallet_frontend/src/main.ts deleted file mode 100644 index c58dc05..0000000 --- a/myteamwallet_frontend/src/main.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - -import { AppModule } from './app/app.module'; - - -platformBrowserDynamic().bootstrapModule(AppModule) - .catch(err => console.error(err)); diff --git a/myteamwallet_frontend/src/manifest.webmanifest b/myteamwallet_frontend/src/manifest.webmanifest deleted file mode 100644 index 2f8c355..0000000 --- a/myteamwallet_frontend/src/manifest.webmanifest +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "Teamwallet", - "short_name": "Teamwallet", - "description": "Teamwallet is a simple app to manage your team's expenses.", - "theme_color": "#000", - "background_color": "#000", - "display": "fullscreen", - "scope": "./", - "start_url": "./", - "icons": [ - { - "src": "assets/sports.svg", - "sizes": "150x150", - "type": "image/svg+xml", - "purpose": "any" - } - ], - "screenshots": [ - { - "src": "assets/screenshots/screen_mobile.png", - "sizes": "800x1748", - "type": "image/png", - "form_factor": "narrow", - "label": "Wonder Widgets" - }, - { - "src": "assets/screenshots/screen_wide.png", - "sizes": "2732x2048", - "type": "image/png", - "form_factor": "wide", - "label": "Wonder Widgets" - } - ] -} diff --git a/myteamwallet_frontend/src/styles.scss b/myteamwallet_frontend/src/styles.scss deleted file mode 100644 index e8de282..0000000 --- a/myteamwallet_frontend/src/styles.scss +++ /dev/null @@ -1,118 +0,0 @@ -/* You can add global styles to this file, and also import other style files */ - -@use '@angular/material' as mat; -@use './styles/theme'; -@use './styles/tokens'; - -@include mat.core(); - -html { - @include mat.all-component-themes(theme.$teamwallet-theme); - @include mat.typography-hierarchy(theme.$teamwallet-theme); -} - -html, body { height: 100%; overflow: hidden; } -body { margin: 0; font-family: Inter, Roboto, "Helvetica Neue", sans-serif; background-color: var(--tw-surface-bg); } - -app-root { - height: 100%; - overflow: hidden; - display: block; -} - -.table-row { - cursor: pointer; - background-color: white !important; - transition: background-color 0.4s ease-in-out; - - &:hover { - background-color: rgb(245, 245, 245) !important; - } -} - -/* custom scrollbar */ -::-webkit-scrollbar { - width: 20px; -} - -::-webkit-scrollbar-track { - background-color: transparent; -} - -::-webkit-scrollbar-thumb { - background-color: #d6dee1; - border-radius: 20px; - border: 6px solid transparent; - background-clip: content-box; -} - -::-webkit-scrollbar-thumb:hover { - background-color: #a8bbbf; -} - -.toolbar { - display: flex; - justify-content: space-between; -} - -.card { - padding: var(--tw-space-3); - box-shadow: var(--tw-elevation-1); - margin: var(--tw-space-1); - background-color: var(--tw-surface-card); - border-radius: var(--tw-radius-md); - - &.flat { - background-color: transparent; - box-shadow: none; - outline: #ddd solid 1px; - } -} - -.flex-row { - display: flex; - justify-content: space-between; - align-items: center; - flex-direction: row !important; -} - -.snackbar_error > .mdc-snackbar__surface { - background-color: var(--tw-balance-negative) !important; - - .mat-mdc-snack-bar-label { - color: white !important; - } -} - -.splitted_form { - display: flex; -} - -.first { - margin-right: 4px; -} - -.last { - margin-left: 4px; -} - -.middle { - margin-left: 4px; - margin-right: 4px; -} - -.spinner_container { - position: absolute; - width: 100%; - height: 100%; - background-color: rgba(50, 50, 50, 0.2); - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - z-index: 100; -} - -h1 { - font-size: 2rem !important; -} \ No newline at end of file diff --git a/myteamwallet_frontend/src/styles/_theme.scss b/myteamwallet_frontend/src/styles/_theme.scss deleted file mode 100644 index 9d1afa1..0000000 --- a/myteamwallet_frontend/src/styles/_theme.scss +++ /dev/null @@ -1,16 +0,0 @@ -@use '@angular/material' as mat; - -$teamwallet-theme: mat.define-theme(( - color: ( - theme-type: light, - primary: mat.$blue-palette, - tertiary: mat.$spring-green-palette, - ), - typography: ( - brand-family: 'Inter, Roboto, "Helvetica Neue", sans-serif', - plain-family: 'Inter, Roboto, "Helvetica Neue", sans-serif', - ), - density: ( - scale: 0, - ), -)); diff --git a/myteamwallet_frontend/src/styles/_tokens.scss b/myteamwallet_frontend/src/styles/_tokens.scss deleted file mode 100644 index 605bbd9..0000000 --- a/myteamwallet_frontend/src/styles/_tokens.scss +++ /dev/null @@ -1,30 +0,0 @@ -:root { - // Spacing (8px-Grid) - --tw-space-1: 4px; - --tw-space-2: 8px; - --tw-space-3: 12px; - --tw-space-4: 16px; - --tw-space-6: 24px; - --tw-space-8: 32px; - - // Radius - --tw-radius-sm: 8px; - --tw-radius-md: 12px; - --tw-radius-lg: 16px; - - // Elevation (ersetzt die bisher wiederholte box-shadow-Deklaration) - --tw-elevation-1: 0 1px 2px rgba(15, 23, 42, 0.06), 0 1px 3px rgba(15, 23, 42, 0.1); - --tw-elevation-2: 0 2px 4px rgba(15, 23, 42, 0.06), 0 4px 8px rgba(15, 23, 42, 0.1); - - // Semantische Saldo-Farben (fintech-modern: gedämpftes Grün/Rot statt Signalfarben) - --tw-balance-positive: #1b8a5a; - --tw-balance-negative: #c4351c; - --tw-balance-neutral: #64748b; - - // Flächen - --tw-surface-bg: #f7f8fa; - --tw-surface-card: #ffffff; - - // Angular Material's own app-level background variable should follow our token - --mat-app-background-color: var(--tw-surface-bg); -} diff --git a/myteamwallet_frontend/tsconfig.app.json b/myteamwallet_frontend/tsconfig.app.json deleted file mode 100644 index 374cc9d..0000000 --- a/myteamwallet_frontend/tsconfig.app.json +++ /dev/null @@ -1,14 +0,0 @@ -/* To learn more about this file see: https://angular.io/config/tsconfig. */ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/app", - "types": [] - }, - "files": [ - "src/main.ts" - ], - "include": [ - "src/**/*.d.ts" - ] -} diff --git a/myteamwallet_frontend/tsconfig.json b/myteamwallet_frontend/tsconfig.json deleted file mode 100644 index aba032a..0000000 --- a/myteamwallet_frontend/tsconfig.json +++ /dev/null @@ -1,36 +0,0 @@ -/* To learn more about this file see: https://angular.io/config/tsconfig. */ -{ - "compileOnSave": false, - "compilerOptions": { - "baseUrl": "./", - "outDir": "./dist/out-tsc", - "forceConsistentCasingInFileNames": true, - "strict": true, - "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "sourceMap": true, - "declaration": false, - "downlevelIteration": true, - "experimentalDecorators": true, - "moduleResolution": "node", - "importHelpers": true, - "target": "ES2022", - "module": "ES2022", - "useDefineForClassFields": false, - "lib": [ - "ES2022", - "dom" - ] - }, - "angularCompilerOptions": { - "enableI18nLegacyMessageIdFormat": false, - "strictInjectionParameters": true, - "strictInputAccessModifiers": true, - "strictTemplates": true, - }, - "include": [ - "public/*" - ] -} diff --git a/myteamwallet_frontend/tsconfig.spec.json b/myteamwallet_frontend/tsconfig.spec.json deleted file mode 100644 index be7e9da..0000000 --- a/myteamwallet_frontend/tsconfig.spec.json +++ /dev/null @@ -1,14 +0,0 @@ -/* To learn more about this file see: https://angular.io/config/tsconfig. */ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "./out-tsc/spec", - "types": [ - "jasmine" - ] - }, - "include": [ - "src/**/*.spec.ts", - "src/**/*.d.ts" - ] -}