UNPKG

@avine/ng-if-non-nullish

Version:

Nullish coalescing operator as Angular structural directive and more...

100 lines 11 kB
import { Directive, Input } from '@angular/core'; import * as i0 from "@angular/core"; export class IfNonNullishDirective { set ifNonNullish(data) { this.hasNoData = data === null || data === undefined; this.updateView(data); } set ifNonNullishFallback(fallbackTemplate) { this.fallbackTemplate = fallbackTemplate ?? null; if (this.hasNoData) { this.createFallbackView(); } } /** * Assert the correct type of the expression bound to the `ifNonNullish` input within the template. * * @see https://angular.io/guide/structural-directives#improving-template-type-checking-for-custom-directives */ static ngTemplateGuard_ifNonNullish(_directive, data) { return true; } /** * Asserts the correct type of the context for the template that `IfNonNullish` will render. * * @see https://angular.io/guide/structural-directives#improving-template-type-checking-for-custom-directives */ static ngTemplateContextGuard(_directive, context) { return true; } constructor(viewContainerRef, templateRef) { this.viewContainerRef = viewContainerRef; this.templateRef = templateRef; this.hasNoData = true; this.fallbackTemplate = null; this.viewState = 'clear'; } updateView(data) { if (!this.hasNoData) { this.switchToRegularView(data); } else { this.switchToFallbackView(); } } switchToRegularView(data) { this.upsertContext(data); if (this.viewState === 'regular') { return; } this.createRegularView(); } switchToFallbackView() { if (this.viewState === 'fallback') { return; } this.createFallbackView(); } upsertContext(data) { if (this.context) { this.context.$implicit = this.context.ifNonNullish = data; } else { this.context = { $implicit: data, ifNonNullish: data }; } } createRegularView() { this.clearView(); this.viewContainerRef.createEmbeddedView(this.templateRef, this.context); this.viewState = 'regular'; } createFallbackView() { this.clearView(); if (!this.fallbackTemplate) { return; } this.viewContainerRef.createEmbeddedView(this.fallbackTemplate); this.viewState = 'fallback'; } clearView() { if (this.viewState === 'clear') { return; } this.viewContainerRef.clear(); this.viewState = 'clear'; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: IfNonNullishDirective, deps: [{ token: i0.ViewContainerRef }, { token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.5", type: IfNonNullishDirective, isStandalone: true, selector: "[ifNonNullish]", inputs: { ifNonNullish: "ifNonNullish", ifNonNullishFallback: "ifNonNullishFallback" }, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: IfNonNullishDirective, decorators: [{ type: Directive, args: [{ standalone: true, selector: '[ifNonNullish]', }] }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.TemplateRef }]; }, propDecorators: { ifNonNullish: [{ type: Input }], ifNonNullishFallback: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWYtbm9uLW51bGxpc2guZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvaWYtbm9uLW51bGxpc2gvc3JjL2xpYi9pZi1ub24tbnVsbGlzaC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWlDLE1BQU0sZUFBZSxDQUFDOztBQVFoRixNQUFNLE9BQU8scUJBQXFCO0lBQ2hDLElBQ0ksWUFBWSxDQUFDLElBQU87UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxTQUFTLENBQUM7UUFDckQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFDSSxvQkFBb0IsQ0FBQyxnQkFBa0Q7UUFDekUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixJQUFJLElBQUksQ0FBQztRQUNqRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBVUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyw0QkFBNEIsQ0FBSSxVQUFvQyxFQUFFLElBQU87UUFDbEYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxzQkFBc0IsQ0FDM0IsVUFBb0MsRUFDcEMsT0FBWTtRQUVaLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFlBQ1UsZ0JBQWtDLEVBQ2xDLFdBQWdEO1FBRGhELHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsZ0JBQVcsR0FBWCxXQUFXLENBQXFDO1FBN0JsRCxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBRWpCLHFCQUFnQixHQUFnQyxJQUFJLENBQUM7UUFFckQsY0FBUyxHQUFxQyxPQUFPLENBQUM7SUEwQjNELENBQUM7SUFFSSxVQUFVLENBQUMsSUFBTztRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNuQixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDaEM7YUFBTTtZQUNMLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1NBQzdCO0lBQ0gsQ0FBQztJQUVPLG1CQUFtQixDQUFDLElBQU87UUFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFO1lBQ2hDLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFVBQVUsRUFBRTtZQUNqQyxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU8sYUFBYSxDQUFDLElBQU87UUFDM0IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztTQUMzRDthQUFNO1lBQ0wsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ3hEO0lBQ0gsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDMUIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDO0lBQzlCLENBQUM7SUFFTyxTQUFTO1FBQ2YsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLE9BQU8sRUFBRTtZQUM5QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7SUFDM0IsQ0FBQzs4R0FyR1UscUJBQXFCO2tHQUFyQixxQkFBcUI7OzJGQUFyQixxQkFBcUI7a0JBSmpDLFNBQVM7bUJBQUM7b0JBQ1QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzNCO2lJQUdLLFlBQVk7c0JBRGYsS0FBSztnQkFPRixvQkFBb0I7c0JBRHZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIElucHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBJZk5vbk51bGxpc2hDb250ZXh0LCBJZk51bGxpc2ggfSBmcm9tICcuL2lmLW5vbi1udWxsaXNoLnR5cGVzJztcblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnW2lmTm9uTnVsbGlzaF0nLFxufSlcbmV4cG9ydCBjbGFzcyBJZk5vbk51bGxpc2hEaXJlY3RpdmU8VCA9IHVua25vd24+IHtcbiAgQElucHV0KClcbiAgc2V0IGlmTm9uTnVsbGlzaChkYXRhOiBUKSB7XG4gICAgdGhpcy5oYXNOb0RhdGEgPSBkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHVuZGVmaW5lZDtcbiAgICB0aGlzLnVwZGF0ZVZpZXcoZGF0YSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgaWZOb25OdWxsaXNoRmFsbGJhY2soZmFsbGJhY2tUZW1wbGF0ZTogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCBJZk51bGxpc2gpIHtcbiAgICB0aGlzLmZhbGxiYWNrVGVtcGxhdGUgPSBmYWxsYmFja1RlbXBsYXRlID8/IG51bGw7XG4gICAgaWYgKHRoaXMuaGFzTm9EYXRhKSB7XG4gICAgICB0aGlzLmNyZWF0ZUZhbGxiYWNrVmlldygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29udGV4dCE6IElmTm9uTnVsbGlzaENvbnRleHQ8VD47XG5cbiAgcHJpdmF0ZSBoYXNOb0RhdGEgPSB0cnVlO1xuXG4gIHByaXZhdGUgZmFsbGJhY2tUZW1wbGF0ZTogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHZpZXdTdGF0ZTogJ3JlZ3VsYXInIHwgJ2ZhbGxiYWNrJyB8ICdjbGVhcicgPSAnY2xlYXInO1xuXG4gIC8qKlxuICAgKiBBc3NlcnQgdGhlIGNvcnJlY3QgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbiBib3VuZCB0byB0aGUgYGlmTm9uTnVsbGlzaGAgaW5wdXQgd2l0aGluIHRoZSB0ZW1wbGF0ZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvc3RydWN0dXJhbC1kaXJlY3RpdmVzI2ltcHJvdmluZy10ZW1wbGF0ZS10eXBlLWNoZWNraW5nLWZvci1jdXN0b20tZGlyZWN0aXZlc1xuICAgKi9cbiAgc3RhdGljIG5nVGVtcGxhdGVHdWFyZF9pZk5vbk51bGxpc2g8VD4oX2RpcmVjdGl2ZTogSWZOb25OdWxsaXNoRGlyZWN0aXZlPFQ+LCBkYXRhOiBUKTogZGF0YSBpcyBFeGNsdWRlPFQsIElmTnVsbGlzaD4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VydHMgdGhlIGNvcnJlY3QgdHlwZSBvZiB0aGUgY29udGV4dCBmb3IgdGhlIHRlbXBsYXRlIHRoYXQgYElmTm9uTnVsbGlzaGAgd2lsbCByZW5kZXIuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL3N0cnVjdHVyYWwtZGlyZWN0aXZlcyNpbXByb3ZpbmctdGVtcGxhdGUtdHlwZS1jaGVja2luZy1mb3ItY3VzdG9tLWRpcmVjdGl2ZXNcbiAgICovXG4gIHN0YXRpYyBuZ1RlbXBsYXRlQ29udGV4dEd1YXJkPFQ+KFxuICAgIF9kaXJlY3RpdmU6IElmTm9uTnVsbGlzaERpcmVjdGl2ZTxUPixcbiAgICBjb250ZXh0OiBhbnksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICApOiBjb250ZXh0IGlzIElmTm9uTnVsbGlzaENvbnRleHQ8RXhjbHVkZTxULCBJZk51bGxpc2g+PiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8SWZOb25OdWxsaXNoQ29udGV4dDxUPj4sXG4gICkge31cblxuICBwcml2YXRlIHVwZGF0ZVZpZXcoZGF0YTogVCkge1xuICAgIGlmICghdGhpcy5oYXNOb0RhdGEpIHtcbiAgICAgIHRoaXMuc3dpdGNoVG9SZWd1bGFyVmlldyhkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zd2l0Y2hUb0ZhbGxiYWNrVmlldygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3dpdGNoVG9SZWd1bGFyVmlldyhkYXRhOiBUKSB7XG4gICAgdGhpcy51cHNlcnRDb250ZXh0KGRhdGEpO1xuICAgIGlmICh0aGlzLnZpZXdTdGF0ZSA9PT0gJ3JlZ3VsYXInKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3JlYXRlUmVndWxhclZpZXcoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3dpdGNoVG9GYWxsYmFja1ZpZXcoKSB7XG4gICAgaWYgKHRoaXMudmlld1N0YXRlID09PSAnZmFsbGJhY2snKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3JlYXRlRmFsbGJhY2tWaWV3KCk7XG4gIH1cblxuICBwcml2YXRlIHVwc2VydENvbnRleHQoZGF0YTogVCkge1xuICAgIGlmICh0aGlzLmNvbnRleHQpIHtcbiAgICAgIHRoaXMuY29udGV4dC4kaW1wbGljaXQgPSB0aGlzLmNvbnRleHQuaWZOb25OdWxsaXNoID0gZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250ZXh0ID0geyAkaW1wbGljaXQ6IGRhdGEsIGlmTm9uTnVsbGlzaDogZGF0YSB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUmVndWxhclZpZXcoKSB7XG4gICAgdGhpcy5jbGVhclZpZXcoKTtcbiAgICB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMudGVtcGxhdGVSZWYsIHRoaXMuY29udGV4dCk7XG4gICAgdGhpcy52aWV3U3RhdGUgPSAncmVndWxhcic7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZhbGxiYWNrVmlldygpIHtcbiAgICB0aGlzLmNsZWFyVmlldygpO1xuICAgIGlmICghdGhpcy5mYWxsYmFja1RlbXBsYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5mYWxsYmFja1RlbXBsYXRlKTtcbiAgICB0aGlzLnZpZXdTdGF0ZSA9ICdmYWxsYmFjayc7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyVmlldygpIHtcbiAgICBpZiAodGhpcy52aWV3U3RhdGUgPT09ICdjbGVhcicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XG4gICAgdGhpcy52aWV3U3RhdGUgPSAnY2xlYXInO1xuICB9XG59XG4iXX0=