File

projects/UILibrary/src/app/components/login/login.component.ts

Implements

OnInit

Metadata

Index

Methods
Inputs
Outputs

Constructor

constructor()

Inputs

loginData
Type : ILoginData

Outputs

loginDetailsProvided
Type : EventEmitter

Methods

focusOutOfInput
focusOutOfInput(loginForm: NgForm, field)
Parameters :
Name Type Optional
loginForm NgForm No
field No
Returns : void
ngOnInit
ngOnInit()
Returns : void
onLogin
onLogin(loginForm: NgForm)
Parameters :
Name Type Optional
loginForm NgForm No
Returns : void
import { ILoginData } from './../../models/login.interface';
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { NgForm } from '@angular/forms';

@Component({
  selector: 'amc-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.css']
})
export class LoginComponent implements OnInit {
  @Input() loginData: ILoginData;
  @Output() loginDetailsProvided = new EventEmitter<ILoginData>();

  constructor() { }

  ngOnInit() {
    if (!this.loginData.header) {
      this.loginData.header = 'Login';
    }

    for (let field of this.loginData.fields) {
      if (!field.isInvalid) {
        field.isInvalid = false;
      }
    }
  }

  onLogin(loginForm: NgForm) {
    for (const field of this.loginData.fields) {
      field.value = loginForm.value[field.name];
    }

    this.loginDetailsProvided.emit(this.loginData);
  }

  focusOutOfInput(loginForm: NgForm, field) {
    if (!loginForm.controls[field.name].valid) {
      field.isInvalid = true;
    }

    // console.log(loginForm);
    // console.log(field);
  }
}
<div class="login-container">
  <form (ngSubmit)="onLogin(loginForm)"class="login-form" id="login-form" #loginForm="ngForm">
    <div class="header-container">
      <label class="login-header" attr.aria-label="login">{{ loginData.header }}</label>
    </div>
    <div class="fields-container">
      <div *ngFor="let field of loginData.fields" class="field">
        <label class="field-label">
          {{ field.name }}:
        </label>

        <input
         ngModel
         class="field-input"
         attr.aria-label="{{ field.name }}"
         [name]="field.name"
         [type]="field.type"
         [value]="field.value"
         [placeholder]="field.placeholder || ''"
         [required]="field.isRequired || false"
         (focusout)="focusOutOfInput(loginForm, field)"/>

         <p class="invalid-input" *ngIf="field.isInvalid">{{ field.invalidMessage }}</p>
      </div>

      <button
        type="submit"
        class="form-submit"
        form="login-form"
        tabindex="0"
        attr.aria-label="send"
        [disabled]="!loginForm.valid">Login</button>
    </div>

  </form>
</div>

./login.component.css

.login-container {
  border: 1px solid #939598;
  white-space: nowrap;
  font-family: Arial;
  box-sizing: border-box;
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  text-overflow: ellipsis;
  position: relative;
  font-size: 0.9em;
  overflow-x: hidden;
  overflow-y: hidden;
}

.header-container {
  border-bottom: 1px solid #939598;
  background-color: #f4f5fb;
  width: 100%;
  height: 28px;
  position: sticky;
}

.login-header {
  margin-top: auto;
  margin-left: 7px;
  padding: 5px;
  font-weight: bold;
  font-size: 0.9em;
}

.fields-container {
  overflow-y: auto;
  /* display: table; */
  font-size: 0.9em;
  padding: 5px;
}

.field {
  display: table-row;
  margin: 5px;
}

.field-label {
  padding: 10px;
  display: table-cell;
}

.field-input {
  display: table-cell;
  border: 1px solid #939598;
  border-radius: 5px;
}

.field-input:focus {
  box-shadow: 0 0 5px rgb(56, 186, 223);
}

.form-submit {
  margin: 10px;
  margin-top: 15px;
  display: table-row;
  border: 1px solid #00a4b0;
  border-radius: 5px;
  background-color: #00a4b0;
  color: #f7f7f7;
  width: 10em;
  height: 2em;
  transition: all 0.2s;
  font-size: 1.1em;
  position: relative;
  top: 50%;
  left: 50%;
  -ms-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
}

.form-submit:hover {
  background-color: #01858f;
}

.form-submit:disabled {
  background-color: #c0c0c0;
  border-color: #c0c0c0;
  color: #ffffff;
}

/* input.ng-invalid[required] {
  border-left: 5px solid #03c2cf;
} */

/* input.ng-valid[required] {
  border-left: 5px solid #42A948;
} */

input.ng-invalid.ng-touched[required] {
  /* border-left: 5px solid #A94442; */
  border-color: #A94442;
}

.form-submit:focus {
  outline: 2px solid rgb(50, 150, 218);
  outline-offset: 5px;
}

.invalid-input {
  margin: 0px;
  padding: 0px;
  color: #A94442;
  font-size: x-small;
}
Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""