argos/dmp-frontend/src/app/ui/navbar/navbar.component.ts

322 lines
9.6 KiB
TypeScript

import { Location } from '@angular/common';
import { Component, ElementRef, EventEmitter, OnInit, Output, ViewChild } from '@angular/core';
import { MatDialog, MatDialogRef } from '@angular/material/dialog';
import { MatMenuTrigger } from '@angular/material/menu';
import { Router } from '@angular/router';
import { AppRole } from '@app/core/common/enum/app-role';
import { User } from '@app/core/model/user/user';
import { AuthService } from '@app/core/services/auth/auth.service';
import { LanguageService } from '@app/core/services/language/language.service';
import { MatomoService } from '@app/core/services/matomo/matomo-service';
import { ProgressIndicationService } from '@app/core/services/progress-indication/progress-indication-service';
import { SideNavService } from '@app/core/services/sidenav/side-nav.sevice';
import { BaseComponent } from '@common/base/base.component';
import { takeUntil } from 'rxjs/operators';
import { StartNewDmpDialogComponent } from '../dmp/new/start-new-dmp-dialogue/start-new-dmp-dialog.component';
import { FaqDialogComponent } from '../faq/dialog/faq-dialog.component';
import { UserDialogComponent } from './user-dialog/user-dialog.component';
import { DATASETS_ROUTES, DMP_ROUTES, GENERAL_ROUTES } from '../sidebar/sidebar.component';
import { MineInAppNotificationListingDialogComponent } from '../inapp-notification/listing-dialog/mine-inapp-notification-listing-dialog.component';
import { InAppNotificationService } from '@app/core/services/inapp-notification/inapp-notification.service';
import { timer } from 'rxjs';
import { ConfigurationService } from '@app/core/services/configuration/configuration.service';
@Component({
selector: 'app-navbar',
templateUrl: './navbar.component.html',
styleUrls: ['./navbar.component.css', './navbar.component.scss']
})
export class NavbarComponent extends BaseComponent implements OnInit {
progressIndication = false;
private listTitles: any[];
location: Location;
mobile_menu_visible: any = 0;
private toggleButton: any;
private sidebarVisible: boolean;
languages = [];
currentRoute: string;
selectedLanguage: string;
private user: User;
inAppNotificationDialog: MatDialogRef<MineInAppNotificationListingDialogComponent> = null;
inAppNotificationCount = 0;
@Output() sidebarToggled: EventEmitter<any> = new EventEmitter();
@ViewChild(MatMenuTrigger) trigger: MatMenuTrigger;
constructor(location: Location,
private element: ElementRef,
private router: Router,
public authentication: AuthService,
private dialog: MatDialog,
private progressIndicationService: ProgressIndicationService,
private languageService: LanguageService,
private matomoService: MatomoService,
private sidenavService: SideNavService,
private inappNotificationService: InAppNotificationService,
private configurationService: ConfigurationService
) {
super();
this.location = location;
this.sidebarVisible = false;
this.languages = this.languageService.getAvailableLanguagesCodes();
this.selectedLanguage = this.languageService.getDefaultLanguagesCode();
}
ngOnInit() {
this.matomoService.trackPageView('Navbar');
this.currentRoute = this.router.url;
this.listTitles = GENERAL_ROUTES.filter(listTitle => listTitle);
this.listTitles.push(DMP_ROUTES.filter(listTitle => listTitle));
// this.listTitles.push(HISTORY_ROUTES.filter(listTitle => listTitle));
this.listTitles.push(DATASETS_ROUTES.filter(listTitle => listTitle));
// const navbar: HTMLElement = this.element.nativeElement;
// this.toggleButton = navbar.getElementsByClassName('navbar-toggler')[0];
// this.router.events.subscribe((event) => {
// this.sidebarClose();
// var $layer: any = document.getElementsByClassName('close-layer')[0];
// this.currentRoute = this.router.url;
// if ($layer) {
// $layer.remove();
// this.mobile_menu_visible = 0;
// }
// });
this.progressIndicationService.getProgressIndicationObservable().pipe(takeUntil(this._destroyed)).subscribe(x => {
setTimeout(() => { this.progressIndication = x; });
});
timer(2000, this.configurationService.inAppNotificationsCountInterval * 1000)
.pipe(takeUntil(this._destroyed))
.subscribe(x => {
this.countUnreadInappNotifications();
});
}
private countUnreadInappNotifications() {
if (this.isAuthenticated()) {
this.inappNotificationService.countUnread()
.pipe(takeUntil(this._destroyed))
.subscribe(
data => {
this.inAppNotificationCount = data;
},
);
}
}
public isAuthenticated(): boolean {
return this.authentication.currentAccountIsAuthenticated();
}
public onInvalidUrl(): boolean {
return this.currentRoute === '/language-editor' || this.currentRoute === '/profile';
}
openMyMenu() {
this.trigger.openMenu();
}
closeMyMenu() {
this.trigger.closeMenu();
}
sidebarOpen() {
const toggleButton = this.toggleButton;
const body = document.getElementsByTagName('body')[0];
setTimeout(function () {
toggleButton.classList.add('toggled');
}, 500);
body.classList.add('nav-open');
this.sidebarVisible = true;
};
sidebarClose() {
const body = document.getElementsByTagName('body')[0];
this.toggleButton.classList.remove('toggled');
this.sidebarVisible = false;
body.classList.remove('nav-open');
};
sidebarToggle() {
// const toggleButton = this.toggleButton;
// const body = document.getElementsByTagName('body')[0];
var $toggle = document.getElementsByClassName('navbar-toggler')[0];
if (this.sidebarVisible === false) {
this.sidebarOpen();
} else {
this.sidebarClose();
}
const body = document.getElementsByTagName('body')[0];
if (this.mobile_menu_visible == 1) {
// $('html').removeClass('nav-open');
body.classList.remove('nav-open');
if ($layer) {
$layer.remove();
}
setTimeout(function () {
$toggle.classList.remove('toggled');
}, 400);
this.mobile_menu_visible = 0;
} else {
setTimeout(function () {
$toggle.classList.add('toggled');
}, 430);
var $layer = document.createElement('div');
$layer.setAttribute('class', 'close-layer');
if (body.querySelectorAll('.main-panel')) {
document.getElementsByClassName('main-panel')[0].appendChild($layer);
} else if (body.classList.contains('off-canvas-sidebar')) {
document.getElementsByClassName('wrapper-full-page')[0].appendChild($layer);
}
setTimeout(function () {
$layer.classList.add('visible');
}, 100);
$layer.onclick = function () { //asign a function
body.classList.remove('nav-open');
this.mobile_menu_visible = 0;
$layer.classList.remove('visible');
setTimeout(function () {
$layer.remove();
$toggle.classList.remove('toggled');
}, 400);
}.bind(this);
body.classList.add('nav-open');
this.mobile_menu_visible = 1;
}
};
getTitle() {
var titlee = this.location.prepareExternalUrl(this.location.path());
if (titlee.charAt(0) === '#') {
titlee = titlee.slice(2);
}
titlee = titlee.split('/').pop();
for (var item = 0; item < this.listTitles.length; item++) {
if (this.listTitles[item].path === titlee) {
return this.listTitles[item].title;
}
}
return 'Dashboard';
}
public getCurrentLanguage(): any {
const lang = this.languages.find(lang => lang.value === this.languageService.getCurrentLanguage());
return lang;
}
public getPrincipalName(): string {
return this.authentication.getPrincipalName();
}
public principalHasAvatar(): boolean {
return this.authentication.getUserProfileAvatarUrl() != null && this.authentication.getUserProfileAvatarUrl().length > 0;
}
public getPrincipalAvatar(): string {
return this.authentication.getUserProfileAvatarUrl();
}
public getDefaultAvatar(): string {
return 'assets/images/profile-placeholder.png';
}
public applyFallbackAvatar(ev: Event) {
(ev.target as HTMLImageElement).src = this.getDefaultAvatar();
}
public isAdmin(): boolean {
return this.authentication.hasRole(AppRole.Admin);
}
openProfile() {
const dialogRef = this.dialog.open(UserDialogComponent, {
hasBackdrop: true,
autoFocus: false,
closeOnNavigation: true,
disableClose: false,
position: { top: '71px', right: '1em' },
panelClass: 'custom-userbox'
});
}
openFaqDialog() {
if (this.dialog.openDialogs.length > 0) {
this.dialog.closeAll();
}
else {
const dialogRef = this.dialog.open(FaqDialogComponent, {
disableClose: true,
data: {
isDialog: true
},
width: '100%'
});
}
}
getLanguage(selectedLanguage: string) {
this.selectedLanguage = selectedLanguage;
}
toggleNavbar(event) {
document.getElementById('hamburger').classList.toggle("change");
}
sidebarToggleOutput(event) {
this.sidebarToggled.emit(event);
}
toggleMyNav(event) {
this.sidenavService.toggle();
}
openNewDmpDialog() {
if (this.dialog.openDialogs.length > 0) {
this.dialog.closeAll();
} else if (!this.isAuthenticated()) {
this.router.navigate(['/login']);
} else {
const dialogRef = this.dialog.open(StartNewDmpDialogComponent, {
disableClose: false,
data: {
isDialog: true
}
});
}
}
logout() {
this.router.navigate(['/logout']);
}
toggleInAppNotifications() {
if (this.inAppNotificationDialog != null) {
this.inAppNotificationDialog.close();
} else {
this.countUnreadInappNotifications();
this.inAppNotificationDialog = this.dialog.open(MineInAppNotificationListingDialogComponent, {
hasBackdrop: true,
autoFocus: false,
closeOnNavigation: true,
disableClose: false,
position: { top: '71px', right: '4.8em' },
width: "27.0rem"
});
this.inAppNotificationDialog.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
this.countUnreadInappNotifications();
this.inAppNotificationDialog = null;
});
}
}
}