pragma-views2
Version:
1 lines • 2.06 kB
JavaScript
import{BaseElement}from"../../lib/base-element.js";import{loadModule,loadTemplates}from"../../../baremetal/lib/component-loader.js";import{UIGraph}from"../../../lib/ui-graph.js";import"./../../lib/requestIdlePolyfill.js";class ViewContainer extends BaseElement{connectedCallback(){this.loadIndicator=document.createElement("pragma-action-icon"),this.appendChild(this.loadIndicator),this.loadIndicator.classList.add("vis-loading"),this.uiGraph=new UIGraph(this)}disconnectedCallback(){this.uiGraph.dispose(),this.uiGraph=null,this._unloadCurrentView(),this.loadIndicator=null}static get observedAttributes(){return["view"]}get paused(){return"true"==this.getAttribute("paused")}get root(){return this._root||this.getAttribute("root")||"app"}set root(e){this._root=e}get viewModel(){return this._viewModel}set viewModel(e){this._viewModel=e,window.viewModel=e}_disposeView(){null!=this.viewModel&&(this.viewModel.disconnectedCallback&&this.viewModel.disconnectedCallback(),null!=this.viewModel.dispose&&this.viewModel.dispose(),this.viewModel=null)}async _loadView(e){if(!0===this.paused)return requestAnimationFrame((()=>this._loadView(e)));const t=`${e}.js`,i=`${e}.html`,s=await loadModule(t,this.viewName);this.viewModel=new s.default(this);const o=await loadTemplates(i),l=document.importNode(o,!0);this.viewModel._element=this,this.appendChild(l),this.uiGraph.build(),this.viewModel.connectedCallback&&this.viewModel.connectedCallback(this)}_unloadCurrentView(){for(this._disposeView(),null!=window.modules&&window.modules.delete(this.viewName);this.firstChild;)this.removeChild(this.firstChild)}async showView(e,t){if(!0===this.paused)return requestAnimationFrame((()=>this.showView(e,t)));await this.viewChanged(e),null!=t&&t()}async viewChanged(e){this.loadIndicator.setAttribute("state","busy");try{if(this._unloadCurrentView(),0==(e||"").length)return;this.viewName=e;const t=`./${this.root}/views/${e}/${e}`;return this._loadView(t,e)}finally{this.loadIndicator.setAttribute("state","none")}}}customElements.define("view-container",ViewContainer);