dynarow.component.ts 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Form field row, capable of hosting any type of form field input compponent
  2. import { Component, ComponentFactoryResolver, Input, ViewChild, OnInit, forwardRef } from '@angular/core';
  3. import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
  4. // import { ComponentHostDirective } from '@directives/component-host.directive';
  5. // Group into barrel: https://basarat.gitbooks.io/typescript/docs/tips/barrel.html
  6. import { BasicinputComponent } from './../../fields/basicinput/basicinput.component';
  7. import { DropdownModifiedInputComponent } from './../../fields/dropdown-modified-input/dropdown-modified-input.component';
  8. import { CheckbuttonComponent } from './../../fields/checkbutton/checkbutton.component';
  9. import { CheckbuttonGroupComponent } from './../../fields/checkbutton-group/checkbutton-group.component';
  10. const validComponentsArray = [ BasicinputComponent, DropdownModifiedInputComponent, CheckbuttonComponent, CheckbuttonGroupComponent ];
  11. const validComponents = validComponentsArray.reduce((acc, component) => Object.assign(acc, { [component.name]: component}), {});
  12. type ValidComponentType = BasicinputComponent | DropdownModifiedInputComponent | CheckbuttonComponent | CheckbuttonGroupComponent;
  13. @Component({
  14. selector: 'app-dynarow',
  15. templateUrl: './dynarow.component.html',
  16. styleUrls: ['./dynarow.component.scss'],
  17. providers: [
  18. {
  19. provide: NG_VALUE_ACCESSOR,
  20. useExisting: forwardRef(() => DynarowComponent),
  21. multi: true
  22. }
  23. ]
  24. })
  25. export class DynarowComponent /* implements OnInit, ControlValueAccessor */ {
  26. /*
  27. @Input()
  28. meta; // TODO: Add type - will be a union type of all input types available - probably (?)
  29. // @ViewChild(ComponentHostDirective)
  30. // host: ComponentHostDirective;
  31. label: string;
  32. currentValue: string | boolean;
  33. propagateChange = (_: any) => {};
  34. constructor(private componentFactoryResolver: ComponentFactoryResolver) { }
  35. ngOnInit() {
  36. this.label = this.meta.label;
  37. this.loadComponent();
  38. }
  39. loadComponent() {
  40. let type = this.meta.type;
  41. console.log('Trying to load', type);
  42. const viewContainerRef = this.host.viewContainerRef;
  43. if (`${type}Component` in validComponents) {
  44. type = `${type}Component`;
  45. }
  46. if (type in validComponents) {
  47. // Create and insert the component
  48. const componentFactory = this.componentFactoryResolver.resolveComponentFactory<ValidComponentType>(validComponents[type]);
  49. const componentRef = viewContainerRef.createComponent(componentFactory);
  50. (<ValidComponentType>componentRef.instance).meta = this.meta; // TODO: Impove on <any> by standardising interface
  51. console.dir(componentRef.instance);
  52. // Assign the FormControl, FormArry or FormGroup
  53. (<any>componentRef.instance).formControlName = this.meta.name;
  54. (<any>componentRef.instance).style = "outline: 5px red solid;";
  55. } else {
  56. console.error('DYNAROW: Unknown Component Type');
  57. }
  58. }
  59. public writeValue(value: any): void {
  60. // this.currentValue = (<any>this.componentRef.instance).FormControl.value
  61. }
  62. public registerOnChange(fn: any): void {
  63. this.propagateChange = fn;
  64. }
  65. public registerOnTouched(fn: any): void {}
  66. */
  67. }