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

<form [formGroup]="form" layout="column">
  <fims-text-input [form]="form" controlName="street" placeholder="{{'Street' | translate}}"></fims-text-input>
  <fims-text-input [form]="form" controlName="city" placeholder="{{'City' | translate}}"></fims-text-input>
  <fims-text-input [form]="form" controlName="postalCode" placeholder="{{'Postal code(optional)' | translate}}"></fims-text-input>
  <mat-form-field layout-margin flex>
    <input matInput placeholder="{{'Country' | translate}}" formControlName="country" [matAutocomplete]="auto">
    <mat-error *ngIf="form.get('country').hasError('required')" translate>Required</mat-error>
    <mat-error *ngIf="form.get('country').hasError('invalidCountry')" translate>Invalid country</mat-error>
  </mat-form-field>
  <mat-autocomplete #auto="matAutocomplete" [displayWith]="countryDisplay">
    <mat-option *ngFor="let country of filteredCountries | async" [value]="country">
      {{country.displayName}}
    </mat-option>
  </mat-autocomplete>
  <fims-text-input [form]="form" controlName="region" placeholder="{{'Region(optional)' | translate}}"></fims-text-input>
</form>
