<!--
  ~ 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="login_page">
  <div class="content">
    <a class="logo">
      <img src="assets/img/logo.png" alt="">
    </a>
    <form name="form" class="form-wrap" #f="ngForm" novalidate>
      <!--
      <div class="input-icon-group">
        <span class="input-icon"><span class="login-icon icon-username"></span></span>
        <input type="text" class="input-with-icon" name="username" [(ngModel)]="model.username" [pattern]="userPattern" #username="ngModel" placeholder="Username" required />
      </div>

      <div class="input-icon-group">
        <span class="input-icon"><span class="login-icon icon-password"></span></span>
        <input type="password" class="input-with-icon" placeholder="Password" name="password" [(ngModel)]="model.password" #password="ngModel" required />
      </div>


      <div class="form-group" [ngClass]="{'flex': DICTIONARY['aws'].cloud_provider === 'azure'}">
        <button mat-raised-button [disabled]="loading || !username.valid || !password.valid"
                (click)="login_btnClick();"
                class="butt butt-login"
                [ngClass]="{'not-allowed':loading || !username.valid || !password.valid}">
            <span *ngIf="!loading">Login</span>

            <span *ngIf="loading">Logging in
              <span id="fountainG">
                <span id="fountainG_1" class="fountainG"></span>
                <span id="fountainG_2" class="fountainG"></span>
                <span id="fountainG_3" class="fountainG"></span>
              </span>
            </span>
        </button>
        <button *ngIf="DICTIONARY['aws'].cloud_provider === 'azure' && !DICTIONARY['aws'].use_ldap"
                class="butt butt-azure"
                mat-raised-button (click)="loginWithAzure_btnClick();">
          Login with Azure
        </button>
      </div>-->

      <button class="butt butt-login" mat-raised-button (click)="loginWithKeyClock();">
        Login with KeyClock
      </button>
    </form>

    <div *ngIf="error" class="warning-alert"><span class="material-icons">priority_high</span>{{ error }}</div>
  </div>
</div>
