<!--
  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.
-->

<td-steps mode="'vertical'">
  <td-step #detailsStep label="{{'Upload new identification card scan' | translate}}"
           [state]="form.valid ? 'complete' : form.pristine ? 'none' : 'required'">
    <form [formGroup]="form" layout="column">
      <fims-id-input [form]="form" controlName="identifier" [readonly]="editMode"></fims-id-input>
      <fims-text-input [form]="form" controlName="description" placeholder="{{'Description' | translate}}"></fims-text-input>
      <div layout="row">
        <mat-form-field tdFileDrop
                            [disabled]="true"
                            flex layout-margin>
          <input matInput
                 placeholder="{{'Selected file' | translate }}"
                 [value]="form.get('file').value ? form.get('file').value.name : ''"
                 [disabled]="true"
                 readonly/>
          <mat-hint class="tc-red-500" *ngIf="form.get('file').hasError('maxFileSize')">
            {{ 'Max file size' | translate:{ value: form.get('file').getError('maxFileSize')['value']} }}
          </mat-hint>
        </mat-form-field>
        <button mat-icon-button *ngIf="form.get('file').value" (click)="fileInput.clear()"
                (keyup.enter)="fileInput.clear()">
          <mat-icon>cancel</mat-icon>
        </button>
        <td-file-input class="push-left-sm push-right-sm" #fileInput formControlName="file" accept=".jpg,.png">
          <mat-icon>folder</mat-icon>
          <span class="text-upper" translate>Browse...</span>
        </td-file-input>
      </div>
    </form>
  </td-step>
  <td-step label="{{'Final step' | translate}}" [state]="'complete'">
    <ng-template td-step-summary>
      <fims-form-final-action
        [resourceName]="'IDENTIFICATION CARD SCAN'"
        [editMode]="editMode"
        [disabled]="!form.valid"
        (onCancel)="cancel()"
        (onSave)="save()">
      </fims-form-final-action>
    </ng-template>
  </td-step>
</td-steps>
