Fix regression my-account menu overflow-x on screen width < 800px (#2707)

* Fix: correct my-account menu overflow-x on touchscreens

* Add menuLeftDisplayed support for account-sub-menu

* Handle menu in screen service + clean top-menu-dropdown

* Add comment on menuWidth menu service to allow backtracking

Co-authored-by: Rigel Kent <par@rigelk.eu>

Co-authored-by: kimsible <kimsible@users.noreply.github.com>
Co-authored-by: Rigel Kent <par@rigelk.eu>
This commit is contained in:
Kim 2020-05-11 11:12:58 +02:00 committed by GitHub
parent 70afd522ba
commit 8544d8f561
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 23 additions and 10 deletions

View File

@ -7,6 +7,7 @@ import { debounceTime } from 'rxjs/operators'
export class MenuService { export class MenuService {
isMenuDisplayed = true isMenuDisplayed = true
isMenuChangedByUser = false isMenuChangedByUser = false
menuWidth = 240 // should be kept equal to $menu-width
constructor ( constructor (
private screenService: ScreenService private screenService: ScreenService

View File

@ -3,7 +3,7 @@
<a *ngIf="menuEntry.routerLink" [routerLink]="menuEntry.routerLink" routerLinkActive="active" class="title-page title-page-settings">{{ menuEntry.label }}</a> <a *ngIf="menuEntry.routerLink" [routerLink]="menuEntry.routerLink" routerLinkActive="active" class="title-page title-page-settings">{{ menuEntry.label }}</a>
<div *ngIf="!menuEntry.routerLink" ngbDropdown [container]="container" class="parent-entry" <div *ngIf="!menuEntry.routerLink" ngbDropdown container="body" class="parent-entry"
#dropdown="ngbDropdown" (mouseleave)="closeDropdownIfHovered(dropdown)"> #dropdown="ngbDropdown" (mouseleave)="closeDropdownIfHovered(dropdown)">
<span <span
*ngIf="isInSmallView" *ngIf="isInSmallView"

View File

@ -11,6 +11,7 @@ import { Subscription } from 'rxjs'
import { NgbDropdown, NgbModal } from '@ng-bootstrap/ng-bootstrap' import { NgbDropdown, NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { GlobalIconName } from '@app/shared/images/global-icon.component' import { GlobalIconName } from '@app/shared/images/global-icon.component'
import { ScreenService } from '@app/shared/misc/screen.service' import { ScreenService } from '@app/shared/misc/screen.service'
import { MenuService } from '@app/core/menu'
export type TopMenuDropdownParam = { export type TopMenuDropdownParam = {
label: string label: string
@ -36,7 +37,6 @@ export class TopMenuDropdownComponent implements OnInit, OnDestroy {
suffixLabels: { [ parentLabel: string ]: string } suffixLabels: { [ parentLabel: string ]: string }
hasIcons = false hasIcons = false
container: undefined | 'body' = undefined
isModalOpened = false isModalOpened = false
currentMenuEntryIndex: number currentMenuEntryIndex: number
@ -46,11 +46,17 @@ export class TopMenuDropdownComponent implements OnInit, OnDestroy {
constructor ( constructor (
private router: Router, private router: Router,
private modalService: NgbModal, private modalService: NgbModal,
private screen: ScreenService private screen: ScreenService,
private menuService: MenuService
) { } ) { }
get isInSmallView () { get isInSmallView () {
return this.screen.isInSmallView() let marginLeft = 0
if (this.menuService.isMenuDisplayed) {
marginLeft = this.menuService.menuWidth
}
return this.screen.isInSmallView(marginLeft)
} }
ngOnInit () { ngOnInit () {
@ -63,11 +69,6 @@ export class TopMenuDropdownComponent implements OnInit, OnDestroy {
this.hasIcons = this.menuEntries.some( this.hasIcons = this.menuEntries.some(
e => e.children && e.children.some(c => !!c.iconName) e => e.children && e.children.some(c => !!c.iconName)
) )
// We have to set body for the container to avoid scroll overflow on mobile and small views
if (this.isInSmallView) {
this.container = 'body'
}
} }
ngOnDestroy () { ngOnDestroy () {

View File

@ -10,7 +10,12 @@ export class ScreenService {
this.refreshWindowInnerWidth() this.refreshWindowInnerWidth()
} }
isInSmallView () { isInSmallView (marginLeft = 0) {
if (marginLeft > 0) {
const contentWidth = this.getWindowInnerWidth() - marginLeft
return contentWidth < 800
}
return this.getWindowInnerWidth() < 800 return this.getWindowInnerWidth() < 800
} }

View File

@ -320,6 +320,7 @@ table {
padding-left: 15px; padding-left: 15px;
padding-right: 15px; padding-right: 15px;
margin-bottom: $sub-menu-margin-bottom-small-view; margin-bottom: $sub-menu-margin-bottom-small-view;
overflow-x: auto;
} }
.admin-sub-header { .admin-sub-header {
@ -388,6 +389,11 @@ table {
.admin-sub-header { .admin-sub-header {
@include admin-sub-header-responsive($expanded-horizontal-margins/3 + $menu-width/2); @include admin-sub-header-responsive($expanded-horizontal-margins/3 + $menu-width/2);
} }
.sub-menu {
overflow-x: auto;
width: calc(100vw - #{$menu-width});
}
} }
} }
} }