fix mobile menu issue

This commit is contained in:
Mehmet Çetin
2025-01-06 18:23:13 +03:00
parent c485d75712
commit 1de7f5572a

View File

@@ -11,16 +11,8 @@ import { LayoutService } from '@/src/service/layout.service';
@Component({ @Component({
selector: 'app-layout', selector: 'app-layout',
standalone:true, standalone: true,
imports: [ imports: [CommonModule, ToastModule, AppTopBar, AppSidebar, RouterModule, AppFooter, AppConfigurator],
CommonModule,
ToastModule,
AppTopBar,
AppSidebar,
RouterModule,
AppFooter,
AppConfigurator
],
template: `<div class="layout-wrapper" [ngClass]="containerClass"> template: `<div class="layout-wrapper" [ngClass]="containerClass">
<app-topbar></app-topbar> <app-topbar></app-topbar>
<div class="layout-sidebar"> <div class="layout-sidebar">
@@ -34,8 +26,7 @@ import { LayoutService } from '@/src/service/layout.service';
</div> </div>
<app-configurator></app-configurator> <app-configurator></app-configurator>
<div class="layout-mask animate-fadein"></div> <div class="layout-mask animate-fadein"></div>
</div> </div> `
`,
}) })
export class AppLayout { export class AppLayout {
overlayMenuOpenSubscription: Subscription; overlayMenuOpenSubscription: Subscription;
@@ -48,23 +39,28 @@ export class AppLayout {
@ViewChild(AppTopBar) appTopBar!: AppTopBar; @ViewChild(AppTopBar) appTopBar!: AppTopBar;
constructor(public layoutService: LayoutService, public renderer: Renderer2, public router: Router) { constructor(
public layoutService: LayoutService,
public renderer: Renderer2,
public router: Router
) {
this.overlayMenuOpenSubscription = this.layoutService.overlayOpen$.subscribe(() => { this.overlayMenuOpenSubscription = this.layoutService.overlayOpen$.subscribe(() => {
if (!this.menuOutsideClickListener) { if (!this.menuOutsideClickListener) {
this.menuOutsideClickListener = this.renderer.listen('document', 'click', event => { this.menuOutsideClickListener = this.renderer.listen('document', 'click', (event) => {
const isOutsideClicked = !(this.appSidebar.el.nativeElement.isSameNode(event.target) || this.appSidebar.el.nativeElement.contains(event.target) if (this.isOutsideClicked(event)) {
|| this.appTopBar.menuButton.nativeElement.isSameNode(event.target) || this.appTopBar.menuButton.nativeElement.contains(event.target));
if (isOutsideClicked) {
this.hideMenu(); this.hideMenu();
} }
}); });
} }
if (!this.profileMenuOutsideClickListener) { if (!this.profileMenuOutsideClickListener) {
this.profileMenuOutsideClickListener = this.renderer.listen('document', 'click', event => { this.profileMenuOutsideClickListener = this.renderer.listen('document', 'click', (event) => {
const isOutsideClicked = !(this.appTopBar.menu.nativeElement.isSameNode(event.target) || this.appTopBar.menu.nativeElement.contains(event.target) const isOutsideClicked = !(
|| this.appTopBar.topbarMenuButton.nativeElement.isSameNode(event.target) || this.appTopBar.topbarMenuButton.nativeElement.contains(event.target)); this.appTopBar.menu.nativeElement.isSameNode(event.target) ||
this.appTopBar.menu.nativeElement.contains(event.target) ||
this.appTopBar.topbarMenuButton.nativeElement.isSameNode(event.target) ||
this.appTopBar.topbarMenuButton.nativeElement.contains(event.target)
);
if (isOutsideClicked) { if (isOutsideClicked) {
} }
@@ -76,14 +72,20 @@ export class AppLayout {
} }
}); });
this.router.events.pipe(filter(event => event instanceof NavigationEnd)) this.router.events.pipe(filter((event) => event instanceof NavigationEnd)).subscribe(() => {
.subscribe(() => { this.hideMenu();
this.hideMenu(); });
}); }
isOutsideClicked(event) {
const sidebarEl = document.querySelector('.layout-sidebar');
const topbarEl = document.querySelector('.layout-menu-button');
return !(sidebarEl.isSameNode(event.target) || sidebarEl.contains(event.target) || topbarEl.isSameNode(event.target) || topbarEl.contains(event.target));
} }
hideMenu() { hideMenu() {
this.layoutService.layoutState.update((prev) => ({...prev, overlayMenuActive:false, staticMenuMobileActive: false, menuHoverActive: false})) this.layoutService.layoutState.update((prev) => ({ ...prev, overlayMenuActive: false, staticMenuMobileActive: false, menuHoverActive: false }));
if (this.menuOutsideClickListener) { if (this.menuOutsideClickListener) {
this.menuOutsideClickListener(); this.menuOutsideClickListener();
this.menuOutsideClickListener = null; this.menuOutsideClickListener = null;
@@ -94,8 +96,7 @@ export class AppLayout {
blockBodyScroll(): void { blockBodyScroll(): void {
if (document.body.classList) { if (document.body.classList) {
document.body.classList.add('blocked-scroll'); document.body.classList.add('blocked-scroll');
} } else {
else {
document.body.className += ' blocked-scroll'; document.body.className += ' blocked-scroll';
} }
} }
@@ -103,10 +104,8 @@ export class AppLayout {
unblockBodyScroll(): void { unblockBodyScroll(): void {
if (document.body.classList) { if (document.body.classList) {
document.body.classList.remove('blocked-scroll'); document.body.classList.remove('blocked-scroll');
} } else {
else { document.body.className = document.body.className.replace(new RegExp('(^|\\b)' + 'blocked-scroll'.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
document.body.className = document.body.className.replace(new RegExp('(^|\\b)' +
'blocked-scroll'.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
} }
} }
@@ -117,7 +116,7 @@ export class AppLayout {
'layout-static-inactive': this.layoutService.layoutState().staticMenuDesktopInactive && this.layoutService.layoutConfig().menuMode === 'static', 'layout-static-inactive': this.layoutService.layoutState().staticMenuDesktopInactive && this.layoutService.layoutConfig().menuMode === 'static',
'layout-overlay-active': this.layoutService.layoutState().overlayMenuActive, 'layout-overlay-active': this.layoutService.layoutState().overlayMenuActive,
'layout-mobile-active': this.layoutService.layoutState().staticMenuMobileActive 'layout-mobile-active': this.layoutService.layoutState().staticMenuMobileActive
} };
} }
ngOnDestroy() { ngOnDestroy() {