Skip to content
Snippets Groups Projects
  • rhenck's avatar
    373108a5
    Refactor elements to use the model's value · 373108a5
    rhenck authored
    This change mainly helps the editor.
    The idea is to make the element components have the correct value of
    their model and don't rely on the formcontrol value. The formcontrol
    can be hard to manipulate, especially in compound elements. Setting
    the model value is way easier.
    
    The formcontrols are kept and should not interfere.
    373108a5
    History
    Refactor elements to use the model's value
    rhenck authored
    This change mainly helps the editor.
    The idea is to make the element components have the correct value of
    their model and don't rely on the formcontrol value. The formcontrol
    can be hard to manipulate, especially in compound elements. Setting
    the model value is way easier.
    
    The formcontrols are kept and should not interfere.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
text-field.component.ts 4.15 KiB
import { Component, EventEmitter, Output } from '@angular/core';
import { ValidatorFn, Validators } from '@angular/forms';
import { FormElementComponent } from '../form-element-component.directive';
import { TextFieldElement } from '../models/text-field-element';

@Component({
  selector: 'app-text-field',
  template: `
    <mat-form-field *ngIf="elementModel.label !== ''"
                    [style.width.%]="100"
                    [style.height.%]="100"
                    [style.color]="elementModel.fontColor"
                    [style.font-family]="elementModel.font"
                    [style.font-size.px]="elementModel.fontSize"
                    [style.font-weight]="elementModel.bold ? 'bold' : ''"
                    [style.font-style]="elementModel.italic ? 'italic' : ''"
                    [style.text-decoration]="elementModel.underline ? 'underline' : ''"
                    appInputBackgroundColor [backgroundColor]="elementModel.backgroundColor"
                    [appearance]="$any(elementModel.appearance)">
      <mat-label>{{elementModel.label}}</mat-label>
      <input matInput type="text" #input autocomplete="off"
             [formControl]="elementFormControl"
             [value]="elementModel.value"
             [pattern]="elementModel.pattern"
             [readonly]="elementModel.readOnly"
             (focus)="onFocus.emit(input)"
             (blur)="onBlur.emit(input)">
      <button *ngIf="elementModel.clearable" matSuffix mat-icon-button aria-label="Clear"
              (click)="onClick($event)">
        <mat-icon>close</mat-icon>
      </button>
      <mat-error *ngIf="elementFormControl.errors">
        {{elementFormControl.errors | errorTransform: elementModel}}
      </mat-error>
    </mat-form-field>
    <mat-form-field *ngIf="elementModel.label === ''" class="small-input"
                    [style.width.%]="100"
                    [style.height.%]="100"
                    [style.color]="elementModel.fontColor"
                    [style.font-family]="elementModel.font"
                    [style.font-size.px]="elementModel.fontSize"
                    [style.font-weight]="elementModel.bold ? 'bold' : ''"
                    [style.font-style]="elementModel.italic ? 'italic' : ''"
                    [style.text-decoration]="elementModel.underline ? 'underline' : ''"
                    appInputBackgroundColor [backgroundColor]="elementModel.backgroundColor"
                    [appearance]="$any(elementModel.appearance)">
      <input matInput type="text" #input autocomplete="off"
             [formControl]="elementFormControl"
             [value]="elementModel.value"
             [readonly]="elementModel.readOnly"
             [pattern]="elementModel.pattern"
             (focus)="onFocus.emit(input)"
             (blur)="onBlur.emit(input)">
      <button *ngIf="elementModel.clearable" matSuffix mat-icon-button aria-label="Clear"
              (click)="onClick($event)">
        <mat-icon>close</mat-icon>
      </button>
      <mat-error *ngIf="elementFormControl.errors">
        {{elementFormControl.errors | errorTransform: elementModel}}
      </mat-error>
    </mat-form-field>
  `,
  styles: [
    '::ng-deep app-text-field .small-input div.mat-form-field-infix {border-top: none; padding: 0.75em 0 0.25em 0;}'
  ]
})
export class TextFieldComponent extends FormElementComponent {
  @Output() onFocus = new EventEmitter<HTMLElement>();
  @Output() onBlur = new EventEmitter<HTMLElement>();
  elementModel!: TextFieldElement;

  onClick(event: MouseEvent) : void {
    this.elementFormControl.setValue('');
    event.preventDefault();
    event.stopPropagation();
  }

  get validators(): ValidatorFn[] {
    const validators: ValidatorFn[] = [];
    if (this.elementModel.required) {
      validators.push(Validators.required);
    }
    if (this.elementModel.minLength) {
      validators.push(Validators.minLength(<number> this.elementModel.minLength));
    }
    if (this.elementModel.maxLength) {
      validators.push(Validators.maxLength(<number> this.elementModel.maxLength));
    }
    if (this.elementModel.pattern) {
      validators.push(Validators.pattern(<string> this.elementModel.pattern));
    }
    return validators;
  }
}