@avine/ng-if-non-nullish
Version:
Nullish coalescing operator as Angular structural directive and more...
100 lines • 11 kB
JavaScript
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=