Open mmezian opened 5 years ago
Moving to the Nebular repository.
https://github.com/akveo/ngx-admin/pull/5531#issuecomment-539499784: I'd rather see this as a feature of the sidebar itself, not as part of ngx-admin. Sidebar already detects menu clicks to expand if needed (see sidebar source). So it also could do the opposite and automatically compact/collapse as proposed in the original issue (#2009). A few things to notice:
compactedBreakpoints
, collapsedBreakpoints
to chose target state.ContentChild
decorator. It would be great to get rid of query selector in onClick
method as well.I'll move the issue to the Nebular repository. We can discuss further design notes there.
Hello @mmezian, I encountered the same problem. I did not come up with the entire solution that has been recommended. However, I did come up with a solution for when you click on a menu item that it should close.
However, I am working in a Nebular 3.4.2. So you may need some adaptation. Add the following inside ngOnInit(){...} of header.component.ts And import NbMenuService
this.menuService.onItemSelect()
.subscribe((event: { tag: string, item: any }) => {
if (document.documentElement.clientWidth < 576){
this.sidebarService.toggle(true, 'menu-sidebar');
console.log('this.menuservices.onitemselect');
document.getElementById("header-sidebar").classList.remove("expand");
}
});
@rkanswers Thanks! Messing around with Nebular 4.4.0; In my case, I have all that I need in a header components just like ngx-admin example but trimmed to suit my needs. I modified your example to work without hard coding widths, rather getting the breakpoints:
const { sm } = this.breakpointService.getBreakpointsMap();
this.menuService.onItemSelect()
.pipe(takeUntil(this.destroy$))
.subscribe((event: { tag: string, item: any }) => {
if (document.documentElement.clientWidth < sm){
this.sidebarService.collapse('menu-sidebar');
}
});
Thank you @featured14, similarly I added this in my header.component.ts
to collapse the sidebar on click outside
@HostListener('document:click', ['$event'])
onClickOutside($event: any) {
const { sm } = this.breakpointService.getBreakpointsMap();
if (document.documentElement.clientWidth < sm) {
let node = $event.target;
let isSidebarOrMenuButtonClick = false;
while (node && !isSidebarOrMenuButtonClick) {
isSidebarOrMenuButtonClick = node.classList && (node.classList.contains('sidebar-toggle') || node.classList.contains('menu-sidebar'));
node = node.parentElement;
}
if (!isSidebarOrMenuButtonClick) {
this.sidebarService.collapse('menu-sidebar');
}
}
}
Change the class name for the menu button and the sidebar according to your needs.
Issue type
Issue description
Current behavior: On low resolutions, menu should close itself when we click on a link, or when we click outside of the menu. Currently, the menu doesn't collapse on either situations, and is blocking the view of half of the content of the site on resolution width < 1200px
Expected behavior: When resolution is 1200px or lower, when the menu is expanded, when we click a menu item or click outside the menu it should close itself.
Steps to reproduce: We are using nebular 4.1.2
Related code: Haven't touched the original code for the menu.
Other information:
I found this ticket that seems related, from 2017, but it seems that it is not viable anymore as structure has changed : https://github.com/akveo/ngx-admin/issues/947
Angular, Nebular