dynaform.component.html 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <ng-container *ngFor="let rowName of dynaFormRows">
  2. <ng-container *ngTemplateOutlet="template ? template : default; context: getTemplateContext(rowName)"></ng-container>
  3. </ng-container>
  4. <!-- Default template for form node (field, repeating field, container, or repeating container)
  5. used when a TemplateRef is NOT supplied to component -->
  6. <ng-template let-control="control" let-meta="meta" #default>
  7. <ng-container *ngIf="meta.type !== 'Hidden'">
  8. <ng-container *ngIf="!meta.noLabel; else fullWidth">
  9. <div *ngIf="isField(meta); else recursiveDynaform" [ngClass]="getRowClass(control, meta)">
  10. <ng-container dynafield
  11. [control]="control"
  12. [meta]="meta"
  13. (call)="handleCallback($event)"
  14. ></ng-container>
  15. </div>
  16. </ng-container>
  17. <ng-template #recursiveDynaform>
  18. <ng-container *ngIf="isRepeatingField(meta)">
  19. <ng-container *ngFor="let field of meta.meta; let i = index">
  20. <ng-container *ngTemplateOutlet="dynafield; context: getRepeatingFieldTemplateContext(meta.name, i)"></ng-container>
  21. </ng-container>
  22. </ng-container>
  23. <ng-container *ngIf="isRepeatingContainer(meta); else container">
  24. <div *ngIf="meta.display === 'SINGLE'" class="clr-row dyna-rc-selector">
  25. <div class="clr-col-sm-2 text-right dyna-rc-focus-block">
  26. <b>FOCUS &gt;</b>
  27. </div>
  28. <div class="clr-col-sm-10">
  29. <button *ngFor="let container of meta.meta; let i = index"
  30. class="btn btn-sm dyna-rc-btn-focus"
  31. [ngClass]="container.focussed ? 'btn-primary' : ''"
  32. (click)="focusContainer(meta.name, i)">
  33. {{ getRCLabel(meta.name, i) }}
  34. </button>
  35. <button *ngIf="meta.showAddControl"
  36. class="btn btn-sm btn-success dyna-rc-btn-add"
  37. [disabled]="!addRCMemberAllowed(meta.name)"
  38. (click)="addRCMember(meta.name)">
  39. <clr-icon shape="plus"></clr-icon> Add New
  40. </button>
  41. </div>
  42. </div>
  43. <div *ngFor="let container of meta.meta; let i = index" class="dyna-rc-container" [ngClass]="{ 'dyna-rc-display-all': meta.display === 'ALL' }">
  44. <button *ngIf="meta.showDeleteControl"
  45. class="btn btn-sm btn-icon btn-outline-danger dyna-rc-btn-delete"
  46. [ngClass]="{ 'dyna-hidden': !meta.meta[i].focussed }"
  47. [disabled]="!deleteRCMemberAllowed(meta.name)"
  48. (click)="deleteRCMember(meta.name, i)">
  49. <clr-icon shape="trash"></clr-icon>
  50. </button>
  51. <ng-container *ngTemplateOutlet="dynaform; context: getRepeatingContainerTemplateContext(meta.name, i)"></ng-container>
  52. </div>
  53. <div *ngIf="meta.showAddControl && meta.display === 'ALL'" class="clr-row">
  54. <div class="clr-col-sm-12">
  55. <button
  56. class="btn btn-sm btn-success dyna-rc-btn-add"
  57. [ngClass]="{ 'btn-disabled': !addRCMemberAllowed(meta.name) }"
  58. (click)="addRCMember(meta.name)">
  59. <clr-icon shape="plus"></clr-icon> Add New
  60. </button>
  61. </div>
  62. </div>
  63. </ng-container>
  64. </ng-template>
  65. <ng-template #container>
  66. <ng-container *ngTemplateOutlet="dynaform; context: { control: control, meta: meta }"></ng-container>
  67. </ng-template>
  68. <ng-template #fullWidth>
  69. <ng-container dynafield [control]="control" [meta]="meta" (call)="handleCallback($event)"></ng-container>
  70. </ng-template>
  71. </ng-container>
  72. </ng-template>
  73. <!-- The DYNAFORM template -->
  74. <ng-template let-control="control" let-meta="meta" #dynaform>
  75. <div [ngClass]="getRowClass(control, meta)">
  76. <h3 *ngIf="meta.label" class="h-dyna" [ngClass]="'h-dyna-' + (path.length + 2)">{{ meta.label }}</h3>
  77. <app-dynaform [formGroup]="control" [meta]="meta.meta" [template]="template" [ngClass]="{ 'dyna-hidden': !meta.focussed }" (call)="handleCallback($event)"></app-dynaform>
  78. </div>
  79. </ng-template>
  80. <!-- The DYNAFIELD template -->
  81. <ng-template let-control="control" let-meta="meta" #dynafield>
  82. <div *ngIf="isField(meta); else recursiveDynaform" [ngClass]="getRowClass(control, meta)">
  83. <ng-container dynafield
  84. [control]="control"
  85. [meta]="meta"
  86. (call)="handleCallback($event)"
  87. ></ng-container>
  88. </div>
  89. </ng-template>
  90. <!-- Display validation status if debugging and not nested -->
  91. <div *ngIf="debug && path.length === 0" [ngClass]="{
  92. 'alert-success' : formGroup.valid && formGroup.dirty,
  93. 'alert-danger' : !formGroup.valid && formGroup.dirty,
  94. 'alert-info' : !formGroup.dirty
  95. }"
  96. class="alert __debug"
  97. role="alert">
  98. <div class="alert-items">
  99. <pre class="alert-text" style="border: none;">{{ formGroup.pristine ? 'Untouched' : getValidationErrors() | json }}</pre>
  100. </div>
  101. </div>