<!--
  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 page' | translate}}"
           [state]="form.valid ? 'complete' : form.pristine ? 'none' : 'required'" [active]="true">
    <form [formGroup]="form" layout="column">
      <mat-form-field flex layout-margin>
        <input matInput type="number" placeholder="{{'Page number' | translate}}" formControlName="pageNumber"/>
        <mat-error *ngIf="form.get('pageNumber').hasError('required')" translate>
          Required
        </mat-error>
        <mat-error *ngIf="form.get('pageNumber').hasError('minValue')">
          {{ 'Value must be greater than or equal to' | translate:{ value: form.get('pageNumber').getError('minValue').value} }}
        </mat-error>
      </mat-form-field>
      <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]="'PAGE'"
        [editMode]="false"
        [disabled]="!form.valid"
        (onCancel)="cancel()"
        (onSave)="save()">
      </fims-form-final-action>
    </ng-template>
  </td-step>
</td-steps>
