ems-web-app-view-container
Version:
This angular.io module includes a component and service that can be used to render nested view containers that transition between screens (e.g., a tab container).
1 lines • 13.7 kB
Source Map (JSON)
{"version":3,"file":"ems-web-app-view-container.mjs","sources":["../../src/lib/view-container.service.ts","../../src/lib/view-container.component.ts","../../src/lib/view.component.ts","../../src/lib/view-container.module.ts","../../src/public-api.ts","../../src/ems-web-app-view-container.ts"],"sourcesContent":["import { Injectable, TemplateRef } from '@angular/core';\nimport { Observable, Subject, BehaviorSubject, throwError, of } from 'rxjs';\nimport { IView } from \"./view-container.interfaces\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ViewContainerService {\n\n public static DELIMITER: string = \"---\"; //used to separate container id from view id in lookup; should be something that wouldn't appear in a supplied id\n\n private viewSource: BehaviorSubject<IView|null> = new BehaviorSubject<IView|null>(null);\n public view: Observable<IView|null> = this.viewSource.asObservable();\n public manifest: Record<string, IView> = {};\n\n public registerView(containerId: string, viewId: string, template: TemplateRef<any>) {\n this.manifest[`${containerId}${ViewContainerService.DELIMITER}${viewId}`] = { viewId, containerId, template };\n }\n\n public setCurrentView(viewId: string | null, containerId?: string) {\n const qualifiedId = this.getQualifiedId(viewId, containerId);\n let view = this.manifest[qualifiedId ?? \"\"];\n if(!view && containerId) view = { containerId, viewId, template: null }; //clears the view\n this.viewSource.next(view ?? null);\n }\n\n private getQualifiedId(viewId: string | null, containerId?: string): string | null {\n if(containerId) return `${containerId}${ViewContainerService.DELIMITER}${viewId}`;\n \n const regex = new RegExp(`^.*?${ViewContainerService.DELIMITER}(.*?)$`,\"gim\");\n for(let prop in this.manifest) {\n const parsedViewId = prop.replace(regex, \"$1\");\n if(parsedViewId === viewId) return prop;\n }\n\n return null;\n }\n\n\n}\n","import { Component, HostBinding, Input, Output, EventEmitter, OnInit, AfterViewInit, OnDestroy, TemplateRef } from '@angular/core';\nimport { ViewContainerService } from \"./view-container.service\";\nimport { IView } from \"./view-container.interfaces\";\nimport { sleep, delay } from \"ems-web-app-utils\";\nimport { Subscription } from 'rxjs';\n\n@Component({\n selector: 'view-container',\n template: `<ng-container *ngIf=\"currentView\"><ng-container *ngTemplateOutlet=\"currentView.template\"></ng-container></ng-container><ng-content></ng-content>`,\n styleUrls: ['./view-container.component.less']\n})\nexport class ViewContainerComponent implements OnInit, AfterViewInit, OnDestroy {\n\n private static counter: number = 1;\n\n @HostBinding(\"attr.id\") generatedId: string = \"\";\n @HostBinding(\"class\") currentViewClass: string = \"\";\n @HostBinding(\"class.transitioning\") transitioning: boolean = true;\n \n @Input(\"id\") id?: string;\n @Input(\"transition-speed\") speed: number = 250;\n\n @Output(\"ready\") onReady: EventEmitter<any> = new EventEmitter();\n @Output(\"begin\") onBegin: EventEmitter<any> = new EventEmitter();\n @Output(\"execute\") onExecute: EventEmitter<any> = new EventEmitter();\n @Output(\"complete\") onComplete: EventEmitter<any> = new EventEmitter();\n\n public requestedView:IView | null = null;\n public currentView:IView | null = null;\n\n protected callback?: () => void;\n protected subscription!: Subscription;\n\n constructor(private service: ViewContainerService) {}\n\n ngOnInit(): void {\n if(!this.id) {\n //auto-create ids if none supplied\n this.id = `generated-vcid-${ViewContainerComponent.counter}`;\n ViewContainerComponent.counter ++;\n }\n this.generatedId = this.id;\n }\n\n ngAfterViewInit() {\n delay(() => this.initialize());\n }\n\n ngOnDestroy() {\n if(this.subscription) this.subscription.unsubscribe();\n }\n\n public setCurrentView(view:IView | null, callback?: () => void) {\n this.requestedView = view;\n this.callback = callback;\n this.beginViewTransition();\n }\n\n protected async beginViewTransition() {\n this.transitioning = true; //begin fadeout\n this.onBegin.emit();\n await sleep(this.speed);\n this.executeViewTransition();\n }\n\n protected async executeViewTransition() {\n this.currentView = null; //completely destroy current view/logic/listeners\n await sleep(0);\n this.currentView = this.requestedView;\n await sleep(0); //allow a tick to paint the transparent state of the view\n this.onExecute.emit();\n if(this.callback) this.callback();\n this.transitioning = false; //begin fade in\n await sleep(this.speed);\n this.completeViewTransition();\n }\n\n protected completeViewTransition() {\n this.onComplete.emit();\n }\n\n protected initialize() {\n this.subscription = this.service.view.subscribe(view => {\n if(view?.containerId !== this.id) return;\n this.setCurrentView(view);\n });\n\n this.onReady.emit(); //component is subscribed and ready to respond to view requests\n }\n}\n","import { Component, Input, ContentChildren, QueryList, TemplateRef, AfterViewInit, ViewEncapsulation, ElementRef } from '@angular/core';\nimport { ViewContainerService } from \"./view-container.service\";\n\n@Component({\n selector: 'view',\n template: `<ng-content></ng-content>`\n})\nexport class ViewComponent implements AfterViewInit {\n\t@Input(\"id\") id!: string;\n\t@ContentChildren(TemplateRef) template!: QueryList<any>;\n\tconstructor(private service: ViewContainerService, private element: ElementRef) {}\n\n\tngAfterViewInit() {\n\t\tif(!this.id) throw new Error(\"All <view/> elements must have an id attribute.\");\n\t\tconst parentId = this.element.nativeElement.parentNode.getAttribute(\"id\");\n\t\tthis.service.registerView(parentId, this.id, this.template.first);\n\t}\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ViewContainerComponent } from './view-container.component';\nimport { ViewComponent } from './view.component';\n\n\n\n@NgModule({\n declarations: [\n ViewContainerComponent,\n ViewComponent\n ],\n imports: [\n CommonModule\n ],\n exports: [\n ViewContainerComponent,\n ViewComponent\n ]\n})\nexport class ViewContainerModule { }\n","/*\n * Public API Surface of view-container\n */\n\nexport * from './lib/view-container.service';\nexport * from './lib/view-container.component';\nexport * from './lib/view.component';\nexport * from './lib/view-container.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ViewContainerService"],"mappings":"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"}