Added short role names components #378
This commit is contained in:
parent
94e003312d
commit
8e8da46a54
@ -35,6 +35,7 @@ type Server implements TableWithHistoryQuery {
|
|||||||
shortRoleNames(filter: ShortRoleNameFilter, page: Page, sort: Sort): [ShortRoleName]
|
shortRoleNames(filter: ShortRoleNameFilter, page: Page, sort: Sort): [ShortRoleName]
|
||||||
|
|
||||||
config: ServerConfig
|
config: ServerConfig
|
||||||
|
hasFeatureFlag(flag: String): Boolean
|
||||||
|
|
||||||
createdAt: String
|
createdAt: String
|
||||||
modifiedAt: String
|
modifiedAt: String
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
|
from cpl_core.configuration import ConfigurationABC
|
||||||
from cpl_core.database.context import DatabaseContextABC
|
from cpl_core.database.context import DatabaseContextABC
|
||||||
from cpl_discord.service import DiscordBotServiceABC
|
from cpl_discord.service import DiscordBotServiceABC
|
||||||
|
|
||||||
|
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
|
||||||
|
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
|
||||||
from bot_data.abc.achievement_repository_abc import AchievementRepositoryABC
|
from bot_data.abc.achievement_repository_abc import AchievementRepositoryABC
|
||||||
from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC
|
from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC
|
||||||
from bot_data.abc.client_repository_abc import ClientRepositoryABC
|
from bot_data.abc.client_repository_abc import ClientRepositoryABC
|
||||||
@ -12,6 +15,7 @@ from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepos
|
|||||||
from bot_data.abc.user_joined_voice_channel_repository_abc import UserJoinedVoiceChannelRepositoryABC
|
from bot_data.abc.user_joined_voice_channel_repository_abc import UserJoinedVoiceChannelRepositoryABC
|
||||||
from bot_data.abc.user_repository_abc import UserRepositoryABC
|
from bot_data.abc.user_repository_abc import UserRepositoryABC
|
||||||
from bot_data.model.server import Server
|
from bot_data.model.server import Server
|
||||||
|
from bot_data.model.server_config import ServerConfig
|
||||||
from bot_data.model.server_history import ServerHistory
|
from bot_data.model.server_history import ServerHistory
|
||||||
from bot_graphql.abc.data_query_with_history_abc import DataQueryWithHistoryABC
|
from bot_graphql.abc.data_query_with_history_abc import DataQueryWithHistoryABC
|
||||||
from bot_graphql.filter.achievement_filter import AchievementFilter
|
from bot_graphql.filter.achievement_filter import AchievementFilter
|
||||||
@ -25,6 +29,7 @@ from bot_graphql.filter.user_filter import UserFilter
|
|||||||
class ServerQuery(DataQueryWithHistoryABC):
|
class ServerQuery(DataQueryWithHistoryABC):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
|
config: ConfigurationABC,
|
||||||
bot: DiscordBotServiceABC,
|
bot: DiscordBotServiceABC,
|
||||||
db: DatabaseContextABC,
|
db: DatabaseContextABC,
|
||||||
auto_roles: AutoRoleRepositoryABC,
|
auto_roles: AutoRoleRepositoryABC,
|
||||||
@ -40,6 +45,7 @@ class ServerQuery(DataQueryWithHistoryABC):
|
|||||||
):
|
):
|
||||||
DataQueryWithHistoryABC.__init__(self, "Server", "ServersHistory", ServerHistory, db)
|
DataQueryWithHistoryABC.__init__(self, "Server", "ServersHistory", ServerHistory, db)
|
||||||
|
|
||||||
|
self._config = config
|
||||||
self._bot = bot
|
self._bot = bot
|
||||||
self._auto_roles = auto_roles
|
self._auto_roles = auto_roles
|
||||||
self._clients = clients
|
self._clients = clients
|
||||||
@ -73,6 +79,9 @@ class ServerQuery(DataQueryWithHistoryABC):
|
|||||||
ShortRoleNameFilter,
|
ShortRoleNameFilter,
|
||||||
)
|
)
|
||||||
self.set_field("config", lambda server, *_: server_configs.get_server_config_by_server(server.id))
|
self.set_field("config", lambda server, *_: server_configs.get_server_config_by_server(server.id))
|
||||||
|
self.set_field(
|
||||||
|
"hasFeatureFlag", lambda server, *_, **kwargs: self._resolve_has_feature_flag(server, *_, **kwargs)
|
||||||
|
)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def resolve_id(server: Server, *_):
|
def resolve_id(server: Server, *_):
|
||||||
@ -89,3 +98,9 @@ class ServerQuery(DataQueryWithHistoryABC):
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
def resolve_icon_url(server: Server, *_):
|
def resolve_icon_url(server: Server, *_):
|
||||||
return server.icon_url
|
return server.icon_url
|
||||||
|
|
||||||
|
def _resolve_has_feature_flag(self, server: Server, *_, **kwargs):
|
||||||
|
settings: ServerConfig = self._config.get_configuration(f"ServerConfig_{server.discord_id}")
|
||||||
|
if "flag" not in kwargs:
|
||||||
|
return False
|
||||||
|
return FeatureFlagsSettings.get_flag_from_dict(settings.feature_flags, FeatureFlagsEnum(kwargs["flag"]))
|
||||||
|
@ -3,6 +3,7 @@ import {User} from "./user.model";
|
|||||||
import {Level} from "./level.model";
|
import {Level} from "./level.model";
|
||||||
import {Client} from "./client.model";
|
import {Client} from "./client.model";
|
||||||
import { AutoRole } from "./auto_role.model";
|
import { AutoRole } from "./auto_role.model";
|
||||||
|
import { ServerConfig } from "../config/server-config.model";
|
||||||
|
|
||||||
export interface GameServer {
|
export interface GameServer {
|
||||||
id?: number;
|
id?: number;
|
||||||
@ -22,6 +23,8 @@ export interface Server extends Data {
|
|||||||
levels?: Level[];
|
levels?: Level[];
|
||||||
userCount?: number;
|
userCount?: number;
|
||||||
users?: User[];
|
users?: User[];
|
||||||
|
config?: ServerConfig;
|
||||||
|
hasFeatureFlag?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ServerFilter {
|
export interface ServerFilter {
|
||||||
|
@ -82,6 +82,14 @@ export class Queries {
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
static hasServerFeatureFlag = `
|
||||||
|
query HasServerFeatureFlag($filter: ServerFilter, $flag: String) {
|
||||||
|
servers(filter: $filter) {
|
||||||
|
hasFeatureFlag(flag: $flag)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
static gameServerQuery = `
|
static gameServerQuery = `
|
||||||
query GameServersList($serverId: ID) {
|
query GameServersList($serverId: ID) {
|
||||||
servers(filter: {id: $serverId}) {
|
servers(filter: {id: $serverId}) {
|
||||||
|
@ -64,3 +64,7 @@ export interface PossibleFeatureFlagsQuery {
|
|||||||
possibleFeatureFlags: string[];
|
possibleFeatureFlags: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface HasServerFeatureFlagQuery {
|
||||||
|
hasFeatureFlag: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ import { FormBuilder } from "@angular/forms";
|
|||||||
import { TranslateService } from "@ngx-translate/core";
|
import { TranslateService } from "@ngx-translate/core";
|
||||||
import { ActivatedRoute } from "@angular/router";
|
import { ActivatedRoute } from "@angular/router";
|
||||||
import { SidebarService } from "../../../../services/sidebar/sidebar.service";
|
import { SidebarService } from "../../../../services/sidebar/sidebar.service";
|
||||||
|
import { ServerService } from "../../../../services/server.service";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: "app-history-btn",
|
selector: "app-history-btn",
|
||||||
@ -37,12 +38,12 @@ export class HistoryBtnComponent implements OnInit {
|
|||||||
private translate: TranslateService,
|
private translate: TranslateService,
|
||||||
private data: DataService,
|
private data: DataService,
|
||||||
private route: ActivatedRoute,
|
private route: ActivatedRoute,
|
||||||
private sidebar: SidebarService
|
private serverService: ServerService
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public ngOnInit(): void {
|
public ngOnInit(): void {
|
||||||
this.server = this.sidebar.server$.value ?? {};
|
this.server = this.serverService.server$.value ?? {};
|
||||||
}
|
}
|
||||||
|
|
||||||
private findVal(object: any, key: string) {
|
private findVal(object: any, key: string) {
|
||||||
|
@ -14,6 +14,7 @@ import { Page } from "../../../../../models/graphql/filter/page.model";
|
|||||||
import { Sort } from "../../../../../models/graphql/filter/sort.model";
|
import { Sort } from "../../../../../models/graphql/filter/sort.model";
|
||||||
import { Query } from "../../../../../models/graphql/query.model";
|
import { Query } from "../../../../../models/graphql/query.model";
|
||||||
import { SidebarService } from "../../../../../services/sidebar/sidebar.service";
|
import { SidebarService } from "../../../../../services/sidebar/sidebar.service";
|
||||||
|
import { ServerService } from "../../../../../services/server.service";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: "app-dashboard",
|
selector: "app-dashboard",
|
||||||
@ -44,12 +45,9 @@ export class DashboardComponent implements OnInit, OnDestroy {
|
|||||||
constructor(
|
constructor(
|
||||||
private data: DataService,
|
private data: DataService,
|
||||||
private spinnerService: SpinnerService,
|
private spinnerService: SpinnerService,
|
||||||
private toastService: ToastService,
|
|
||||||
private confirmDialog: ConfirmationDialogService,
|
|
||||||
private fb: FormBuilder,
|
private fb: FormBuilder,
|
||||||
private translate: TranslateService,
|
|
||||||
private router: Router,
|
private router: Router,
|
||||||
private sidebar: SidebarService
|
private serverService: ServerService,
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,7 +105,7 @@ export class DashboardComponent implements OnInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
selectServer(server: Server) {
|
selectServer(server: Server) {
|
||||||
this.sidebar.setServer(server);
|
this.serverService.setServer(server);
|
||||||
this.router.navigate(["/server", server.id]);
|
this.router.navigate(["/server", server.id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,22 +14,22 @@
|
|||||||
<div class="server-list">
|
<div class="server-list">
|
||||||
<div class="server">
|
<div class="server">
|
||||||
<div class="logo">
|
<div class="logo">
|
||||||
<img *ngIf="server.iconURL" [src]="server.iconURL">
|
<img *ngIf="server ? server.iconURL : ''" [src]="server ? server.iconURL : ''">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<h3 class="name">
|
<h3 class="name">
|
||||||
{{server.name}}
|
{{server ? server.name : ''}}
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<div class="data">
|
<div class="data">
|
||||||
<i class="pi pi-users"></i>
|
<i class="pi pi-users"></i>
|
||||||
{{server.userCount}}
|
{{server ? server.userCount : ''}}
|
||||||
{{'view.dashboard.server.member_count' | translate}}
|
{{'view.dashboard.server.member_count' | translate}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="client-data"
|
<div class="client-data"
|
||||||
*ngFor="let client of server.clients">
|
*ngFor="let client of server?.clients">
|
||||||
<app-client class="client-component" [client]="client"></app-client>
|
<app-client class="client-component" [client]="client"></app-client>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -4,6 +4,7 @@ import { Server } from "src/app/models/data/server.model";
|
|||||||
import { DataService } from "src/app/services/data/data.service";
|
import { DataService } from "src/app/services/data/data.service";
|
||||||
import { SpinnerService } from "src/app/services/spinner/spinner.service";
|
import { SpinnerService } from "src/app/services/spinner/spinner.service";
|
||||||
import { SidebarService } from "../../../../services/sidebar/sidebar.service";
|
import { SidebarService } from "../../../../services/sidebar/sidebar.service";
|
||||||
|
import { ServerService } from "../../../../services/server.service";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: "app-server-dashboard",
|
selector: "app-server-dashboard",
|
||||||
@ -20,7 +21,7 @@ export class ServerDashboardComponent implements OnInit {
|
|||||||
private router: Router,
|
private router: Router,
|
||||||
private data: DataService,
|
private data: DataService,
|
||||||
private spinner: SpinnerService,
|
private spinner: SpinnerService,
|
||||||
private sidebar: SidebarService
|
private serverService: ServerService
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -29,7 +30,7 @@ export class ServerDashboardComponent implements OnInit {
|
|||||||
this.server = server;
|
this.server = server;
|
||||||
});
|
});
|
||||||
|
|
||||||
this.sidebar.server$.subscribe(server => {
|
this.serverService.server$.subscribe(server => {
|
||||||
if (!server) {
|
if (!server) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -17,8 +17,9 @@ const routes: Routes = [
|
|||||||
data: { memberRole: MemberRoles.Moderator }
|
data: { memberRole: MemberRoles.Moderator }
|
||||||
},
|
},
|
||||||
{ path: "levels", loadChildren: () => import("./levels/levels.module").then(m => m.LevelsModule), canActivate: [AuthGuard], data: { memberRole: MemberRoles.Moderator } },
|
{ path: "levels", loadChildren: () => import("./levels/levels.module").then(m => m.LevelsModule), canActivate: [AuthGuard], data: { memberRole: MemberRoles.Moderator } },
|
||||||
{ path: "achievements", loadChildren: () => import("./achievements/achievements.module").then(m => m.AchievementsModule), data: { memberRole: MemberRoles.Moderator } },
|
{ path: "achievements", loadChildren: () => import("./achievements/achievements.module").then(m => m.AchievementsModule), canActivate: [AuthGuard], data: { memberRole: MemberRoles.Moderator } },
|
||||||
{ path: "config", loadChildren: () => import("./config/config.module").then(m => m.ConfigModule), data: { memberRole: MemberRoles.Admin } }
|
{ path: "short-role-names", loadChildren: () => import("./short-role-name/short-role-name.module").then(m => m.ShortRoleNameModule), canActivate: [AuthGuard], data: { memberRole: MemberRoles.Moderator } },
|
||||||
|
{ path: "config", loadChildren: () => import("./config/config.module").then(m => m.ConfigModule), canActivate: [AuthGuard], data: { memberRole: MemberRoles.Admin } }
|
||||||
];
|
];
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
|
@ -14,7 +14,7 @@ import { ClientComponent } from './server-dashboard/components/client/client.com
|
|||||||
ServerDashboardComponent,
|
ServerDashboardComponent,
|
||||||
ProfileComponent,
|
ProfileComponent,
|
||||||
MembersComponent,
|
MembersComponent,
|
||||||
ClientComponent
|
ClientComponent,
|
||||||
],
|
],
|
||||||
imports: [
|
imports: [
|
||||||
CommonModule,
|
CommonModule,
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
<p>short-role-names works!</p>
|
@ -0,0 +1,23 @@
|
|||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { ShortRoleNamesComponent } from './short-role-names.component';
|
||||||
|
|
||||||
|
describe('ShortRoleNamesComponent', () => {
|
||||||
|
let component: ShortRoleNamesComponent;
|
||||||
|
let fixture: ComponentFixture<ShortRoleNamesComponent>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
declarations: [ ShortRoleNamesComponent ]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
|
||||||
|
fixture = TestBed.createComponent(ShortRoleNamesComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,39 @@
|
|||||||
|
import { Component, OnInit } from "@angular/core";
|
||||||
|
import { AuthService } from "../../../../../../services/auth/auth.service";
|
||||||
|
import { SpinnerService } from "../../../../../../services/spinner/spinner.service";
|
||||||
|
import { ToastService } from "../../../../../../services/toast/toast.service";
|
||||||
|
import { ConfirmationDialogService } from "../../../../../../services/confirmation-dialog/confirmation-dialog.service";
|
||||||
|
import { FormBuilder } from "@angular/forms";
|
||||||
|
import { TranslateService } from "@ngx-translate/core";
|
||||||
|
import { DataService } from "../../../../../../services/data/data.service";
|
||||||
|
import { SidebarService } from "../../../../../../services/sidebar/sidebar.service";
|
||||||
|
import { ActivatedRoute } from "@angular/router";
|
||||||
|
import { Server } from "../../../../../../models/data/server.model";
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-short-role-names',
|
||||||
|
templateUrl: './short-role-names.component.html',
|
||||||
|
styleUrls: ['./short-role-names.component.scss']
|
||||||
|
})
|
||||||
|
export class ShortRoleNamesComponent implements OnInit {
|
||||||
|
private server: Server = {};
|
||||||
|
|
||||||
|
public constructor(
|
||||||
|
private authService: AuthService,
|
||||||
|
private spinner: SpinnerService,
|
||||||
|
private toastService: ToastService,
|
||||||
|
private confirmDialog: ConfirmationDialogService,
|
||||||
|
private fb: FormBuilder,
|
||||||
|
private translate: TranslateService,
|
||||||
|
private data: DataService,
|
||||||
|
private sidebar: SidebarService,
|
||||||
|
private route: ActivatedRoute
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public ngOnInit(): void {
|
||||||
|
this.data.getServerFromRoute(this.route).then(async server => {
|
||||||
|
this.server = server;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
import { NgModule } from "@angular/core";
|
||||||
|
import { RouterModule, Routes } from "@angular/router";
|
||||||
|
import { ShortRoleNamesComponent } from "./components/short-role-names/short-role-names.component";
|
||||||
|
|
||||||
|
const routes: Routes = [
|
||||||
|
{ path: "", component: ShortRoleNamesComponent },
|
||||||
|
];
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
imports: [RouterModule.forChild(routes)],
|
||||||
|
exports: [RouterModule]
|
||||||
|
})
|
||||||
|
export class ShortRoleNameRoutingModule {
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
import { NgModule } from '@angular/core';
|
||||||
|
import { CommonModule } from '@angular/common';
|
||||||
|
import { ShortRoleNamesComponent } from './components/short-role-names/short-role-names.component';
|
||||||
|
import { ShortRoleNameRoutingModule } from "./short-role-name-routing.module";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
declarations: [
|
||||||
|
ShortRoleNamesComponent,
|
||||||
|
],
|
||||||
|
imports: [
|
||||||
|
CommonModule,
|
||||||
|
ShortRoleNameRoutingModule
|
||||||
|
]
|
||||||
|
})
|
||||||
|
export class ShortRoleNameModule { }
|
@ -7,11 +7,11 @@ import { ActivatedRoute, Router } from "@angular/router";
|
|||||||
import { Server } from "../../models/data/server.model";
|
import { Server } from "../../models/data/server.model";
|
||||||
import { Queries } from "../../models/graphql/queries.model";
|
import { Queries } from "../../models/graphql/queries.model";
|
||||||
import { Query } from "../../models/graphql/query.model";
|
import { Query } from "../../models/graphql/query.model";
|
||||||
import { SidebarService } from "../sidebar/sidebar.service";
|
|
||||||
import { SpinnerService } from "../spinner/spinner.service";
|
import { SpinnerService } from "../spinner/spinner.service";
|
||||||
import { GraphQLResult } from "../../models/graphql/result.model";
|
import { GraphQLResult } from "../../models/graphql/result.model";
|
||||||
import { ToastService } from "../toast/toast.service";
|
import { ToastService } from "../toast/toast.service";
|
||||||
import { TranslateService } from "@ngx-translate/core";
|
import { TranslateService } from "@ngx-translate/core";
|
||||||
|
import { ServerService } from "../server.service";
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
providedIn: "root"
|
providedIn: "root"
|
||||||
@ -21,7 +21,7 @@ export class DataService {
|
|||||||
constructor(
|
constructor(
|
||||||
private appsettings: SettingsService,
|
private appsettings: SettingsService,
|
||||||
private http: HttpClient,
|
private http: HttpClient,
|
||||||
private sidebar: SidebarService,
|
private server: ServerService,
|
||||||
private spinner: SpinnerService,
|
private spinner: SpinnerService,
|
||||||
private router: Router,
|
private router: Router,
|
||||||
private toast: ToastService,
|
private toast: ToastService,
|
||||||
@ -45,7 +45,7 @@ export class DataService {
|
|||||||
return data.servers.length > 0 ? data.servers[0] : null;
|
return data.servers.length > 0 ? data.servers[0] : null;
|
||||||
}
|
}
|
||||||
).subscribe(server => {
|
).subscribe(server => {
|
||||||
this.sidebar.setServer(server);
|
this.server.setServer(server);
|
||||||
this.spinner.hideSpinner();
|
this.spinner.hideSpinner();
|
||||||
resolve(server);
|
resolve(server);
|
||||||
});
|
});
|
||||||
|
16
kdb-web/src/app/services/server.service.spec.ts
Normal file
16
kdb-web/src/app/services/server.service.spec.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { ServerService } from './server.service';
|
||||||
|
|
||||||
|
describe('ServerService', () => {
|
||||||
|
let service: ServerService;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
TestBed.configureTestingModule({});
|
||||||
|
service = TestBed.inject(ServerService);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be created', () => {
|
||||||
|
expect(service).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
36
kdb-web/src/app/services/server.service.ts
Normal file
36
kdb-web/src/app/services/server.service.ts
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import { Injectable } from "@angular/core";
|
||||||
|
import { BehaviorSubject } from "rxjs";
|
||||||
|
import { Server } from "../models/data/server.model";
|
||||||
|
import { NavigationEnd, Router } from "@angular/router";
|
||||||
|
|
||||||
|
@Injectable({
|
||||||
|
providedIn: "root"
|
||||||
|
})
|
||||||
|
export class ServerService {
|
||||||
|
|
||||||
|
|
||||||
|
server$ = new BehaviorSubject<Server | null>(null);
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
private router: Router
|
||||||
|
) {
|
||||||
|
this.router.events.subscribe(event => {
|
||||||
|
if (!(event instanceof NavigationEnd)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!event.url.startsWith("/server/") && this.server$.value) {
|
||||||
|
this.setServer(null);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setServer(server: Server | null) {
|
||||||
|
if (!server) {
|
||||||
|
this.server$.next(server);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (server.id != this.server$.value?.id) {
|
||||||
|
this.server$.next(server);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -8,6 +8,7 @@ import { NavigationEnd, Router } from "@angular/router";
|
|||||||
import { ThemeService } from "../theme/theme.service";
|
import { ThemeService } from "../theme/theme.service";
|
||||||
import { Server } from "../../models/data/server.model";
|
import { Server } from "../../models/data/server.model";
|
||||||
import { UserDTO } from "../../models/auth/auth-user.dto";
|
import { UserDTO } from "../../models/auth/auth-user.dto";
|
||||||
|
import { ServerService } from "../server.service";
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
providedIn: "root"
|
providedIn: "root"
|
||||||
@ -16,7 +17,7 @@ export class SidebarService {
|
|||||||
|
|
||||||
isSidebarOpen: boolean = true;
|
isSidebarOpen: boolean = true;
|
||||||
menuItems$ = new BehaviorSubject<MenuItem[]>(new Array<MenuItem>());
|
menuItems$ = new BehaviorSubject<MenuItem[]>(new Array<MenuItem>());
|
||||||
server$ = new BehaviorSubject<Server | null>(null);
|
server!: Server | null;
|
||||||
|
|
||||||
dashboard: MenuItem = {};
|
dashboard: MenuItem = {};
|
||||||
serverDashboard: MenuItem = {};
|
serverDashboard: MenuItem = {};
|
||||||
@ -25,6 +26,7 @@ export class SidebarService {
|
|||||||
serverAutoRoles: MenuItem = {};
|
serverAutoRoles: MenuItem = {};
|
||||||
serverLevels: MenuItem = {};
|
serverLevels: MenuItem = {};
|
||||||
serverAchievements: MenuItem = {};
|
serverAchievements: MenuItem = {};
|
||||||
|
serverShortRoleNames: MenuItem = {};
|
||||||
serverConfig: MenuItem = {};
|
serverConfig: MenuItem = {};
|
||||||
serverMenu: MenuItem = {};
|
serverMenu: MenuItem = {};
|
||||||
adminConfig: MenuItem = {};
|
adminConfig: MenuItem = {};
|
||||||
@ -35,7 +37,8 @@ export class SidebarService {
|
|||||||
private themeService: ThemeService,
|
private themeService: ThemeService,
|
||||||
private authService: AuthService,
|
private authService: AuthService,
|
||||||
private translateService: TranslateService,
|
private translateService: TranslateService,
|
||||||
private router: Router
|
private router: Router,
|
||||||
|
private serverService: ServerService
|
||||||
) {
|
) {
|
||||||
this.themeService.isSidebarOpen$.subscribe(value => {
|
this.themeService.isSidebarOpen$.subscribe(value => {
|
||||||
this.isSidebarOpen = value;
|
this.isSidebarOpen = value;
|
||||||
@ -46,25 +49,14 @@ export class SidebarService {
|
|||||||
this.setMenu(true);
|
this.setMenu(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
this.router.events.subscribe(event => {
|
this.serverService.server$.subscribe(server => {
|
||||||
if (!(event instanceof NavigationEnd)) {
|
this.server = server;
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!event.url.startsWith("/server/") && this.server$.value) {
|
|
||||||
this.setServer(null);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
setServer(server: Server | null) {
|
|
||||||
if (server?.id != this.server$.value?.id) {
|
|
||||||
this.server$.next(server);
|
|
||||||
if (server) {
|
if (server) {
|
||||||
this.setMenu(true);
|
this.setMenu(true);
|
||||||
} else {
|
} else {
|
||||||
this.setMenu(false);
|
this.setMenu(false);
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async buildMenu(user: UserDTO | null, hasPermission: boolean, isTechnician: boolean = false) {
|
async buildMenu(user: UserDTO | null, hasPermission: boolean, isTechnician: boolean = false) {
|
||||||
@ -76,54 +68,61 @@ export class SidebarService {
|
|||||||
this.serverDashboard = {
|
this.serverDashboard = {
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.dashboard") : "",
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.dashboard") : "",
|
||||||
icon: "pi pi-th-large",
|
icon: "pi pi-th-large",
|
||||||
routerLink: `server/${this.server$.value?.id}`
|
routerLink: `server/${this.server?.id}`
|
||||||
};
|
};
|
||||||
this.serverProfile = {
|
this.serverProfile = {
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.profile") : "",
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.profile") : "",
|
||||||
icon: "pi pi-id-card",
|
icon: "pi pi-id-card",
|
||||||
routerLink: `server/${this.server$.value?.id}/members/${user?.id}`
|
routerLink: `server/${this.server?.id}/members/${user?.id}`
|
||||||
};
|
};
|
||||||
this.serverMembers = {
|
this.serverMembers = {
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.members") : "",
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.members") : "",
|
||||||
icon: "pi pi-users",
|
icon: "pi pi-users",
|
||||||
visible: true,
|
visible: true,
|
||||||
routerLink: `server/${this.server$.value?.id}/members`
|
routerLink: `server/${this.server?.id}/members`
|
||||||
};
|
};
|
||||||
|
|
||||||
this.serverAutoRoles = {
|
this.serverAutoRoles = {
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.auto_roles") : "",
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.auto_roles") : "",
|
||||||
icon: "pi pi-sitemap",
|
icon: "pi pi-sitemap",
|
||||||
visible: true,
|
visible: true,
|
||||||
routerLink: `server/${this.server$.value?.id}/auto-roles`
|
routerLink: `server/${this.server?.id}/auto-roles`
|
||||||
};
|
};
|
||||||
|
|
||||||
this.serverLevels = {
|
this.serverLevels = {
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.levels") : "",
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.levels") : "",
|
||||||
icon: "pi pi-book",
|
icon: "pi pi-book",
|
||||||
visible: true,
|
visible: true,
|
||||||
routerLink: `server/${this.server$.value?.id}/levels`
|
routerLink: `server/${this.server?.id}/levels`
|
||||||
};
|
};
|
||||||
|
|
||||||
this.serverAchievements = {
|
this.serverAchievements = {
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.achievements") : "",
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.achievements") : "",
|
||||||
icon: "pi pi-angle-double-up",
|
icon: "pi pi-angle-double-up",
|
||||||
visible: true,
|
visible: true,
|
||||||
routerLink: `server/${this.server$.value?.id}/achievements`
|
routerLink: `server/${this.server?.id}/achievements`
|
||||||
|
};
|
||||||
|
|
||||||
|
this.serverShortRoleNames = {
|
||||||
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.short_role_names") : "",
|
||||||
|
icon: "pi pi-list",
|
||||||
|
visible: true,
|
||||||
|
routerLink: `server/${this.server?.id}/short-role-names`
|
||||||
};
|
};
|
||||||
|
|
||||||
this.serverConfig = {
|
this.serverConfig = {
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.configuration") : "",
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.configuration") : "",
|
||||||
icon: "pi pi-cog",
|
icon: "pi pi-cog",
|
||||||
visible: true,
|
visible: true,
|
||||||
routerLink: `server/${this.server$.value?.id}/config`
|
routerLink: `server/${this.server?.id}/config`
|
||||||
};
|
};
|
||||||
|
|
||||||
this.serverMenu = {
|
this.serverMenu = {
|
||||||
label: this.isSidebarOpen ? this.server$.value?.name : "",
|
label: this.isSidebarOpen ? this.server?.name : "",
|
||||||
icon: "pi pi-server",
|
icon: "pi pi-server",
|
||||||
visible: false,
|
visible: false,
|
||||||
expanded: true,
|
expanded: true,
|
||||||
items: [this.serverDashboard, this.serverProfile, this.serverMembers, this.serverAutoRoles, this.serverLevels, this.serverAchievements, this.serverConfig]
|
items: [this.serverDashboard, this.serverProfile, this.serverMembers, this.serverAutoRoles, this.serverLevels, this.serverAchievements, this.serverShortRoleNames, this.serverConfig]
|
||||||
};
|
};
|
||||||
this.adminConfig = {
|
this.adminConfig = {
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.config") : "",
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.config") : "",
|
||||||
@ -149,19 +148,20 @@ export class SidebarService {
|
|||||||
setMenu(build: boolean = false) {
|
setMenu(build: boolean = false) {
|
||||||
this.authService.hasUserPermission(AuthRoles.Admin).then(async hasPermission => {
|
this.authService.hasUserPermission(AuthRoles.Admin).then(async hasPermission => {
|
||||||
let authUser = await this.authService.getLoggedInUser();
|
let authUser = await this.authService.getLoggedInUser();
|
||||||
let user: UserDTO | null = authUser?.users?.find(u => u.server == this.server$.value?.id) ?? null;
|
let user: UserDTO | null = authUser?.users?.find(u => u.server == this.server?.id) ?? null;
|
||||||
let isTechnician = authUser?.users?.map(u => u.isTechnician).filter(u => u) ?? [];
|
let isTechnician = authUser?.users?.map(u => u.isTechnician).filter(u => u) ?? [];
|
||||||
|
|
||||||
if (build || this.menuItems$.value.length == 0) {
|
if (build || this.menuItems$.value.length == 0) {
|
||||||
await this.buildMenu(user, hasPermission, isTechnician.length > 0);
|
await this.buildMenu(user, hasPermission, isTechnician.length > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.server$.value) {
|
if (this.server) {
|
||||||
this.serverMenu.visible = true;
|
this.serverMenu.visible = true;
|
||||||
this.serverMembers.visible = !!user?.isModerator;
|
this.serverMembers.visible = !!user?.isModerator;
|
||||||
this.serverAutoRoles.visible = !!user?.isModerator;
|
this.serverAutoRoles.visible = !!user?.isModerator;
|
||||||
this.serverLevels.visible = !!user?.isModerator;
|
this.serverLevels.visible = !!user?.isModerator;
|
||||||
this.serverAchievements.visible = !!user?.isModerator;
|
this.serverAchievements.visible = !!user?.isModerator;
|
||||||
|
this.serverShortRoleNames.visible = !!user?.isAdmin;
|
||||||
this.serverConfig.visible = !!user?.isAdmin || isTechnician.length > 0;
|
this.serverConfig.visible = !!user?.isAdmin || isTechnician.length > 0;
|
||||||
} else {
|
} else {
|
||||||
this.serverMenu.visible = false;
|
this.serverMenu.visible = false;
|
||||||
|
@ -310,6 +310,7 @@
|
|||||||
"dashboard": "Dashboard",
|
"dashboard": "Dashboard",
|
||||||
"members": "Mitglieder",
|
"members": "Mitglieder",
|
||||||
"server": {
|
"server": {
|
||||||
|
"short_role_names": "Rollen Kürzel",
|
||||||
"achievements": "Errungenschaften",
|
"achievements": "Errungenschaften",
|
||||||
"auto_roles": "Auto Rollen",
|
"auto_roles": "Auto Rollen",
|
||||||
"configuration": "Konfiguration",
|
"configuration": "Konfiguration",
|
||||||
|
Loading…
Reference in New Issue
Block a user