<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

  <div class="flex-container" fullscreen>
      <mat-progress-bar *ngIf="isLoading$ | async" mode="indeterminate"></mat-progress-bar>
  <mat-toolbar class="my-toolbar">
    <div>
      <div class="search2">
    <ul id="menu" class="menu1">
      <li>
        <button mat-icon-button (click)="sidenav.toggle()" class="dropdown-button">
          <mat-icon class="fineract-toolicon">menu</mat-icon>
        </button>
      </li>
      <li>
        
        <span style="color:purple">{{tenant$ | async}}</span>
      </li>
      <li>
       
        <button mat-button [matMenuTriggerFor]="client" class="dropdown-button"> 
          <mat-icon>group</mat-icon>Clients
          <mat-icon>arrow_drop_down</mat-icon>
        </button>
        <mat-menu #client="matMenu">
          <a mat-menu-item [routerLink]="['/customers']">Client</a>
          <a mat-menu-item [routerLink]="['/']">Group</a>
          <a mat-menu-item [routerLink]="['/centers']">Center</a>
        </mat-menu>
      </li>
      <li>
        <button mat-button  [routerLink]="['/accounting']"  class="dropdown-button">Accounting
        </button>
      </li>
      <li>
        <button mat-button [matMenuTriggerFor]="report" class="dropdown-button">Reports
          <mat-icon>arrow_drop_down</mat-icon>
        </button>
        <mat-menu #report="matMenu">
          <a mat-menu-item [routerLink]="['/customers']">Member</a>
          <a mat-menu-item [routerLink]="['/deposits']">Deposit</a>
         
        </mat-menu>
      </li>
      <li>
       
        <button mat-button [matMenuTriggerFor]="admin" class="dropdown-button">
           <mat-icon>build</mat-icon>Admin
          <mat-icon>arrow_drop_down</mat-icon>
        </button>
        <mat-menu #admin="matMenu">
          <button mat-menu-item [routerLink]="['/employees']">Users</button>
          <button mat-menu-item [routerLink]="['/teller']">Teller</button>
          <button mat-menu-item [routerLink]="['/roles']">Roles/Permissions</button>
          <button mat-menu-item [routerLink]="['/loans']">Products</button>
          
        </mat-menu>
      </li>
  
    </ul>
    </div>
    <div class="search1">
    <ul id="menu">
     
      <li>
        <button mat-button [matMenuTriggerFor]="mifos" class="dropdown-button">Fineract CN
          <mat-icon>arrow_drop_down</mat-icon>
        </button>
        <mat-menu #mifos="matMenu">
            <button mat-menu-item [disabled]="true">
                <mat-icon>account_circle</mat-icon>
                <span>{{username$ | async}}</span>
              </button>
              <hr>
              <button mat-menu-item (click)="goToSettings()">
                <mat-icon>settings</mat-icon>
                <span>{{'Settings' | translate}}</span>
              </button>
              <button mat-menu-item (click)="logout()">
                <mat-icon>exit_to_app</mat-icon>
                <span>{{'Sign Out' | translate}}</span>
              </button>
        </mat-menu>
      </li>
    </ul>
    </div>
    </div>
  </mat-toolbar>
  </div>
  
  <mat-sidenav-container class="app-container" style="background-image:url('assets/Background.png');">
    <mat-sidenav #sidenav class="app-sidenav mat-elevation-z2" mode="side" opened="true">
     
      <mat-nav-list>
          <ng-container *ngFor="let menuItem of menuItems; let i = index">
            <a mat-list-item [routerLink]="[menuItem.routerLink]" routerLinkActive="active" *hasPermission="menuItem.permission">
              <mat-icon matListAvatar>{{menuItem.icon}}</mat-icon>
              <h3 matLine>{{menuItem.title | translate}}</h3>
              <p matLine>{{menuItem.description | translate}}</p>
            </a>
            <mat-divider *ngIf="i === 0"></mat-divider>
          </ng-container>
        </mat-nav-list>
  
    </mat-sidenav>
    <div class="app-sidenav-content">
      <div class="wrapper" >
        <router-outlet></router-outlet>
      </div>
  
    </div>
    <fims-notification></fims-notification>
  </mat-sidenav-container>
 
  
  
  
  