|
|
|
@ -1,6 +1,6 @@
|
|
|
|
|
import { Injectable } from "@angular/core";
|
|
|
|
|
import { MenuItem } from "primeng/api";
|
|
|
|
|
import { BehaviorSubject } from "rxjs";
|
|
|
|
|
import { BehaviorSubject, forkJoin, Observable } from "rxjs";
|
|
|
|
|
import { AuthRoles } from "../../models/auth/auth-roles.enum";
|
|
|
|
|
import { AuthService } from "../auth/auth.service";
|
|
|
|
|
import { TranslateService } from "@ngx-translate/core";
|
|
|
|
@ -9,170 +9,222 @@ import { ThemeService } from "../theme/theme.service";
|
|
|
|
|
import { Server } from "../../models/data/server.model";
|
|
|
|
|
import { UserDTO } from "../../models/auth/auth-user.dto";
|
|
|
|
|
import { ServerService } from "../server.service";
|
|
|
|
|
import { HasServerFeatureFlagQuery, PossibleFeatureFlagsQuery, Query } from "../../models/graphql/query.model";
|
|
|
|
|
import { Queries } from "../../models/graphql/queries.model";
|
|
|
|
|
import { DataService } from "../data/data.service";
|
|
|
|
|
import { FeatureFlag } from "../../models/config/feature-flags.model";
|
|
|
|
|
|
|
|
|
|
@Injectable({
|
|
|
|
|
providedIn: "root"
|
|
|
|
|
providedIn: "root"
|
|
|
|
|
})
|
|
|
|
|
export class SidebarService {
|
|
|
|
|
|
|
|
|
|
isSidebarOpen: boolean = true;
|
|
|
|
|
menuItems$ = new BehaviorSubject<MenuItem[]>(new Array<MenuItem>());
|
|
|
|
|
server!: Server | null;
|
|
|
|
|
isSidebarOpen: boolean = true;
|
|
|
|
|
menuItems$ = new BehaviorSubject<MenuItem[]>(new Array<MenuItem>());
|
|
|
|
|
server!: Server | undefined;
|
|
|
|
|
|
|
|
|
|
dashboard: MenuItem = {};
|
|
|
|
|
serverDashboard: MenuItem = {};
|
|
|
|
|
serverProfile: MenuItem = {};
|
|
|
|
|
serverMembers: MenuItem = {};
|
|
|
|
|
serverAutoRoles: MenuItem = {};
|
|
|
|
|
serverLevels: MenuItem = {};
|
|
|
|
|
serverAchievements: MenuItem = {};
|
|
|
|
|
serverShortRoleNames: MenuItem = {};
|
|
|
|
|
serverConfig: MenuItem = {};
|
|
|
|
|
serverMenu: MenuItem = {};
|
|
|
|
|
adminConfig: MenuItem = {};
|
|
|
|
|
adminUsers: MenuItem = {};
|
|
|
|
|
adminMenu: MenuItem = {};
|
|
|
|
|
dashboard: MenuItem = {};
|
|
|
|
|
serverDashboard: MenuItem = {};
|
|
|
|
|
serverProfile: MenuItem = {};
|
|
|
|
|
serverMembers: MenuItem = {};
|
|
|
|
|
serverAutoRoles: MenuItem = {};
|
|
|
|
|
serverLevels: MenuItem = {};
|
|
|
|
|
serverAchievements: MenuItem = {};
|
|
|
|
|
serverShortRoleNames: MenuItem = {};
|
|
|
|
|
serverConfig: MenuItem = {};
|
|
|
|
|
serverMenu: MenuItem = {};
|
|
|
|
|
adminConfig: MenuItem = {};
|
|
|
|
|
adminUsers: MenuItem = {};
|
|
|
|
|
adminMenu: MenuItem = {};
|
|
|
|
|
|
|
|
|
|
constructor(
|
|
|
|
|
private themeService: ThemeService,
|
|
|
|
|
private authService: AuthService,
|
|
|
|
|
private translateService: TranslateService,
|
|
|
|
|
private router: Router,
|
|
|
|
|
private serverService: ServerService
|
|
|
|
|
) {
|
|
|
|
|
this.themeService.isSidebarOpen$.subscribe(value => {
|
|
|
|
|
this.isSidebarOpen = value;
|
|
|
|
|
this.setMenu(true);
|
|
|
|
|
});
|
|
|
|
|
featureFlags: FeatureFlag[] = [];
|
|
|
|
|
|
|
|
|
|
this.translateService.onLangChange.subscribe(_ => {
|
|
|
|
|
this.setMenu(true);
|
|
|
|
|
});
|
|
|
|
|
constructor(
|
|
|
|
|
private themeService: ThemeService,
|
|
|
|
|
private authService: AuthService,
|
|
|
|
|
private translateService: TranslateService,
|
|
|
|
|
private router: Router,
|
|
|
|
|
private serverService: ServerService,
|
|
|
|
|
private data: DataService
|
|
|
|
|
) {
|
|
|
|
|
this.themeService.isSidebarOpen$.subscribe(value => {
|
|
|
|
|
this.isSidebarOpen = value;
|
|
|
|
|
this.setMenu(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
this.serverService.server$.subscribe(server => {
|
|
|
|
|
this.server = server;
|
|
|
|
|
if (server) {
|
|
|
|
|
this.setMenu(true);
|
|
|
|
|
} else {
|
|
|
|
|
this.setMenu(false);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
this.translateService.onLangChange.subscribe(_ => {
|
|
|
|
|
this.setMenu(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
async buildMenu(user: UserDTO | null, hasPermission: boolean, isTechnician: boolean = false) {
|
|
|
|
|
this.dashboard = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.dashboard") : "",
|
|
|
|
|
icon: "pi pi-th-large",
|
|
|
|
|
routerLink: "dashboard"
|
|
|
|
|
};
|
|
|
|
|
this.serverDashboard = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.dashboard") : "",
|
|
|
|
|
icon: "pi pi-th-large",
|
|
|
|
|
routerLink: `server/${this.server?.id}`
|
|
|
|
|
};
|
|
|
|
|
this.serverProfile = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.profile") : "",
|
|
|
|
|
icon: "pi pi-id-card",
|
|
|
|
|
routerLink: `server/${this.server?.id}/members/${user?.id}`
|
|
|
|
|
};
|
|
|
|
|
this.serverMembers = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.members") : "",
|
|
|
|
|
icon: "pi pi-users",
|
|
|
|
|
visible: true,
|
|
|
|
|
routerLink: `server/${this.server?.id}/members`
|
|
|
|
|
};
|
|
|
|
|
this.serverService.server$.subscribe(server => {
|
|
|
|
|
this.server = server;
|
|
|
|
|
if (server) {
|
|
|
|
|
this.setMenu(true);
|
|
|
|
|
} else {
|
|
|
|
|
this.setMenu(false);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.serverAutoRoles = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.auto_roles") : "",
|
|
|
|
|
icon: "pi pi-sitemap",
|
|
|
|
|
visible: true,
|
|
|
|
|
routerLink: `server/${this.server?.id}/auto-roles`
|
|
|
|
|
};
|
|
|
|
|
async buildMenu(user: UserDTO | null, hasPermission: boolean, isTechnician: boolean = false) {
|
|
|
|
|
this.dashboard = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.dashboard") : "",
|
|
|
|
|
icon: "pi pi-th-large",
|
|
|
|
|
routerLink: "dashboard"
|
|
|
|
|
};
|
|
|
|
|
this.serverDashboard = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.dashboard") : "",
|
|
|
|
|
icon: "pi pi-th-large",
|
|
|
|
|
routerLink: `server/${this.server?.id}`
|
|
|
|
|
};
|
|
|
|
|
this.serverProfile = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.profile") : "",
|
|
|
|
|
icon: "pi pi-id-card",
|
|
|
|
|
routerLink: `server/${this.server?.id}/members/${user?.id}`
|
|
|
|
|
};
|
|
|
|
|
this.serverMembers = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.members") : "",
|
|
|
|
|
icon: "pi pi-users",
|
|
|
|
|
visible: true,
|
|
|
|
|
routerLink: `server/${this.server?.id}/members`
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
this.serverLevels = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.levels") : "",
|
|
|
|
|
icon: "pi pi-book",
|
|
|
|
|
visible: true,
|
|
|
|
|
routerLink: `server/${this.server?.id}/levels`
|
|
|
|
|
};
|
|
|
|
|
this.serverAutoRoles = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.auto_roles") : "",
|
|
|
|
|
icon: "pi pi-sitemap",
|
|
|
|
|
visible: true,
|
|
|
|
|
routerLink: `server/${this.server?.id}/auto-roles`
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
this.serverAchievements = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.achievements") : "",
|
|
|
|
|
icon: "pi pi-angle-double-up",
|
|
|
|
|
visible: true,
|
|
|
|
|
routerLink: `server/${this.server?.id}/achievements`
|
|
|
|
|
};
|
|
|
|
|
this.serverLevels = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.levels") : "",
|
|
|
|
|
icon: "pi pi-book",
|
|
|
|
|
visible: true,
|
|
|
|
|
routerLink: `server/${this.server?.id}/levels`
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
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.serverAchievements = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.achievements") : "",
|
|
|
|
|
icon: "pi pi-angle-double-up",
|
|
|
|
|
visible: true,
|
|
|
|
|
routerLink: `server/${this.server?.id}/achievements`
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
this.serverConfig = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.configuration") : "",
|
|
|
|
|
icon: "pi pi-cog",
|
|
|
|
|
visible: true,
|
|
|
|
|
routerLink: `server/${this.server?.id}/config`
|
|
|
|
|
};
|
|
|
|
|
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.serverMenu = {
|
|
|
|
|
label: this.isSidebarOpen ? this.server?.name : "",
|
|
|
|
|
icon: "pi pi-server",
|
|
|
|
|
visible: false,
|
|
|
|
|
expanded: true,
|
|
|
|
|
items: [this.serverDashboard, this.serverProfile, this.serverMembers, this.serverAutoRoles, this.serverLevels, this.serverAchievements, this.serverShortRoleNames, this.serverConfig]
|
|
|
|
|
};
|
|
|
|
|
this.adminConfig = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.config") : "",
|
|
|
|
|
visible: hasPermission || isTechnician,
|
|
|
|
|
icon: "pi pi-cog",
|
|
|
|
|
routerLink: "/admin/settings"
|
|
|
|
|
};
|
|
|
|
|
this.adminUsers = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.auth_user_list") : "",
|
|
|
|
|
visible: hasPermission,
|
|
|
|
|
icon: "pi pi-user-edit",
|
|
|
|
|
routerLink: "/admin/users"
|
|
|
|
|
};
|
|
|
|
|
this.adminMenu = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.administration") : "",
|
|
|
|
|
icon: "pi pi-cog",
|
|
|
|
|
visible: hasPermission || isTechnician,
|
|
|
|
|
expanded: true,
|
|
|
|
|
items: [this.adminConfig, this.adminUsers]
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
this.serverConfig = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.configuration") : "",
|
|
|
|
|
icon: "pi pi-cog",
|
|
|
|
|
visible: true,
|
|
|
|
|
routerLink: `server/${this.server?.id}/config`
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
setMenu(build: boolean = false) {
|
|
|
|
|
this.authService.hasUserPermission(AuthRoles.Admin).then(async hasPermission => {
|
|
|
|
|
let authUser = await this.authService.getLoggedInUser();
|
|
|
|
|
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) ?? [];
|
|
|
|
|
this.serverMenu = {
|
|
|
|
|
label: this.isSidebarOpen ? this.server?.name : "",
|
|
|
|
|
icon: "pi pi-server",
|
|
|
|
|
visible: false,
|
|
|
|
|
expanded: true,
|
|
|
|
|
items: [this.serverDashboard, this.serverProfile, this.serverMembers, this.serverAutoRoles, this.serverLevels, this.serverAchievements, this.serverShortRoleNames, this.serverConfig]
|
|
|
|
|
};
|
|
|
|
|
this.adminConfig = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.config") : "",
|
|
|
|
|
visible: hasPermission || isTechnician,
|
|
|
|
|
icon: "pi pi-cog",
|
|
|
|
|
routerLink: "/admin/settings"
|
|
|
|
|
};
|
|
|
|
|
this.adminUsers = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.auth_user_list") : "",
|
|
|
|
|
visible: hasPermission,
|
|
|
|
|
icon: "pi pi-user-edit",
|
|
|
|
|
routerLink: "/admin/users"
|
|
|
|
|
};
|
|
|
|
|
this.adminMenu = {
|
|
|
|
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.administration") : "",
|
|
|
|
|
icon: "pi pi-cog",
|
|
|
|
|
visible: hasPermission || isTechnician,
|
|
|
|
|
expanded: true,
|
|
|
|
|
items: [this.adminConfig, this.adminUsers]
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (build || this.menuItems$.value.length == 0) {
|
|
|
|
|
await this.buildMenu(user, hasPermission, isTechnician.length > 0);
|
|
|
|
|
}
|
|
|
|
|
setMenu(build: boolean = false) {
|
|
|
|
|
const server = this.server;
|
|
|
|
|
|
|
|
|
|
if (this.server) {
|
|
|
|
|
this.serverMenu.visible = true;
|
|
|
|
|
this.serverMembers.visible = !!user?.isModerator;
|
|
|
|
|
this.serverAutoRoles.visible = !!user?.isModerator;
|
|
|
|
|
this.serverLevels.visible = !!user?.isModerator;
|
|
|
|
|
this.serverAchievements.visible = !!user?.isModerator;
|
|
|
|
|
this.serverShortRoleNames.visible = !!user?.isAdmin;
|
|
|
|
|
this.serverConfig.visible = !!user?.isAdmin || isTechnician.length > 0;
|
|
|
|
|
} else {
|
|
|
|
|
this.serverMenu.visible = false;
|
|
|
|
|
}
|
|
|
|
|
if (server) {
|
|
|
|
|
this.featureFlags = [];
|
|
|
|
|
this.data.query<PossibleFeatureFlagsQuery>("{possibleFeatureFlags}"
|
|
|
|
|
).subscribe(data => {
|
|
|
|
|
let observables: Observable<HasServerFeatureFlagQuery>[] = [];
|
|
|
|
|
data.possibleFeatureFlags.forEach(flag => {
|
|
|
|
|
observables.push(
|
|
|
|
|
this.data.query<HasServerFeatureFlagQuery>(Queries.hasServerFeatureFlag, {
|
|
|
|
|
filter: { id: server.id },
|
|
|
|
|
flag: flag
|
|
|
|
|
},
|
|
|
|
|
function(data: Query) {
|
|
|
|
|
return data.servers[0];
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
let menuItems: MenuItem[] = [
|
|
|
|
|
this.dashboard,
|
|
|
|
|
this.serverMenu,
|
|
|
|
|
this.adminMenu
|
|
|
|
|
];
|
|
|
|
|
this.menuItems$.next(menuItems);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
forkJoin(observables).subscribe(data => {
|
|
|
|
|
data.forEach(flag => {
|
|
|
|
|
if (!flag.hasFeatureFlag.value) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
this.featureFlags.push(flag.hasFeatureFlag);
|
|
|
|
|
});
|
|
|
|
|
this._setMenu(build);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
this._setMenu(build);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private _setMenu(build: boolean = false) {
|
|
|
|
|
this.authService.hasUserPermission(AuthRoles.Admin).then(async hasPermission => {
|
|
|
|
|
let authUser = await this.authService.getLoggedInUser();
|
|
|
|
|
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) ?? [];
|
|
|
|
|
|
|
|
|
|
if (build || this.menuItems$.value.length == 0) {
|
|
|
|
|
await this.buildMenu(user, hasPermission, isTechnician.length > 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.server) {
|
|
|
|
|
this.serverMenu.visible = true;
|
|
|
|
|
this.serverMembers.visible = !!user?.isModerator;
|
|
|
|
|
this.serverAutoRoles.visible = this.hasFeature("AutoRoleModule") ? !!user?.isModerator : false;
|
|
|
|
|
this.serverLevels.visible = this.hasFeature("LevelModule") ? !!user?.isModerator : false;
|
|
|
|
|
this.serverAchievements.visible = this.hasFeature("AchievementsModule") ? !!user?.isModerator : false;
|
|
|
|
|
this.serverShortRoleNames.visible = this.hasFeature("ShortRoleNameModule") ? !!user?.isAdmin : false;
|
|
|
|
|
|
|
|
|
|
this.serverConfig.visible = !!user?.isAdmin || isTechnician.length > 0;
|
|
|
|
|
} else {
|
|
|
|
|
this.serverMenu.visible = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let menuItems: MenuItem[] = [
|
|
|
|
|
this.dashboard,
|
|
|
|
|
this.serverMenu,
|
|
|
|
|
this.adminMenu
|
|
|
|
|
];
|
|
|
|
|
this.menuItems$.next(menuItems);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private hasFeature(key: string): boolean {
|
|
|
|
|
const flag = this.featureFlags.filter(flag => flag.key == key);
|
|
|
|
|
if (flag.length == 0) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return flag[0].value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|