All files / lib/replaceable-text replaceable-text.component.ts

98.26% Statements 113/115
91.66% Branches 11/12
100% Functions 4/4
98.26% Lines 113/115

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 1161x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x     1x 1x 1x 1x 1x 4x 4x 4x 4x 2x 2x 2x 2x 2x 4x 4x 1x  
/*******************************************************************************
 * Copyright bei
 * Entwicklungs- und Pflegeverbund für das gemeinsame Fachverfahren gefa
 *
 *******************************************************************************/
import {
  Component,
  EventEmitter,
  HostBinding,
  Input,
  NgZone,
  Output,
  ViewChild,
} from '@angular/core';
 
import { FocusableElementOwner } from '../utils/util.types';
 
/**
 * Displays a read-only value and provides the option to enter an alternative override value.
 * The input component to enter an override is supplied in the component's content.
 *
 * This component does not move focus when the input field becomes visible, such functionality
 * must be implemented by the user of the component if needed (the input is simply projected by this
 * component, hence it is not aware of any details about the inserted input structure).
 */
@Component({
  selector: 'gc-replaceable-text',
  templateUrl: './replaceable-text.component.html',
  styleUrls: ['./replaceable-text.component.css'],
  standalone: false,
})
export class ReplaceableTextComponent implements FocusableElementOwner {
  /** The (readonly) value */
  @Input()
  public value = '';
 
  /** Label shown for the (readonly) value. */
  @Input()
  public label = '';
 
  /**
   * Indicates if an override is present, if `true` the input field is shown.
   */
  @Input()
  @HostBinding('class.gc-replaceable-has-override')
  public hasOverride = false;
 
  /**
   * Label shown for the override value.
   */
  @Input()
  public overrideLabel = '';
 
  /**
   * Show a multi line text field
   */
  @Input()
  public multiLine = false;
 
  /**
   * Wrap the replacement elements (the overrides) inside a group.
   */
  @Input()
  public groupMode = false;
 
  /**
   * Decides if the control is rendered for usage as readonly component.
   *
   * Does not affect the replacement/override content, which must be managed by the user.
   */
  @Input()
  public readonly = false;
 
  /**
   * Decides if the edit/remove buttons are hidden.
   */
  @Input()
  public hideEditRemove = false;
 
  /**
   * Informs about changes of the `hasOverride` property, i.e. when the user
   * adds or removes the override value.
   */
  @Output()
  public readonly hasOverrideChange: EventEmitter<boolean> =
    new EventEmitter<boolean>();
 
  /** @ignore */
  @ViewChild('readOnlyInput')
  private readonly readOnlyInputField?: FocusableElementOwner;
 
  public constructor(private readonly ngZone: NgZone) {}
 
  public focusChild(): boolean {
    if (this.readOnlyInputField) {
      return this.readOnlyInputField.focusChild();
    } else {
      return false;
    }
  }
 
  /** @ignore */
  protected changeHasOverride(hasOverride: boolean) {
    this.hasOverride = hasOverride;
    this.hasOverrideChange.emit(hasOverride);
 
    if (!hasOverride) {
      this.ngZone.runOutsideAngular(() => {
        setTimeout(() => {
          this.readOnlyInputField?.focusChild();
        });
      });
    }
  }
}