|
|
|
@ -3,7 +3,7 @@ |
|
|
|
id="main-navbar" |
|
|
|
style="min-height: 4rem;" |
|
|
|
> |
|
|
|
<div class="container"> |
|
|
|
<div class="container "> |
|
|
|
<a class="navbar-brand" routerLink="/"> |
|
|
|
<img *ngIf="appInfo.logoUrl; else appName" [src]="appInfo.logoUrl" [alt]="appInfo.name" /> |
|
|
|
</a> |
|
|
|
@ -15,109 +15,117 @@ |
|
|
|
> |
|
|
|
<span class="navbar-toggler-icon"></span> |
|
|
|
</button> |
|
|
|
<div class="collapse navbar-collapse" id="main-navbar-collapse" [ngbCollapse]="isCollapsed"> |
|
|
|
<ul class="navbar-nav mx-auto"> |
|
|
|
<ng-container |
|
|
|
*ngFor="let route of visibleRoutes$ | async; trackBy: trackByFn" |
|
|
|
[ngTemplateOutlet]="route?.children?.length ? dropdownLink : defaultLink" |
|
|
|
[ngTemplateOutletContext]="{ $implicit: route }" |
|
|
|
> |
|
|
|
</ng-container> |
|
|
|
<div class="navbar-collapse" id="main-navbar-collapse"> |
|
|
|
<ng-container *ngTemplateOutlet="!smallScreen ? navigations : null"></ng-container> |
|
|
|
|
|
|
|
<ng-template #defaultLink let-route> |
|
|
|
<li class="nav-item" [abpPermission]="route.requiredPolicy"> |
|
|
|
<a class="nav-link" [routerLink]="[route.url]">{{ route.name | abpLocalization }}</a> |
|
|
|
</li> |
|
|
|
</ng-template> |
|
|
|
<div *ngIf="smallScreen" class="overflow-hidden" [@collapseWithMargin]="isCollapsed ? 'collapsed' : 'expanded'"> |
|
|
|
<ng-container *ngTemplateOutlet="navigations"></ng-container> |
|
|
|
</div> |
|
|
|
|
|
|
|
<ng-template #dropdownLink let-route> |
|
|
|
<li |
|
|
|
#navbarRootDropdown |
|
|
|
ngbDropdown |
|
|
|
[abpPermission]="route.requiredPolicy" |
|
|
|
[abpVisibility]="routeContainer" |
|
|
|
class="nav-item" |
|
|
|
display="static" |
|
|
|
(click)="$event.preventDefault(); $event.stopPropagation()" |
|
|
|
<ng-template #navigations> |
|
|
|
<ul class="navbar-nav mx-auto"> |
|
|
|
<ng-container |
|
|
|
*ngFor="let route of visibleRoutes$ | async; trackBy: trackByFn" |
|
|
|
[ngTemplateOutlet]="route?.children?.length ? dropdownLink : defaultLink" |
|
|
|
[ngTemplateOutletContext]="{ $implicit: route }" |
|
|
|
> |
|
|
|
<a |
|
|
|
ngbDropdownToggle |
|
|
|
class="nav-link" |
|
|
|
data-toggle="dropdown" |
|
|
|
aria-haspopup="true" |
|
|
|
aria-expanded="false" |
|
|
|
href="javascript:void(0)" |
|
|
|
> |
|
|
|
<i *ngIf="route.iconClass" [ngClass]="route.iconClass"></i> {{ route.name | abpLocalization }} |
|
|
|
</a> |
|
|
|
<div #routeContainer ngbDropdownMenu class="dropdown-menu border-0 shadow-sm"> |
|
|
|
<ng-template |
|
|
|
#forTemplate |
|
|
|
ngFor |
|
|
|
[ngForOf]="route.children" |
|
|
|
[ngForTrackBy]="trackByFn" |
|
|
|
[ngForTemplate]="childWrapper" |
|
|
|
></ng-template> |
|
|
|
</div> |
|
|
|
</li> |
|
|
|
</ng-template> |
|
|
|
</ng-container> |
|
|
|
|
|
|
|
<ng-template #childWrapper let-child> |
|
|
|
<ng-template |
|
|
|
[ngTemplateOutlet]="child?.children?.length ? dropdownChild : defaultChild" |
|
|
|
[ngTemplateOutletContext]="{ $implicit: child }" |
|
|
|
></ng-template> |
|
|
|
</ng-template> |
|
|
|
<ng-template #defaultLink let-route> |
|
|
|
<li class="nav-item" [abpPermission]="route.requiredPolicy"> |
|
|
|
<a class="nav-link" [routerLink]="[route.url]">{{ route.name | abpLocalization }}</a> |
|
|
|
</li> |
|
|
|
</ng-template> |
|
|
|
|
|
|
|
<ng-template #defaultChild let-child> |
|
|
|
<div class="dropdown-submenu" [abpPermission]="child.requiredPolicy"> |
|
|
|
<a class="dropdown-item" [routerLink]="[child.url]"> |
|
|
|
<i *ngIf="child.iconClass" [ngClass]="child.iconClass"></i> |
|
|
|
{{ child.name | abpLocalization }}</a |
|
|
|
<ng-template #dropdownLink let-route> |
|
|
|
<li |
|
|
|
#navbarRootDropdown |
|
|
|
ngbDropdown |
|
|
|
[abpPermission]="route.requiredPolicy" |
|
|
|
[abpVisibility]="routeContainer" |
|
|
|
class="nav-item" |
|
|
|
display="static" |
|
|
|
(click)="$event.preventDefault(); $event.stopPropagation()" |
|
|
|
> |
|
|
|
</div> |
|
|
|
</ng-template> |
|
|
|
|
|
|
|
<ng-template #dropdownChild let-child> |
|
|
|
<div |
|
|
|
[abpVisibility]="childrenContainer" |
|
|
|
class="dropdown-submenu" |
|
|
|
ngbDropdown |
|
|
|
[display]="isDropdownChildDynamic ? 'dynamic' : 'static'" |
|
|
|
placement="right-top" |
|
|
|
[autoClose]="true" |
|
|
|
[abpPermission]="child.requiredPolicy" |
|
|
|
(openChange)="openChange($event, childrenContainer)" |
|
|
|
> |
|
|
|
<div ngbDropdownToggle [class.dropdown-toggle]="false"> |
|
|
|
<a |
|
|
|
abpEllipsis="210px" |
|
|
|
[abpEllipsisEnabled]="isDropdownChildDynamic" |
|
|
|
role="button" |
|
|
|
class="btn d-block text-left dropdown-toggle" |
|
|
|
ngbDropdownToggle |
|
|
|
class="nav-link" |
|
|
|
data-toggle="dropdown" |
|
|
|
aria-haspopup="true" |
|
|
|
aria-expanded="false" |
|
|
|
href="javascript:void(0)" |
|
|
|
> |
|
|
|
<i *ngIf="child.iconClass" [ngClass]="child.iconClass"></i> |
|
|
|
{{ child.name | abpLocalization }} |
|
|
|
<i *ngIf="route.iconClass" [ngClass]="route.iconClass"></i> {{ route.name | abpLocalization }} |
|
|
|
</a> |
|
|
|
<div #routeContainer ngbDropdownMenu class="dropdown-menu border-0 shadow-sm"> |
|
|
|
<ng-template |
|
|
|
#forTemplate |
|
|
|
ngFor |
|
|
|
[ngForOf]="route.children" |
|
|
|
[ngForTrackBy]="trackByFn" |
|
|
|
[ngForTemplate]="childWrapper" |
|
|
|
></ng-template> |
|
|
|
</div> |
|
|
|
</li> |
|
|
|
</ng-template> |
|
|
|
|
|
|
|
<ng-template #childWrapper let-child> |
|
|
|
<ng-template |
|
|
|
[ngTemplateOutlet]="child?.children?.length ? dropdownChild : defaultChild" |
|
|
|
[ngTemplateOutletContext]="{ $implicit: child }" |
|
|
|
></ng-template> |
|
|
|
</ng-template> |
|
|
|
|
|
|
|
<ng-template #defaultChild let-child> |
|
|
|
<div class="dropdown-submenu" [abpPermission]="child.requiredPolicy"> |
|
|
|
<a class="dropdown-item" [routerLink]="[child.url]"> |
|
|
|
<i *ngIf="child.iconClass" [ngClass]="child.iconClass"></i> |
|
|
|
{{ child.name | abpLocalization }}</a |
|
|
|
> |
|
|
|
</div> |
|
|
|
<div #childrenContainer ngbDropdownMenu class="dropdown-menu border-0 shadow-sm"> |
|
|
|
<ng-template |
|
|
|
ngFor |
|
|
|
[ngForOf]="child.children" |
|
|
|
[ngForTrackBy]="trackByFn" |
|
|
|
[ngForTemplate]="childWrapper" |
|
|
|
></ng-template> |
|
|
|
</ng-template> |
|
|
|
|
|
|
|
<ng-template #dropdownChild let-child> |
|
|
|
<div |
|
|
|
[abpVisibility]="childrenContainer" |
|
|
|
class="dropdown-submenu" |
|
|
|
ngbDropdown |
|
|
|
[display]="isDropdownChildDynamic ? 'dynamic' : 'static'" |
|
|
|
placement="right-top" |
|
|
|
[autoClose]="true" |
|
|
|
[abpPermission]="child.requiredPolicy" |
|
|
|
(openChange)="openChange($event, childrenContainer)" |
|
|
|
> |
|
|
|
<div ngbDropdownToggle [class.dropdown-toggle]="false"> |
|
|
|
<a |
|
|
|
abpEllipsis="210px" |
|
|
|
[abpEllipsisEnabled]="isDropdownChildDynamic" |
|
|
|
role="button" |
|
|
|
class="btn d-block text-left dropdown-toggle" |
|
|
|
> |
|
|
|
<i *ngIf="child.iconClass" [ngClass]="child.iconClass"></i> |
|
|
|
{{ child.name | abpLocalization }} |
|
|
|
</a> |
|
|
|
</div> |
|
|
|
<div #childrenContainer ngbDropdownMenu class="dropdown-menu border-0 shadow-sm"> |
|
|
|
<ng-template |
|
|
|
ngFor |
|
|
|
[ngForOf]="child.children" |
|
|
|
[ngForTrackBy]="trackByFn" |
|
|
|
[ngForTemplate]="childWrapper" |
|
|
|
></ng-template> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</ng-template> |
|
|
|
</ul> |
|
|
|
</ng-template> |
|
|
|
</ul> |
|
|
|
|
|
|
|
<ul class="navbar-nav"> |
|
|
|
<ng-container |
|
|
|
*ngFor="let element of rightPartElements; trackBy: trackElementByFn" |
|
|
|
[ngTemplateOutlet]="element" |
|
|
|
></ng-container> |
|
|
|
</ul> |
|
|
|
<ul class="navbar-nav"> |
|
|
|
<ng-container |
|
|
|
*ngFor="let element of rightPartElements; trackBy: trackElementByFn" |
|
|
|
[ngTemplateOutlet]="element" |
|
|
|
></ng-container> |
|
|
|
</ul> |
|
|
|
</ng-template> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</nav> |
|
|
|
|