File
Implements
Metadata
selector |
re-prompt |
styleUrls |
dialog.scss |
templateUrl |
./prompt-dialog.component.html |
defaultTemplate
|
defaultTemplate: TemplateRef<any>
|
Type : TemplateRef<any>
|
Decorators : ViewChild
|
|
dismiss
|
dismiss: EventEmitter<any>
|
Type : EventEmitter<any>
|
|
validators
|
validators: literal type
|
Type : literal type
|
|
import { Component, EventEmitter, OnInit, TemplateRef, ViewChild, ChangeDetectorRef } from '@angular/core';
import { FormBuilder, FormGroup, ValidatorFn, AbstractControl } from '@angular/forms';
import { DialogOptions, PromptContent } from './dialog-options.model';
import { RebirthNGConfig } from '../rebirth-ng.config';
import { Modal } from '../modal/modal.model';
import { ModalDismissReasons } from '../modal/modal-dismiss-reasons.model';
@Component({
selector: 're-prompt',
templateUrl: './prompt-dialog.component.html',
styleUrls: ['./dialog.scss']
})
export class PromptDialogComponent implements Modal, OnInit {
context: DialogOptions;
content: PromptContent;
dismiss: EventEmitter<any>;
btnYes: string;
btnNo: string;
btnYesType: string;
btnNoType: string;
form: FormGroup;
validators: { [key: string]: { validator: ValidatorFn, message: string } };
@ViewChild('defaultTemplate') defaultTemplate: TemplateRef<any>;
constructor(private rebirthNGConfig: RebirthNGConfig,
private formBuilder: FormBuilder,
private changeDetectorRef: ChangeDetectorRef) {
this.btnYes = rebirthNGConfig.dialog.button.yes;
this.btnYesType = rebirthNGConfig.dialog.button.btnYesType;
this.btnNo = rebirthNGConfig.dialog.button.no;
this.btnNoType = rebirthNGConfig.dialog.button.btnNoType;
}
ngOnInit(): void {
this.content = this.context.content as PromptContent;
this.validators = this.content.validators || {};
const validatorFns = Object.keys(this.validators).map((key) => this.validators[key].validator);
this.form = this.formBuilder.group({
promptValue: [this.content.defaultValue || '', validatorFns]
});
this.form.valueChanges.subscribe(() => {
this.changeDetectorRef.markForCheck();
});
}
getFieldErrors(control: AbstractControl) {
if (control && control.errors) {
const errors = Object.keys(control.errors).filter((key) => control.errors[key]);
return errors.length > 0 ? [errors[0]] : [];
}
}
yes() {
this.dismiss.emit({ ...this.form.value, type: ModalDismissReasons.YES });
}
no() {
this.dismiss.error(ModalDismissReasons.NO);
}
}
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close" (click)="no()">
<span aria-hidden="true">×</span></button>
<h4 class="modal-title">{{context.title}}</h4>
</div>
<div class="modal-body">
<form [formGroup]="form" novalidate>
<div class="form-group"
[class.has-error]="form.controls['promptValue'].touched && form.controls['promptValue'].invalid">
<label for="promptValue" class="control-label">{{content?.label}}</label>
<ng-template [ngTemplateOutlet]="content.template || defaultTemplate"
[ngTemplateOutletContext]="{ $implicit: this, option: context, formGroup:form }"></ng-template>
<ng-container *ngIf="form.controls['promptValue'].touched">
<div class="help-block" *ngFor="let key of getFieldErrors(form.controls['promptValue'])">
{{validators[key]?.message}}
</div>
</ng-container>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" [disabled]="form.untouched || form.invalid" class="btn btn-{{btnYesType}}" (click)="yes()">
{{context.yes ||btnYes}}
</button>
<button type="button" class="btn btn-{{btnNoType}}" (click)="no()">{{context.no || btnNo}}</button>
</div>
<ng-template #defaultTemplate let-option="option" let-formGroup="formGroup">
<input type="text" class="form-control" id="promptValue" name="promptValue"
[formControl]="formGroup.controls.promptValue"
[placeholder]="option.content?.placeholder">
</ng-template>
Legend
Html element with directive