<!--
  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]="['/centers']">Group</a>
          <a mat-menu-item [routerLink]="['/']">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]="['/reporting']">Member</a>
          <a mat-menu-item [routerLink]="['/reporting/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]="['/navbar/admin/products']">Products</button>
          
        </mat-menu>
      </li>
  
    </ul>
    </div>
    <div class="search1">
    <ul id="menu">
      <li>
        <input matInput placeholder="click or press alt + X to Search" type="text" class="fineract-toolsearch">
      </li>
     
      <li class="dropdown-button">
        <button mat-icon-button [routerLink]="['/navbar/notification']">
          <mat-icon>notifications</mat-icon>
        </button>
      </li>
      <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>
 
  
  
  
  