UNPKG

@webdev-tools/ng-nested-reactive-forms

Version:
77 lines 9.22 kB
import { Directive, EventEmitter, HostListener, Input, Optional, Output, Renderer2, TemplateRef, ViewContainerRef, } from '@angular/core'; import { NrfFormContext } from './form-context.class'; import { NrfSubmitData } from './form-submit-data.class'; import { NrfFormService } from './form.service'; export class NrfFormDirective { constructor(templateRef, viewContainerRef, formService, renderer) { this.templateRef = templateRef; this.viewContainerRef = viewContainerRef; this.formService = formService; this.renderer = renderer; if (!formService) { this.formService = new NrfFormService(); } } set nrfEntity(entity) { this.formService.entity = entity; } get nrfEntity() { return this.formService.entity; } get formData() { return this.formService.formData; } get formGroup() { return this.formService.formGroup; } get nrfSubmit() { return this.formService.submit$; } ngOnInit() { if (!this.nrfEntity) { this.nrfEntity = {}; } this.renderView(); } ngOnDestroy() { this.nrfSubmit.complete(); } renderView() { if (this.templateRef && this.viewContainerRef) { const embeddedViewRef = this.viewContainerRef.createEmbeddedView(this.templateRef, new NrfFormContext(this)); const formNative = embeddedViewRef.rootNodes[0]; this.renderer.listen(formNative, 'submit', event => this.formSubmitWrapper(event)); } } formSubmitWrapper($event) { $event.preventDefault(); if (!this.formGroup.valid) { return; } this.nrfSubmit.emit(new NrfSubmitData(this, $event)); } } NrfFormDirective.decorators = [ { type: Directive, args: [{ selector: '[nrfForm]', exportAs: 'nrfForm', },] } ]; NrfFormDirective.ctorParameters = () => [ { type: TemplateRef, decorators: [{ type: Optional }] }, { type: ViewContainerRef, decorators: [{ type: Optional }] }, { type: NrfFormService, decorators: [{ type: Optional }] }, { type: Renderer2 } ]; NrfFormDirective.propDecorators = { nrfEntity: [{ type: Input }], nrfSubmit: [{ type: Output }], formSubmitWrapper: [{ type: HostListener, args: ['submit', ['$event'],] }] }; if (false) { NrfFormDirective.prototype.templateRef; NrfFormDirective.prototype.viewContainerRef; NrfFormDirective.prototype.formService; NrfFormDirective.prototype.renderer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ad2ViZGV2LXRvb2xzL25nLW5lc3RlZC1yZWFjdGl2ZS1mb3Jtcy8iLCJzb3VyY2VzIjpbImxpYi9mb3JtL2Zvcm0uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUNYLGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQWlCaEQsTUFBTSxPQUFPLGdCQUFnQjtJQUkzQixZQUMrQixXQUE2QixFQUM3QixnQkFBa0MsRUFDbEMsV0FBMkIsRUFDdkMsUUFBbUI7UUFIUCxnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7UUFDN0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFDdkMsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUVwQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztTQUN6QztJQUNILENBQUM7SUFLRCxJQUNJLFNBQVMsQ0FBQyxNQUFXO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUNuQyxDQUFDO0lBQ0QsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUNwQyxDQUFDO0lBTUQsSUFDSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztJQUNsQyxDQUFDO0lBTUQsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFHRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBR08sVUFBVTtRQUNoQixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO2tCQUN2QyxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7a0JBQ3RHLFVBQVUsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDcEY7SUFDSCxDQUFDO0lBUUQsaUJBQWlCLENBQUMsTUFBYTtRQUM3QixNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFO1lBQ3pCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7OztZQXZGRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLFFBQVEsRUFBRSxTQUFTO2FBQ3BCOzs7WUF2QkMsV0FBVyx1QkE2QlIsUUFBUTtZQTVCWCxnQkFBZ0IsdUJBNkJiLFFBQVE7WUF2QkosY0FBYyx1QkF3QmxCLFFBQVE7WUFoQ1gsU0FBUzs7O3dCQTJDUixLQUFLO3dCQW9CTCxNQUFNO2dDQW9DTixZQUFZLFNBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDOzs7SUFyRWhDLHVDQUEwRDtJQUMxRCw0Q0FBK0Q7SUFDL0QsdUNBQXdEO0lBQ3hELG9DQUFvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IE5yZkZvcm1Db250ZXh0IH0gZnJvbSAnLi9mb3JtLWNvbnRleHQuY2xhc3MnO1xuaW1wb3J0IHsgTnJmU3VibWl0RGF0YSB9IGZyb20gJy4vZm9ybS1zdWJtaXQtZGF0YS5jbGFzcyc7XG5pbXBvcnQgeyBOcmZGb3JtU2VydmljZSB9IGZyb20gJy4vZm9ybS5zZXJ2aWNlJztcblxuLyogdHNsaW50OmRpc2FibGU6IHRlci1wYWRkZWQtYmxvY2tzICovXG4vKipcbiAqIEEgY29tcG9uZW50IHRvIGFic3RyYWN0IHRoZSBmb3JtIGltcGxlbWVudGF0aW9uXG4gKlxuICogSXQgaG9sZHMgdGhlIHZhbGlkYXRpb24gYW5kIHRoZSBzdWJtaXQgbG9naWNcbiAqXG4gKiBAZXhhbXBsZVxuICogPGZvcm0gbnJmRm9ybSAobnJmU3VibWl0KT1cImFDYWxsYmFjaygkZXZlbnQpXCI+XG4gKiAgLy8gSW5wdXRzXG4gKiA8L2Zvcm0+XG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tucmZGb3JtXScsXG4gIGV4cG9ydEFzOiAnbnJmRm9ybScsXG59KVxuZXhwb3J0IGNsYXNzIE5yZkZvcm1EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+LFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IGZvcm1TZXJ2aWNlOiBOcmZGb3JtU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICkge1xuICAgIGlmICghZm9ybVNlcnZpY2UpIHtcbiAgICAgIHRoaXMuZm9ybVNlcnZpY2UgPSBuZXcgTnJmRm9ybVNlcnZpY2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVwcmVzZW50cyBhbiBFbnRpdHkgTW9kZWwgdGhhdCBjb21lcyBmcm9tIERhdGFiYXNlXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgbnJmRW50aXR5KGVudGl0eTogYW55KSB7XG4gICAgdGhpcy5mb3JtU2VydmljZS5lbnRpdHkgPSBlbnRpdHk7XG4gIH1cbiAgZ2V0IG5yZkVudGl0eSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmZvcm1TZXJ2aWNlLmVudGl0eTtcbiAgfVxuXG4gIGdldCBmb3JtRGF0YSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmZvcm1TZXJ2aWNlLmZvcm1EYXRhO1xuICB9XG5cbiAgZ2V0IGZvcm1Hcm91cCgpOiBGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmZvcm1TZXJ2aWNlLmZvcm1Hcm91cDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgZm9ybSBpcyB2YWxpZCBhbmQgYSBzdWJtaXQgZXZlbnQgaXMgdHJpZ2dlcmVkXG4gICAqIGJ5IGEgYnV0dG9uIGNsaWNrIG9yIHByb2dyYW1tYXRpY2FsbHkuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgZ2V0IG5yZlN1Ym1pdCgpOiBFdmVudEVtaXR0ZXI8TnJmU3VibWl0RGF0YT4ge1xuICAgIHJldHVybiB0aGlzLmZvcm1TZXJ2aWNlLnN1Ym1pdCQ7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBJbml0IGFuIGVtcHR5IG5yZkVudGl0eSwgaW4gY2FzZSBub25lIHdoZXJlIHByb3ZpZGVkLlxuICAgKi9cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKCF0aGlzLm5yZkVudGl0eSkge1xuICAgICAgdGhpcy5ucmZFbnRpdHkgPSB7fTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlclZpZXcoKTtcbiAgfVxuXG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5ucmZTdWJtaXQuY29tcGxldGUoKTtcbiAgfVxuXG5cbiAgcHJpdmF0ZSByZW5kZXJWaWV3KCkge1xuICAgIGlmICh0aGlzLnRlbXBsYXRlUmVmICYmIHRoaXMudmlld0NvbnRhaW5lclJlZikge1xuICAgICAgY29uc3QgZW1iZWRkZWRWaWV3UmVmID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLnRlbXBsYXRlUmVmLCBuZXcgTnJmRm9ybUNvbnRleHQodGhpcykpO1xuICAgICAgY29uc3QgZm9ybU5hdGl2ZSA9IGVtYmVkZGVkVmlld1JlZi5yb290Tm9kZXNbMF07XG4gICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbihmb3JtTmF0aXZlLCAnc3VibWl0JywgZXZlbnQgPT4gdGhpcy5mb3JtU3VibWl0V3JhcHBlcihldmVudCkpO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqICMgU2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkhXG4gICAqIFRoaXMgbWV0aG9kIHdyYXBzIHRoZSBmb3JtIHZhbGlkYXRpb24gYW5kIGNhbGwgW25yZlN1Ym1pdF17QGxpbmsgTnJmRm9ybURpcmVjdGl2ZSNucmZTdWJtaXR9XG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdzdWJtaXQnLCBbJyRldmVudCddKVxuICBmb3JtU3VibWl0V3JhcHBlcigkZXZlbnQ6IEV2ZW50KSB7XG4gICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAoIXRoaXMuZm9ybUdyb3VwLnZhbGlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5ucmZTdWJtaXQuZW1pdChuZXcgTnJmU3VibWl0RGF0YSh0aGlzLCAkZXZlbnQpKTtcbiAgfVxufVxuIl19