multiline.component.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { Component, forwardRef } from '@angular/core';
  2. import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
  3. import { CustomInputComponent } from './../../_abstract/custom-input.component';
  4. @Component({
  5. selector: 'app-multiline',
  6. templateUrl: './multiline.component.html',
  7. styleUrls: ['./multiline.component.scss'],
  8. providers: [
  9. {
  10. provide: NG_VALUE_ACCESSOR,
  11. useExisting: forwardRef(() => MultilineComponent),
  12. multi: true
  13. }
  14. ]
  15. })
  16. export class MultilineComponent extends CustomInputComponent {
  17. exposeMetaInTemplate: string[] = ['maxLineLength'];
  18. linesArr: string[];
  19. value: string;
  20. public writeValue(value: any): void {
  21. this.value = value;
  22. this.splitIntoLines(value, this.meta.lines || 5);
  23. }
  24. private updateValue(): void {
  25. this.value = this.recombineLines(this.linesArr);
  26. this.propagateChange(this.value);
  27. }
  28. private splitIntoLines(value: string, numLines: number): void {
  29. this.linesArr = this.control.value.split(/\n/);
  30. if (this.linesArr.length < numLines) {
  31. const shortfall = numLines - this.linesArr.length;
  32. this.linesArr = [...this.linesArr, ...Array(shortfall).fill('')];
  33. } else {
  34. this.linesArr = this.linesArr.slice(0, numLines);
  35. }
  36. }
  37. private recombineLines = (linesArr: string[]): string => {
  38. return linesArr.join('\n');
  39. }
  40. private trackByFn(index: any, item: any) {
  41. return index;
  42. }
  43. }