UNPKG

@hicoder/angular-cli

Version:

Angular UI componenets and service generator. It works with the mean-rest-express package to generate the end to end web application. The input to this generator is the Mongoose schema defined for the express application. mean-rest-express exposes the Res

941 lines (933 loc) 50.1 kB
<%_ if (field.type === "SchemaString") { %><%_ if (field.editor) { %> <lib-richtext-editor [(ngModel)]="detail['<%-fn%>']" name="Edit<%-Fn%>"<% if (field.required) {%> [required]="true"<% } if (field.validators) {%> <%-mn%><%-Sn%>Directive<%-Fn%>=""<% } if (typeof field.minlength === 'number') {%> [minlength]="<%-field.minlength%>"<% } if (typeof field.maxlength === 'number') {%> [maxlength]="<%-field.maxlength%>"<% }%> #Edit<%-Fn%>="ngModel"> </lib-richtext-editor> <% if (field.required || field.validators || typeof field.maxlength === 'number' || typeof field.minlength === 'number') {%> <div *ngIf="!(Edit<%-Fn%>.valid || !Edit<%-Fn%>.errors)"><%_ if (field.required) {%> <div *ngIf="!Edit<%-Fn%>.pristine && Edit<%-Fn%>.errors['required']" class="alert alert-danger"> <%-fD%> is required. </div><%}%><%_ if (field.validators) {%> <div *ngIf="!Edit<%-Fn%>.pristine && Edit<%-Fn%>.errors['<%-mn%><%-Sn%>Directive<%-Fn%>']" class="alert alert-danger"> {{Edit<%-Fn%>.errors['<%-mn%><%-Sn%>Directive<%-Fn%>']}} </div><%}%><%_ if (typeof field.maxlength === 'number') {%> <div *ngIf="!Edit<%-Fn%>.pristine && Edit<%-Fn%>.errors['maxlength']" class="alert alert-danger"> <%-field.maxlengthMsg%>. </div><%}%><%_ if (typeof field.minlength === 'number') {%> <div *ngIf="!(Edit<%-Fn%>.untouched || !Edit<%-Fn%>.errors['minlength'])" class="alert alert-danger"> <%-field.minlengthMsg%>. </div><%}%> </div><% }%><%_ } else if (field.picture) {%> <div class="form-check"<%_ if (field.required) {%> [ngClass]="{'ng-valid': detail['<%-fn%>'], 'ng-invalid': !detail['<%-fn%>']}"<% } else { %> [ngClass]="{'ng-valid': true} "<%_ } %> > <input type="text" class="form-control rounded" id="Edit<%-Fn%>" style="display: none;" <%if (field.required) {%>required<%}%> [(ngModel)]="detail['<%-fn%>']" name="Edit<%-Fn%>" #Edit<%-Fn%>="ngModel"> <div style="display: inline-block; width: 80%;" > <lib-mdds-picture-select [(downloadUrl)]="detail['<%-fn%>']" [aspectRatio]="<%-field.aspectRatio%>"></lib-mdds-picture-select> </div> <span *ngIf="detail['<%-fn%>']" class="icon-clear" (click)="clearValueFromDetail('<%-fn%>')"> <i class="fas fa-times-circle" title="Clear"></i> </span> </div><%_ if (field.required) {%> <div *ngIf="!(Edit<%-Fn%>.valid || !Edit<%-Fn%>.errors)"> <div *ngIf="!Edit<%-Fn%>.pristine && Edit<%-Fn%>.errors['required']" class="alert alert-danger"> <%-fD%> is required. </div> </div><%}%><%_ } else if (field.file) { %> <div class="form-check"<%_ if (field.required) {%> [ngClass]="{'ng-valid': detail['<%-fn%>'], 'ng-invalid': !detail['<%-fn%>']}"<% } else { %> [ngClass]="{'ng-valid': true} "<%_ } %> > <input type="text" class="form-control rounded" id="Edit<%-Fn%>" style="display: none;" <%if (field.required) {%>required<%}%> [(ngModel)]="detail['<%-fn%>']" name="Edit<%-Fn%>" #Edit<%-Fn%>="ngModel"> <div style="display: inline-block; width: 80%;" > <lib-mdds-files-upload [(downloadUrl)]="detail['<%-fn%>']"></lib-mdds-files-upload> </div> <span *ngIf="detail['<%-fn%>']" class="icon-clear" (click)="clearValueFromDetail('<%-fn%>')"> <i class="fas fa-times-circle" title="Clear"></i> </span> </div><%_ if (field.required) {%> <div *ngIf="!(Edit<%-Fn%>.valid || Edit<%-Fn%>.errors)"> <div *ngIf="!Edit<%-Fn%>.pristine && Edit<%-Fn%>.errors['required']" class="alert alert-danger"> <%-fD%> is required. </div> </div><%}%><%_ } else { %><%_ if (field.enumValues) { %> <div class="form-check"<%_ if (field.required) {%> [ngClass]="{'ng-valid': enums['<%-fn%>'].includes(detail['<%-fn%>']), 'ng-invalid': !enums['<%-fn%>'].includes(detail['<%-fn%>'])}"<% } else { %> [ngClass]="{'ng-valid': true} "<%_ } %> ><%_ field.enumValues.forEach( (f) => { %> <div class="form-check-inline"> <input type="radio" name="Edit<%-Fn%>"<% if (field.required) {%> required<%}%> id="Edit<%-Fn%><%-f%>" [value]="'<%-f%>'"<% if (field.validators) {%> <%-mn%><%-Sn%>Directive<%-Fn%>=""<%}%> [(ngModel)]="detail['<%-fn%>']" #Edit<%-Fn%>="ngModel"> <label class="ms-1"><%-f%></label> </div> <%_ }) %><% if (!field.required) {%> <span *ngIf="enums['<%-fn%>'].includes(detail['<%-fn%>'])" class="icon-clear" (click)="clearValueFromDetail('<%-fn%>')"> <i class="fas fa-times-circle" title="Clear"></i> </span> <%}%> </div><%_ } else if (field.mraType === 'httpurl') { %> <div class="row pl-5 my-1"> <div class="col-12 col-md-2">Link Text</div> <div class="col-12 col-md-10 input-group"> <input type="text" class="form-control rounded" id="Edit<%-Fn%>Text" [(ngModel)]="detail['<%-fn%>']['display']" name="Edit<%-Fn%>Text" #Edit<%-Fn%>Text="ngModel"> <div *ngIf="detail['<%-fn%>']['display']" class="input-group-append icon-clear-inside " (click)="clearValueFromUrlDisplay('<%-fn%>')"> <i class="fas fa-times-circle" title="Clear"></i> </div> </div> </div> <div class="row pl-5 my-1"> <div class="col-12 col-md-2">Link URL</div> <div class="col-12 col-md-10 input-group"> <input type="text" class="form-control rounded" id="Edit<%-Fn%>" <%if (field.required) {%> required<%}%><% if (typeof field.minlength === 'number') {%> minlength="<%-field.minlength%>"<%}%><% if (typeof field.maxlength === 'number') {%> maxlength="<%-field.maxlength%>"<%}%><% if (field.match) {%> pattern="<%-field.match%>"<%}%><% if (field.validators) {%> <%-mn%><%-Sn%>Directive<%-Fn%>=""<%}%> [(ngModel)]="detail['<%-fn%>']['url']" name="Edit<%-Fn%>" #Edit<%-Fn%>="ngModel"> <div *ngIf="detail['<%-fn%>']['url']" class="input-group-append icon-clear-inside " (click)="clearValueFromUrlLink('<%-fn%>')"> <i class="fas fa-times-circle" title="Clear"></i> </div> </div> </div><%_ } else { %> <div class="input-group"><%if (field.textarea) {%> <textarea rows="8" <%} else if (field.mraType === 'email') {%> <input type="email" email="true"<%} else {%> <input type="text"<%}%> class="form-control rounded" id="Edit<%-Fn%>"<% if (field.required) {%> required<%}%><% if (typeof field.minlength === 'number') {%> minlength="<%-field.minlength%>"<%}%><% if (typeof field.maxlength === 'number') {%> maxlength="<%-field.maxlength%>"<%}%><% if (field.match) {%> pattern="<%-field.match%>"<%}%><% if (field.validators) {%> <%-mn%><%-Sn%>Directive<%-Fn%>=""<%}%> [(ngModel)]="detail['<%-fn%>']" name="Edit<%-Fn%>" #Edit<%-Fn%>="ngModel"><%if (field.textarea) {%> </textarea><%}%> <div *ngIf="detail['<%-fn%>']" class="input-group-append icon-clear-inside " (click)="clearValueFromDetail('<%-fn%>')"> <i class="fas fa-times-circle" title="Clear"></i> </div> </div><%_ } %><% if (field.required || field.validators || typeof field.maxlength === 'number' || typeof field.minlength === 'number' || typeof field.match || field.mraType === 'email') {%> <div *ngIf="!(Edit<%-Fn%>.valid || !Edit<%-Fn%>.errors)"><%_ if (field.required) {%> <div *ngIf="!Edit<%-Fn%>.pristine && Edit<%-Fn%>.errors['required']" class="alert alert-danger"> <%-fD%> is required. </div><%}%><%_ if (field.validators) {%> <div *ngIf="!Edit<%-Fn%>.pristine && Edit<%-Fn%>.errors['<%-mn%><%-Sn%>Directive<%-Fn%>']" class="alert alert-danger"> {{Edit<%-Fn%>.errors['<%-mn%><%-Sn%>Directive<%-Fn%>']}} </div><%}%><%_ if (typeof field.maxlength === 'number') {%> <div *ngIf="!Edit<%-Fn%>.pristine && Edit<%-Fn%>.errors['maxlength']" class="alert alert-danger"> <%-field.maxlengthMsg%>. </div><%}%><%_ if (typeof field.minlength === 'number') {%> <div *ngIf="!Edit<%-Fn%>.untouched && Edit<%-Fn%>.errors['minlength']" class="alert alert-danger"> <%-field.minlengthMsg%>. </div><%}%><%_ if (field.match) {%> <div *ngIf="!Edit<%-Fn%>.untouched && Edit<%-Fn%>.errors['pattern']" class="alert alert-danger"> <%-field.matchMsg%>. </div><%}%><%_ if (field.mraType === 'email') {%> <div *ngIf="!Edit<%-Fn%>.untouched && Edit<%-Fn%>.errors['email']" class="alert alert-danger"> <%-fD%> must be a valid email address. </div><%}%> </div><%}%><%_ if (!field.enumValues && field.hint) {%> <div *ngIf="editHintFields['<%-fn%>'].length > 0" class="new-area"> <div style="font-size: 0.9rem;">Type in new value or select from available ones: </div> <ng-template ngFor let-hintEle [ngForOf]="editHintFields['<%-fn%>']" let-i="index"> <div class="badge rounded-pill bg-primary pointer" *ngIf="detail['<%-fn%>'] !== hintEle['_id']" (click)="detail['<%-fn%>'] = hintEle['_id']"> {{hintEle['_id']}} </div> </ng-template> </div><%_ }%><%_ }%><% } else if (field.type === "SchemaBoolean") { %> <div class="form-check"<%_ if (field.required) {%> [ngClass]="{'ng-valid': detail['<%-fn%>'] == true || detail['<%-fn%>'] == false, 'ng-invalid': detail['<%-fn%>'] != true && detail['<%-fn%>'] != false}"<% } else { %> [ngClass]="{'ng-valid': true} "<%_ } %> > <div class="form-check-inline"> <input type="radio" name="Edit<%-Fn%>" id="Edit<%-Fn%>Yes" [value]="true"<% if (field.required) {%> required<%}%><% if (field.validators) {%> <%-mn%><%-Sn%>Directive<%-Fn%>=""<%}%> [(ngModel)]="detail['<%-fn%>']" #Edit<%-Fn%>="ngModel"> <label class="ms-1">Yes</label> </div> <div class="form-check-inline"> <input type="radio" name="Edit<%-Fn%>" id="Edit<%-Fn%>No" [value]="false"<% if (field.required) {%> required<%}%><% if (field.validators) {%> <%-mn%><%-Sn%>Directive<%-Fn%>=""<%}%> [(ngModel)]="detail['<%-fn%>']" #Edit<%-Fn%>="ngModel"> <label class="ms-1">No</label> </div><% if (!field.required) {%> <div *ngIf="detail['<%-fn%>'] == true || detail['<%-fn%>'] == false" class="form-check-inline" (click)="clearValueFromDetail('<%-fn%>')"> <i class="fas fa-times-circle" title="Clear"></i> </div> <%}%> </div> <div *ngIf="!(Edit<%-Fn%>.valid || !Edit<%-Fn%>.errors)"><%_ if (field.required) {%> <div *ngIf="Edit<%-Fn%>.pristine && Edit<%-Fn%>.errors['required']" class="alert alert-danger"> <%-fD%> is required. </div><%}%><%_if (field.validators) {%> <div *ngIf="Edit<%-Fn%>.pristine && Edit<%-Fn%>.errors['<%-mn%><%-Sn%>Directive<%-Fn%>']" class="alert alert-danger"> {{Edit<%-Fn%>.errors['<%-mn%><%-Sn%>Directive<%-Fn%>']}} </div><%}%> </div><%_ } else if (field.type === "SchemaNumber") { %><% if (field.mraType === 'currency'){%> <span class="currency">$</span><%}%> <input type="number" class="form-control" id="Edit<%-Fn%>"<% if (typeof field.numberMin === 'number') {%> libMddsMinNumber="<%-field.numberMin%>" min="<%-field.numberMin%>"<%}%><% if (typeof field.numberMax === 'number') {%> libMddsMaxNumber="<%-field.numberMax%>" max="<%-field.numberMax%>"<%}%><% if (field.required) {%> required<%}%><% if (field.validators) {%> <%-mn%><%-Sn%>Directive<%-Fn%>=""<%}%> [(ngModel)]="detail['<%-fn%>']" name="Edit<%-Fn%>" #Edit<%-Fn%>="ngModel"><%_ if (field.required || field.validators || typeof field.numberMax === 'number' || typeof field.numberMin === 'number') {%> <div *ngIf="!(Edit<%-Fn%>.valid || !Edit<%-Fn%>.errors)"><%_ if (field.required) {%> <div *ngIf="!Edit<%-Fn%>.pristine && Edit<%-Fn%>.errors['required']" class="alert alert-danger"> <%-fD%> is required. </div><%}%><%_ if (field.validators) {%> <div *ngIf="!Edit<%-Fn%>.pristine && Edit<%-Fn%>.errors['<%-mn%><%-Sn%>Directive<%-Fn%>']" class="alert alert-danger"> {{Edit<%-Fn%>.errors['<%-mn%><%-Sn%>Directive<%-Fn%>']}} </div><%}%><%_ if (typeof field.numberMax === 'number') {%> <div *ngIf="!Edit<%-Fn%>.pristine && Edit<%-Fn%>.errors['libMddsMaxNumber']" class="alert alert-danger"> <%-field.numberMaxMsg%>. </div><%}%><%_ if (typeof field.numberMin === 'number') {%> <div *ngIf="!Edit<%-Fn%>.untouched && Edit<%-Fn%>.errors['libMddsMinNumber']" class="alert alert-danger"> <%-field.numberMinMsg%>. </div><%}%> </div><%}%><%_ } else if (field.type === "SchemaDate") { %> <div class="row align-items-start"> <% let colClassDate = 'col-11'; let colClassTime = ''; if (field.mraDate.includes('time')) { colClassDate = 'col-12 col-md-8'; colClassTime = 'col-11 col-md-3'; } %> <div class="<%-colClassDate%>"> <div class="input-group mb-1"> <input class="form-control" id="Edit<%-Fn%>" placeholder="{{dateFormat}}"<% if (field.required) {%> required<%}%><% if (field.validators) {%> <%-mn%><%-Sn%>Directive<%-Fn%>=""<%}%> [(ngModel)]="detail['<%-fn%>']['date']" name="Edit<%-Fn%>" ngbDatepicker [minDate]="minDate" #Edit<%-Fn%>Date="ngbDatepicker" #Edit<%-Fn%>="ngModel"> <div class="input-group-append"> <button class="btn btn-outline-secondary" (click)="Edit<%-Fn%>Date.toggle()" type="button"> <i class="fas fa-calendar-alt"></i> </button> </div> </div><!-- input group --> <div *ngIf="!(Edit<%-Fn%>.valid || !Edit<%-Fn%>.errors)"><%_ if (field.required) {%> <div *ngIf="!Edit<%-Fn%>.pristine && Edit<%-Fn%>.errors['required'] && !(detail['<%-fn%>']?.date)" class="alert alert-danger"> Date is required. </div><%}%><%_ if (field.validators) {%> <div *ngIf="!Edit<%-Fn%>.pristine && Edit<%-Fn%>.errors['<%-mn%><%-Sn%>Directive<%-Fn%>']" class="alert alert-danger"> {{Edit<%-Fn%>.errors['<%-mn%><%-Sn%>Directive<%-Fn%>']}} </div><%}%> <div *ngIf="!(Edit<%-Fn%>.untouched || !Edit<%-Fn%>.errors['ngbDate'] || !Edit<%-Fn%>.errors['ngbDate']['minDate'])" class="alert alert-danger"> Date must not be earlier than {{minDate | json}}. </div> <div *ngIf="!(Edit<%-Fn%>.untouched || !Edit<%-Fn%>.errors['ngbDate'] || !Edit<%-Fn%>.errors['ngbDate']['invalid'])" class="alert alert-danger"> <%-fD%> must be in {{dateFormat}} format. </div> </div> </div><% if (field.mraDate.includes('time')) {%> <div class="<%-colClassTime%>"> <div class="input-group mb-1"> <input class="form-control" id="Edit<%-Fn%>Time" placeholder="" type="time"<% if (field.required) {%> required<%}%> [(ngModel)]="detail['<%-fn%>']['t_value']" name="Edit<%-Fn%>Time" #Edit<%-Fn%>Time="ngModel" > </div><!-- input group --> <div *ngIf="!(Edit<%-Fn%>Time.valid || !Edit<%-Fn%>Time.errors)"><%_ if (field.required) {%> <div *ngIf="!Edit<%-Fn%>Time.pristine && Edit<%-Fn%>Time.errors['required']" class="alert alert-danger"> Time is required. </div><%}%> </div> </div><% }%> <div *ngIf="detail['<%-fn%>']['date'] || detail['<%-fn%>']['time']" class="col-1 mt-1"> <span class="ms-0 icon-clear" (click)="clearValueFromDetail('<%-fn%>')"> <i class="fas fa-times-circle" title="Clear"></i> </span> </div> </div><%_ } else if (field.type === "ObjectId") { %> <!-- <a class="icon-search" [routerLink]="['.']" (click)="onRefSelect('<%-field.fieldName%>')"><i class="fas fa-list" title="Search"></i></a> --> <div class="input-group" #field<%-Fn%>> <input class="form-control rounded" id="Edit<%-Fn%>" [ngClass]="{'pointer ref-badge': detail['<%-fn%>']['_id']}" [disabled]="fieldsRefOpened['<%-fn%>']" (focus)="onRefSelect('<%-fn%>')"<% if (field.required) {%> required<%}%><% if (field.validators) {%> <%-mn%><%-Sn%>Directive<%-Fn%>=""<%}%> [ngModel]="detail['<%-fn%>']['valueMedium']" name="Edit<%-Fn%>" #Edit<%-Fn%>="ngModel" > <div *ngIf="detail['<%-fn%>']['valueMedium']" class="input-group-append icon-clear-inside " (click)="clearValueFromDetail('<%-fn%>')"> <i class="fas fa-times-circle" title="Clear"></i> </div> </div><%_ if (field.required || field.validators) {%> <div *ngIf="!(Edit<%-Fn%>.valid || !Edit<%-Fn%>.errors)"><%_ if (field.required) {%> <div *ngIf="!Edit<%-Fn%>.pristine && Edit<%-Fn%>.errors['required'] && !(detail['<%-fn%>']?.date)" class="alert alert-danger"> <%-fD%> is required. </div><%}%><%_ if (field.validators) {%> <div *ngIf="!Edit<%-Fn%>.pristine && Edit<%-Fn%>.errors['<%-mn%><%-Sn%>Directive<%-Fn%>']" class="alert alert-danger"> {{Edit<%-Fn%>.errors['<%-mn%><%-Sn%>Directive<%-Fn%>']}} </div><%}%> </div><%}%><%_ } else if (field.type === "Map") { %><%_ if (field.elementType === "SchemaString" || field.elementType === "SchemaNumber") { %> <div class="form-check" ngModelGroup="Edit<%-Fn%>"<% if (field.required) {%> libMddsMapRequired<%}%> #Edit<%-Fn%>="ngModelGroup" > <div class="row small"> <div class="col-5 font-weight-bold"> Key <%if (field.keyDescription) {%><span><i data-bs-toggle="tooltip" title="<%-field.keyDescription%>" class="far fa-question-circle"></i></span><%}%> </div> <div class="col-5 font-weight-bold"> Value <%if (field.valueDescription) {%><span><i data-bs-toggle="tooltip" title="<%-field.valueDescription%>" class="far fa-question-circle"></i></span><%}%> </div> </div> <hr> <ng-template [ngIf]="detail['<%-fn%>'] && detail['<%-fn%>']['selection']"> <ng-template ngFor let-key [ngForOf]="objectKeys(detail['<%-fn%>']['selection'])" let-idx="index"> <div class="row mb-2"> <label class="form-check-label small col-12 col-md-5">{{key}}: </label> <div class="col-11 col-md-5"><%_ if (field.elementType === "SchemaString") { %><% if (field.mraType === 'email') {%> <input type="email" email="true"<%} else {%> <input type="text"<%}%> placeholder="Value for {{key}}" class="form-control form-control-sm" id="<%-Fn%>Element{{idx}}"<% if (typeof field.minlength === 'number') {%> minlength="<%-field.minlength%>"<%}%><% if (typeof field.maxlength === 'number') {%> maxlength="<%-field.maxlength%>"<%}%><% if (field.match) {%> pattern="<%-field.match%>"<%}%><% if (field.validators) {%> <%-mn%><%-Sn%>Directive<%-Fn%>=""<%}%> [(ngModel)]="detail['<%-fn%>']['selection'][key]" name="<%-Fn%>Element{{idx}}" #<%-Fn%>Element{{idx}}="ngModel"> <%_ } else if (field.elementType === "SchemaNumber") { %> <input type="number" class="form-control form-control-sm" id="<%-Fn%>Element{{idx}}" placeholder="Value for {{key}}"<% if (typeof field.numberMin === 'number') {%> libMddsMinNumber="<%-field.numberMin%>" min="<%-field.numberMin%>"<%}%><% if (typeof field.numberMax === 'number') {%> libMddsMaxNumber="<%-field.numberMax%>" max="<%-field.numberMax%>"<%}%><% if (field.validators) {%><%-mn%><%-Sn%>Directive<%-Fn%>=""<%}%> [(ngModel)]="detail['<%-fn%>']['selection'][key]" name="<%-Fn%>Element{{idx}}" #<%-Fn%>Element{{idx}}="ngModel"><%_ }%> </div> <div class="col-1"> <i class="fas fa-times-circle" (click)="clearValueFromMapField('<%-fn%>', key)" title="Remove"></i> </div> </div><%_ if (field.elementType === "SchemaString") { %><%_ if (field.validators || field.mraType === 'email' || field.match || typeof field.maxlength === 'number' || typeof field.minlength === 'number') {%> <div *ngIf="!(!Edit<%-Fn%>.control.controls || !Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx] || Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].valid || !Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].errors)"><%_ if (field.validators) {%> <div *ngIf="!Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].pristine && Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].errors['<%-mn%><%-Sn%>Directive<%-Fn%>']" class="alert alert-danger small p-1"> {{Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].errors['<%-mn%><%-Sn%>Directive<%-Fn%>']}} </div><%}%><%_ if (typeof field.maxlength === 'number') {%> <div *ngIf="!Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].pristine && Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].errors['maxlength']" class="alert alert-danger small p-1"> <%-field.maxlengthMsg%>. </div><%}%><%_ if (typeof field.minlength === 'number') {%> <div *ngIf="!Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].untouched && Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].errors['minlength']" class="alert alert-danger small p-1"> <%-field.minlengthMsg%>. </div><%}%><%_ if (field.match) {%> <div *ngIf="!Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].untouched && Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].errors['pattern']" class="alert alert-danger small p-1"> <%-field.matchMsg%>. </div><%}%><%_ if (field.mraType === 'email') {%> <div *ngIf="!Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].untouched && Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].errors['email']" class="alert alert-danger small p-1"> Value must be a valid email address. </div><%}%> </div><%}%><%_ } else if (field.elementType === "SchemaNumber") { %><%_ if (field.validators || typeof field.numberMax === 'number' || typeof field.numberMin === 'number') {%> <div *ngIf="!(!Edit<%-Fn%>.control.controls || !Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx] || Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].valid || !Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].errors)"><%_ if (field.validators) {%> <div *ngIf="!Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].pristine && Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].errors['<%-mn%><%-Sn%>Directive<%-Fn%>']" class="alert alert-danger small p-1"> {{Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].errors['<%-mn%><%-Sn%>Directive<%-Fn%>']}} </div><%}%><%_ if (typeof field.numberMax === 'number') {%> <div *ngIf="!Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].pristine && Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].errors['libMddsMaxNumber']" class="alert alert-danger small p-1"> <%-field.numberMaxMsg%>. </div><%}%><%_ if (typeof field.numberMin === 'number') {%> <div *ngIf="!Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].untouched && Edit<%-Fn%>.control.controls['<%-Fn%>Element'+idx].errors['libMddsMinNumber']" class="alert alert-danger small p-1"> <%-field.numberMinMsg%>. </div><%}%> </div><%}%><%_ }%> </ng-template> </ng-template> <div class="row"> <div class="input-group input-group-sm col-12 col-md-7"> <input type="text" class="form-control border" id="Edit<%-Fn%>New" #Edit<%-Fn%>New="ngModel" [(ngModel)]="detail['<%-fn%>']['new']" [ngModelOptions]="{standalone: true}" (keydown.enter)="$any($event.target).blur();onAddMapItem('<%-fn%>');false" > <div class="input-group-append"> <button type="button" class="btn btn-outline-secondary" (click)="onAddMapItem('<%-fn%>')"> <i class="fas fa-plus" title="Add new key"></i> </button> </div> <span class="ms-1 small">new key</span> </div> </div> </div><%_ } else { %> <div>Not supported yet.</div><%_ } %><%_ if (field.required) {%> <div *ngIf="Edit<%-Fn%>.errors && Edit<%-Fn%>.errors['required']" class="alert alert-danger"> <%-fD%> is required. </div><%}%><%_ } else if (field.type === "SchemaArray") { %><%_ if (field.elementType === "SchemaString" && field.elementMultiSelect) { %> <div class="form-check" ngModelGroup="Edit<%-Fn%>"<% if (field.required) {%> libMddsMultiSelectionRequired<%}%> #Edit<%-Fn%>="ngModelGroup" ><%_ field.enumValues.forEach( (f, index) => { const fd = f.trim().replace(/\s+/g, ''); %> <div class="form-check-inline"> <input type="checkbox" name="Edit<%-Fn%><%-fd%>" id="Edit<%-Fn%><%-fd%>" [(ngModel)]="detail['<%-fn%>']['selection']['<%-f%>']" #Edit<%-Fn%><%-fd%>="ngModel"> <label class="ms-1"><%-f%></label> </div><%_ }) %> <span *ngIf="multiselectionSelected('<%-fn%>')" class="icon-clear" (click)="clearValueFromDetail('<%-fn%>')"> <i class="fas fa-times-circle" title="Clear"></i> </span> </div><%_ } else if (field.elementType === 'SchemaString' && field.picture) { %> <div class="form-check" ngModelGroup="Edit<%-Fn%>"<% if (field.required) {%> libMddsArrayRequired<%}%> #Edit<%-Fn%>="ngModelGroup" > <div class="d-flex align-items-center"> <div class="picture-small-block" *ngFor="let element of detail['<%-fn%>']['selection']; let i = index;"> <lib-mdds-picture-display [downloadUrl]="element" [isLarge]="false" [style]="{img: {'background-color': '#8080801f', 'object-fit': 'contain', width: '100%'}}"> </lib-mdds-picture-display> <i class="fas fa-times-circle icon-clear-badge-ontop" (click)="clearValueFromArrayField('<%-fn%>', i)" title="Remove"></i> </div> <span *ngIf="arraySelected('<%-fn%>')" class="icon-clear" (click)="clearValueFromDetail('<%-fn%>')"> <i class="fas fa-times-circle" title="Clear All"></i> </span> </div> <hr> <div class="new-area"> <div class="mt-1"> <a class="pointer" routerLink="." (click)="onAddArrayItemClicked('<%-fn%>')" style="font-size: 0.75rem;"> <i class="fas fa-plus-square" title="Add"></i> Add </a> </div> </div> <div *ngIf="detail['<%-fn%>']['adding']"> <lib-mdds-picture-select [aspectRatio]="<%-field.aspectRatio%>" [disableDisplay]="true" [askForSelect]="detail['<%-fn%>']['adding']" (downloadUrlChange)="detail['<%-fn%>']['new'] = $event; onAddArrayItem('<%-fn%>')"> </lib-mdds-picture-select> </div> <!-- fake hidden input ngModel for directive to check the values--> <input type="checkbox" name="Edit<%-Fn%>Selection" style="display:none" id="Edit<%-Fn%>Selection" [(ngModel)]="detail['<%-fn%>']['selection'].length" #Edit<%-Fn%>Selection="ngModel"> </div><%_ } else if (field.elementType === 'SchemaString' && field.file) { %> <div class="form-check" ngModelGroup="Edit<%-Fn%>"<% if (field.required) {%> libMddsArrayRequired<%}%> #Edit<%-Fn%>="ngModelGroup" > <div class="d-flex align-items-center"> <div> <div class="d-flex align-items-center" *ngFor="let element of detail['<%-fn%>']['selection']; let i = index;"> <lib-mdds-files-display [downloadUrls]="[element]"> </lib-mdds-files-display> <i class="fas fa-times-circle icon-clear-bg-light" (click)="clearValueFromArrayField('<%-fn%>', i)" title="Remove"></i> </div> </div> <span *ngIf="arraySelected('<%-fn%>') && detail['<%-fn%>']['selection'].length > 1" class="icon-clear" (click)="clearValueFromDetail('<%-fn%>')"> <i class="fas fa-times-circle" title="Clear All"></i> </span> </div> <hr> <div class="new-area"> <div class="mt-1"> <a class="pointer" routerLink="." (click)="onAddArrayItemClicked('<%-fn%>')" style="font-size: 0.75rem;"> <i class="fas fa-plus-square" title="Upload"></i> Upload </a> </div> </div> <lib-mdds-files-upload [disableDisplay]="true" [askForSelect]="detail['<%-fn%>']['adding']" (downloadUrlChange)="detail['<%-fn%>']['new'] = $event; onAddArrayItem('<%-fn%>')"> </lib-mdds-files-upload> <!-- fake hidden input ngModel for directive to check the values--> <input type="checkbox" name="Edit<%-Fn%>Selection" style="display:none" id="Edit<%-Fn%>Selection" [(ngModel)]="detail['<%-fn%>']['selection'].length" #Edit<%-Fn%>Selection="ngModel"> </div><%_ } else if (field.elementType === 'SchemaString' && field.mraType === 'httpurl') { %> <div class="form-check" ngModelGroup="Edit<%-Fn%>"<% if (field.required) {%> libMddsArrayRequired<%}%> #Edit<%-Fn%>="ngModelGroup" > <div class="d-flex align-items-center"> <div class="d-flex align-items-center badge rounded-pill bg-light" *ngFor="let element of detail['<%-fn%>']['selection']; let i = index;"> <a class="" href="{{element['url']}}">{{element['display'] || element['url']}}</a> <i class="fas fa-times-circle icon-clear-bg-light" (click)="clearValueFromArrayField('<%-fn%>', i)" title="Remove"></i> </div> <span *ngIf="arraySelected('<%-fn%>') && detail['<%-fn%>']['selection'].length > 1" class="icon-clear" (click)="clearValueFromDetail('<%-fn%>')"> <i class="fas fa-times-circle" title="Clear All"></i> </span> </div> <hr> <div class="new-area"> <div class="mt-1"> <a class="pointer" routerLink="." (click)="onAddArrayItemClicked('<%-fn%>')" style="font-size: 0.75rem;"> <i class="fas fa-plus-square" title="Upload"></i> New </a> </div> </div> <div *ngIf="detail['<%-fn%>']['adding']" class="new-modal"> <div class="card text-center new-card"> <div class="card-body"> <div class="row my-1"> <div class="col-12 text-left">Link Text</div> <div class="col-12 input-group"> <input type="text" class="form-control rounded" id="Edit<%-Fn%>NewText" [ngModelOptions]="{standalone: true}" [(ngModel)]="detail['<%-fn%>']['new']['display']" name="Edit<%-Fn%>NewText" #Edit<%-Fn%>NewText="ngModel"> <div *ngIf="detail['<%-fn%>']['new']['display']" class="input-group-append icon-clear-inside " (click)="detail['<%-fn%>']['new']['display'] = ''"> <i class="fas fa-times-circle" title="Clear"></i> </div> </div> </div> <div class="row my-1"> <div class="col-12 text-left">Link URL</div> <div class="col-12 input-group"> <input type="text" class="form-control rounded" id="Edit<%-Fn%>New" [ngModelOptions]="{standalone: true}" required<% if (typeof field.minlength === 'number') {%> minlength="<%-field.minlength%>"<%}%><% if (typeof field.maxlength === 'number') {%> maxlength="<%-field.maxlength%>"<%}%><% if (field.match) {%> pattern="<%-field.match%>"<%}%><% if (field.validators) {%> <%-mn%><%-Sn%>Directive<%-Fn%>=""<%}%> [(ngModel)]="detail['<%-fn%>']['new']['url']" name="Edit<%-Fn%>New" #Edit<%-Fn%>New="ngModel"> <div *ngIf="detail['<%-fn%>']['new']['url']" class="input-group-append icon-clear-inside " (click)="detail['<%-fn%>']['new']['url'] = ''"> <i class="fas fa-times-circle" title="Clear"></i> </div> </div> </div> <div *ngIf="!(Edit<%-Fn%>New.valid || !Edit<%-Fn%>New.errors}"> <div *ngIf="!(Edit<%-Fn%>New.pristine)" class="alert alert-danger small p-1"> <div *ngIf="Edit<%-Fn%>New.errors['required']"> Value is required. </div><%_ if (field.validators) {%> <div *ngIf="Edit<%-Fn%>New.errors['<%-mn%><%-Sn%>Directive<%-Fn%>']"> {{Edit<%-Fn%>New.errors['<%-mn%><%-Sn%>Directive<%-Fn%>']}} </div><%}%><%_ if (typeof field.maxlength === 'number') {%> <div *ngIf="Edit<%-Fn%>New.errors['maxlength']"> <%-field.maxlengthMsg%>. </div><%}%> </div><%_ if (typeof field.minlength === 'number') {%> <div *ngIf="!Edit<%-Fn%>New.untouched && Edit<%-Fn%>New.errors['minlength']" class="alert alert-danger small p-1"> <%-field.minlengthMsg%>. </div><%}%><%_ if (field.match) {%> <div *ngIf="!Edit<%-Fn%>New.untouched && Edit<%-Fn%>New.errors['pattern']" class="alert alert-danger small p-1"> {{field.matchMsg}}. </div><%}%> </div> <div class="d-flex my-3 justify-content-center"> <button class="btn btn-outline-primary mx-1" [disabled]="!Edit<%-Fn%>New.valid" (click)="onAddArrayItem('<%-fn%>')">Confirm</button> <button class="btn btn-outline-secondary mx-1" (click)="onAddArrayItemCancelled('<%-fn%>')">Cancel</button> </div> </div> </div> </div> <!-- fake hidden input ngModel for directive to check the values--> <input type="checkbox" name="Edit<%-Fn%>Selection" style="display:none" id="Edit<%-Fn%>Selection" [(ngModel)]="detail['<%-fn%>']['selection'].length" #Edit<%-Fn%>Selection="ngModel"> </div><%_ } else if (field.elementType === 'SchemaString') { %> <div class="form-check" ngModelGroup="Edit<%-Fn%>"<% if (field.required) {%> directive<%-Mn%>ArrayRequired<%}%> #Edit<%-Fn%>="ngModelGroup" > <div class="badge-group" *ngIf="detail['<%-fn%>'] && detail['<%-fn%>']['selection']"> <div class="badge rounded-pill bg-secondary" *ngFor="let element of detail['<%-fn%>']['selection']; let i = index;"> {{element}} <i class="fas fa-times-circle icon-clear-badge" (click)="clearValueFromArrayField('<%-fn%>', i)" title="Remove"></i> </div> <span *ngIf="arraySelected('<%-fn%>')" class="icon-clear" (click)="clearValueFromDetail('<%-fn%>')"> <i class="fas fa-times-circle" title="Clear"></i> </span> </div> <hr> <div class="new-area"><% if (field.hint) {%> <div *ngIf="editHintFields['<%-fn%>'].length > 0" style="font-size: 0.9rem;">Select from Available <%-fD%>: </div> <ng-template ngFor let-hintEle [ngForOf]="editHintFields['<%-fn%>']" let-i="index"> <div class="badge rounded-pill bg-primary pointer" *ngIf="!detail['<%-fn%>']['selection'].includes(hintEle['_id'])" (click)="onAddArrayItemValue('<%-fn%>', hintEle['_id'])"> {{hintEle['_id']}} </div> </ng-template><%_ }%> <div class="mt-1"> <a class="pointer" routerLink="." (click)="onAddArrayItemClicked('<%-fn%>')" style="font-size: 0.75rem;"> <i class="fas fa-plus-square" title="New"></i> New </a> </div> </div> <div *ngIf="detail['<%-fn%>']['adding']" class="new-modal"> <div class="card text-center new-card"> <div class="card-body"><%if (field.mraType === 'email') {%> <input type="email" email="true"<%} else {%> <input type="text"<%}%> class="form-control border" id="Edit<%-Fn%>New" #Edit<%-Fn%>New="ngModel" [(ngModel)]="detail['<%-fn%>']['new']" [ngModelOptions]="{standalone: true}"<% if (typeof field.minlength === 'number') {%> minlength="<%-field.minlength%>"<%}%><% if (typeof field.maxlength === 'number') {%> maxlength="<%-field.maxlength%>"<%}%><% if (typeof field.match) {%> pattern="<%-field.match%>"<%}%><% if (field.validators) {%> <%-mn%><%-Sn%>Directive<%-Fn%>=""<%}%> (keydown.enter)="$any($event.target).blur();onAddArrayItem('<%-fn%>');false"><% if (field.validators || typeof field.maxlength === 'number' || typeof field.minlength === 'number' || field.match || field.mraType === 'email') {%> <div *ngIf="!(Edit<%-Fn%>New.valid ||!Edit<%-Fn%>New.errors)"><%_ if (field.validators) {%> <div *ngIf="!Edit<%-Fn%>New.pristine && Edit<%-Fn%>New.errors['<%-mn%><%-Sn%>Directive<%-Fn%>']" class="alert alert-danger small p-1"> {{Edit<%-Fn%>New.errors['<%-mn%><%-Sn%>Directive<%-Fn%>']}} </div><%}%><%_ if (typeof field.maxlength === 'number') {%> <div *ngIf="!Edit<%-Fn%>New.pristine && Edit<%-Fn%>New.errors['maxlength']" class="alert alert-danger small p-1"> <%-field.maxlengthMsg%>. </div><%}%><%_ if (typeof field.minlength === 'number') {%> <div *ngIf="!Edit<%-Fn%>New.untouched && Edit<%-Fn%>New.errors['minlength']" class="alert alert-danger small p-1"> <%-field.minlengthMsg%>. </div><%}%><%_ if (field.match) {%> <div *ngIf="!Edit<%-Fn%>New.untouched && Edit<%-Fn%>New.errors['pattern']" class="alert alert-danger small p-1"> <%-field.matchMsg%>. </div><%}%><%_ if (field.mraType === 'email') {%> <div *ngIf="!Edit<%-Fn%>New.untouched && Edit<%-Fn%>New.errors['email']" class="alert alert-danger small p-1"> Value must be a valid email address. </div><%}%> </div><%}%> <div class="d-flex my-3 justify-content-center"> <button class="btn btn-outline-primary mx-1" [disabled]="!Edit<%-Fn%>New.valid" (click)="onAddArrayItem('<%-fn%>')">Confirm</button> <button class="btn btn-outline-secondary mx-1" (click)="onAddArrayItemCancelled('<%-fn%>')">Cancel</button> </div> </div> </div> </div> <!-- fake hidden input ngModel for directive to check the values--> <input type="checkbox" name="Edit<%-Fn%>Selection" style="display:none" id="Edit<%-Fn%>Selection" [(ngModel)]="detail['<%-fn%>']['selection'].length" #Edit<%-Fn%>Selection="ngModel"> </div><%_ } else if (field.elementType === 'ObjectId') { %> <div class="form-check" ngModelGroup="Edit<%-Fn%>"<% if (field.required) {%> directive<%-Mn%>ArrayRequired<%}%> #Edit<%-Fn%>="ngModelGroup" #field<%-Fn%> > <ng-template [ngIf]="detail['<%-fn%>'] && detail['<%-fn%>']['selection']"> <div class="badge rounded-pill bg-secondary" *ngFor="let element of detail['<%-fn%>']['selection']; let i = index;"> {{element.valueMedium}} <i class="fas fa-times-circle icon-clear-badge" (click)="clearValueFromArrayField('<%-fn%>', i)" title="Remove"></i> </div> </ng-template> <span *ngIf="arraySelected('<%-fn%>')" class="icon-clear" (click)="clearValueFromDetail('<%-fn%>')"> <i class="fas fa-times-circle" title="Clear"></i> </span> <button type="button" class="btn btn-light ms-3" (click)="onRefSelect('<%-fn%>')"> <i class="fas fa-plus" title="Add"></i> </button> <!-- fake hidden input ngModel for directive to check the values--> <input type="checkbox" name="Edit<%-Fn%>Selection" style="display:none" id="Edit<%-Fn%>Selection" [(ngModel)]="detail['<%-fn%>']['selection'].length" #Edit<%-Fn%>Selection="ngModel"> </div><%_ } else { %> <div>Not supported yet.</div><%_ } %><% if (field.required) {%> <div *ngIf="!(Edit<%-Fn%>.valid || !Edit<%-Fn%>.errors)"> <div *ngIf="!Edit<%-Fn%>.pristine && Edit<%-Fn%>.errors['required']" class="alert alert-danger"> <%-fD%> is required. </div> </div><%}%><%_ } else if (ft === 'AngularSelector') { let sel = field.selector;%> <!--Create a fake required ngModel in case validation is needed.--> <input type="text" class="form-control rounded" id="Edit<%-Fn%>" style="display: none;" required [(ngModel)]="detail['<%-fn%>']" name="Edit<%-Fn%>" #Edit<%-Fn%>="ngModel"> <<%-sel.selector%><% for(let input of sel.inputs) {%> [<%-input.key%>]="<%-input.value%>"<%}%><%for(let output of sel.outputs) {%> (<%-output.key%>)="<%-output.