<!--
  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-form well col-md-4 col-md-offset-4 col-sm-offset-4">
  <div class="alert alert-danger" *ngIf="isLoginAlertDisplayed">{{errorMessage}}</div>
  <form #loginForm="ngForm" (ngSubmit)="login()">
    <div class="form-group">
      <label for="username">{{'authorization.name' | translate}}</label>
      <input class="form-control" type="text" id="username" name="username" required [(ngModel)]="username">
    </div>
    <div class="form-group">
      <label for="password">{{'authorization.password' | translate}}</label>
      <input class="form-control" type="password" id="password" name="password" required [(ngModel)]="password">
    </div>
    <button class="btn btn-success" [disabled]="!loginForm.form.valid || (isLoginInProgress$ | async)">
      {{'authorization.signIn' | translate}}
    </button>
  </form>
</div>
