@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 4.71 kB
JavaScript
import{_ as e}from"../../../chunks/tslib.es6.js";import{createTask as s}from"../../../core/asyncUtils.js";import t from"../../../core/Collection.js";import i from"../../../core/Error.js";import{HandleOwner as a}from"../../../core/HandleOwner.js";import n from"../../../core/Logger.js";import{isNone as o,isSome as r,removeMaybe as l,destroyMaybe as c,abortMaybe as d}from"../../../core/maybe.js";import{createAbortError as h,isAborted as w,createResolver as u}from"../../../core/promiseUtils.js";import{schedule as m}from"../../../core/scheduling.js";import{property as y}from"../../../core/accessorSupport/decorators/property.js";import{subclass as _}from"../../../core/accessorSupport/decorators/subclass.js";const p="analyses-owner-handles";var V,A;!function(e){e[e.PENDING=0]="PENDING",e[e.CREATED=1]="CREATED"}(V||(V={})),function(e){e[e.ADDED=0]="ADDED",e[e.REMOVED=1]="REMOVED"}(A||(A={}));let v=class extends a{constructor(e){super(e),this._allAnalysisViews=new t,this._creatingViewCount=0,this._items=new Map,this._scheduledUpdateHandle=null,this._attachedToViewResolver=f(),this._analysisModules={"area-measurement":{module:null},dimension:{module:null},"direct-line-measurement":{module:null},"line-of-sight":{module:null},slice:{module:null}}}destroy(){this._disconnectOwners(),this._attachedToViewResolver.reject(h("AnalysisViewManager was destroyed"))}attach(){this._connectOwners(),this._attachedToViewResolver.resolve()}detach(){this._disconnectOwners(),this._attachedToViewResolver.reject(h()),this._attachedToViewResolver=f()}get updating(){return!this.view.ready||0!==this._creatingViewCount||this._allAnalysisViews.some((e=>e.updating))}get testInfo(){return{allAnalysisViews:this._allAnalysisViews}}async whenAnalysisView(e){await this._attachedToViewResolver.promise;const s=this._items.get(e);if(o(s)||s.state.list===A.REMOVED){throw new i("AnalysisViewManager:no-analysisview-for-analysis","The analysis has not been added to view.analyses",{analysis:e})}return s.createAnalysisViewTask.promise}_connectOwners(){this.handles.add(this._connectAnalysesCollection(this.view.analyses),p)}_disconnectOwners(){this.handles.remove(p),this._update(),this._creatingViewCount=0}_connectAnalysesCollection(e){for(const i of e)this._addAnalysis(i);const s=e.on("after-add",(e=>this._addAnalysis(e.item))),t=e.on("after-remove",(e=>this._removeAnalysis(e.item)));return{remove:()=>{s.remove(),t.remove();for(const s of e)this._removeAnalysis(s)}}}_addAnalysis(e){const t=this._items.get(e);if(null==t){const t={state:{view:V.PENDING,list:A.ADDED},analysis:e,view:null,createAnalysisViewTask:null};this._items.set(e,t),t.createAnalysisViewTask=s((e=>this._createAnalysisViewPromise(t,e)))}else t.state.list=A.ADDED}_removeAnalysis(e){const s=this._items.get(e);null!=s?(s.state.list=A.REMOVED,this._scheduleUpdate()):n.getLogger(this.declaredClass).error("Trying to remove analysis which was not added")}_scheduleUpdate(){r(this._scheduledUpdateHandle)||(this._scheduledUpdateHandle=m((()=>this._update())))}_update(){this._scheduledUpdateHandle=l(this._scheduledUpdateHandle),this._items.forEach((e=>{if(e.state.list===A.REMOVED)switch(this._items.delete(e.analysis),e.state.view){case V.PENDING:e.createAnalysisViewTask=d(e.createAnalysisViewTask);break;case V.CREATED:r(e.view)&&(this._allAnalysisViews.remove(e.view),e.view=c(e.view),e.createAnalysisViewTask=null)}}))}async _createAnalysisViewPromise(e,s){const t=e.analysis,i=t.type,a=this._analysisModules[i];if(this._creatingViewCount+=1,o(a.module))try{a.module=await this._loadAnalysisModule(i)}catch(r){throw this._creatingViewCount-=1,r}if(w(s))throw this._creatingViewCount-=1,h("AnalysisView creation aborted");const n=new a.module.default({analysis:t,view:this.view});try{await n.when()}catch(r){throw this._creatingViewCount-=1,r}if(w(s))throw this._creatingViewCount-=1,n.destroy(),h("AnalysisView creation aborted");return e.view=n,e.state.view=V.CREATED,this._allAnalysisViews.add(n),this._creatingViewCount-=1,n}_loadAnalysisModule(e){switch(e){case"area-measurement":return import("./AreaMeasurementAnalysisView3D.js");case"dimension":return import("./DimensionAnalysisView3D.js");case"direct-line-measurement":return import("./DirectLineMeasurementAnalysisView3D.js");case"line-of-sight":return import("./LineOfSightAnalysisView3D.js");case"slice":return import("./SliceAnalysisView3D.js")}}};function f(){const e=u();return e.promise.catch((()=>{})),e}e([y()],v.prototype,"updating",null),e([y({constructOnly:!0})],v.prototype,"view",void 0),e([y()],v.prototype,"_allAnalysisViews",void 0),e([y()],v.prototype,"_creatingViewCount",void 0),v=e([_("esri.views.3d.analysis.AnalysisViewManager3D")],v);const D=v;export{D as default};