Skip to content
Snippets Groups Projects
element-overlay.component.ts 2.91 KiB
Newer Older
  • Learn to ignore specific revisions
  •   Component, OnInit, OnDestroy, Input,
      ComponentFactory, ComponentFactoryResolver, ComponentRef,
      ViewChild, ViewContainerRef
    
    } from '@angular/core';
    import { FormGroup } from '@angular/forms';
    
    import { Subject } from 'rxjs';
    import { takeUntil } from 'rxjs/operators';
    
    jojohoch's avatar
    jojohoch committed
    import { UnitUIElement } from '../../../../common/unit';
    import * as ComponentUtils from '../../../../common/component-utils';
    
    import { FormElementComponent } from '../../../../common/form-element-component.directive';
    
    import { ValidationMessageComponent } from './validation-message.component';
    
    import { ValueChangeElement } from '../../../../common/form';
    import { FormService } from '../../../../common/form.service';
    
    
    @Component({
      selector: 'app-element-overlay',
      template: `
          <div [style.position]="'absolute'"
    
               [style.left.px]="elementModel.xPosition"
               [style.top.px]="elementModel.yPosition">
              <ng-template #elementComponentContainer></ng-template>
    
    jojohoch's avatar
    jojohoch committed
              <ng-template #validationMessageComponentContainer></ng-template>
    
    export class ElementOverlayComponent implements OnInit, OnDestroy {
    
      @Input() elementModel!: UnitUIElement;
      @ViewChild('elementComponentContainer',
        { read: ViewContainerRef, static: true }) private elementComponentContainer!: ViewContainerRef;
    
      @ViewChild('validationMessageComponentContainer',
        { read: ViewContainerRef, static: true }) private validationMessageComponentContainer!: ViewContainerRef;
    
    
      private ngUnsubscribe = new Subject<void>();
    
      constructor(private formService: FormService,
                  private componentFactoryResolver: ComponentFactoryResolver) { }
    
        const elementComponentFactory =
          ComponentUtils.getComponentFactory(this.elementModel.type, this.componentFactoryResolver);
        const elementComponent = this.elementComponentContainer.createComponent(elementComponentFactory).instance;
        elementComponent.elementModel = this.elementModel;
    
        if (elementComponent instanceof FormElementComponent) {
          elementComponent.parentForm = this.parentForm;
    
          elementComponent.formValueChanged
            .pipe(takeUntil(this.ngUnsubscribe))
            .subscribe((changeElement: ValueChangeElement) => {
              this.formService.changeElementValue(changeElement);
            });
    
    
          const validationMessageComponentFactory: ComponentFactory<ValidationMessageComponent> =
            this.componentFactoryResolver.resolveComponentFactory(ValidationMessageComponent);
          const validationMessageComponentRef: ComponentRef<ValidationMessageComponent> =
            this.validationMessageComponentContainer.createComponent(validationMessageComponentFactory);
    
          validationMessageComponentRef.instance.parentForm = this.parentForm;
          validationMessageComponentRef.instance.elementModel = this.elementModel;
    
    
      ngOnDestroy(): void {
        this.ngUnsubscribe.next();
        this.ngUnsubscribe.complete();
      }