From 066b1444af5e11e89a206e84ca0117006fee58ec Mon Sep 17 00:00:00 2001 From: Polianin Nikita Date: Sun, 2 Feb 2025 20:57:36 +0300 Subject: [PATCH] feat: add admin panel --- src/pages/admin/admin.component.css | 28 +++++++++++++ src/pages/admin/admin.component.html | 21 ++++++++++ src/pages/admin/admin.component.ts | 59 ++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 src/pages/admin/admin.component.css create mode 100644 src/pages/admin/admin.component.html create mode 100644 src/pages/admin/admin.component.ts diff --git a/src/pages/admin/admin.component.css b/src/pages/admin/admin.component.css new file mode 100644 index 0000000..5a1b09f --- /dev/null +++ b/src/pages/admin/admin.component.css @@ -0,0 +1,28 @@ +mat-sidenav-container { + min-height: 100vh; +} + +mat-sidenav { + width: auto; + min-width: 200px; + max-width: 20vw; +} + +mat-nav-list a { + display: flex; + align-items: center; + text-decoration: none; + padding: 10px 16px; + border-radius: 4px; + + mat-icon { + margin-right: 16px; + font-size: 24px; + vertical-align: middle; + line-height: 1; + } +} + +.active-link { + backdrop-filter: contrast(75%); +} diff --git a/src/pages/admin/admin.component.html b/src/pages/admin/admin.component.html new file mode 100644 index 0000000..9437392 --- /dev/null +++ b/src/pages/admin/admin.component.html @@ -0,0 +1,21 @@ + + + + + @for (link of navLinks; track $index) { + + {{ link.icon }} + {{ link.label }} + + } + + + + + + + diff --git a/src/pages/admin/admin.component.ts b/src/pages/admin/admin.component.ts new file mode 100644 index 0000000..82af7be --- /dev/null +++ b/src/pages/admin/admin.component.ts @@ -0,0 +1,59 @@ +import {Component} from '@angular/core'; +import {MatCard} from "@angular/material/card"; +import {MatSidenavModule} from "@angular/material/sidenav"; +import {HasRoleDirective} from "@/directives/has-role.directive"; +import {Router, RouterOutlet} from "@angular/router"; +import AuthApiService from "@api/v1/authApi.service"; +import {MatListItem, MatNavList} from "@angular/material/list"; +import {AuthRoles} from "@model/authRoles"; +import {MatIcon} from "@angular/material/icon"; + +@Component({ + selector: 'app-admin', + standalone: true, + imports: [ + MatCard, + HasRoleDirective, + MatNavList, + MatSidenavModule, + RouterOutlet, + MatListItem, + MatIcon, + ], + templateUrl: './admin.component.html', + styleUrl: './admin.component.css', + providers: [AuthApiService] +}) +export class AdminComponent { + navLinks = [ + {label: 'Расписание', route: 'schedule', icon: 'calendar_month'}, + {label: 'Институт', route: 'institute', icon: 'school'}, + {label: 'Аккаунт', route: 'account', icon: 'person'}, + {label: 'Сервер', route: 'server', icon: 'settings'}, + ]; + + constructor(private auth: AuthApiService, private router: Router) { + this.auth.getRole() + .subscribe(data => { + if (data === null) + router.navigate(['login']).then(); + }); + } + + isActive(route: string): boolean { + return this.router.isActive(`/admin/${route}`, { + paths: 'exact', + queryParams: 'ignored', + fragment: 'ignored', + matrixParams: 'ignored', + }); + } + + navigate(route: string): void { + if (!this.isActive(route)) { + this.router.navigate([`/admin/${route}`]).then(); + } + } + + protected readonly AuthRoles = AuthRoles; +}