@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 6.04 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */
import{__decorate as s}from"tslib";import{createTask as t}from"../../core/asyncUtils.js";import"../../core/has.js";import i from"../../core/Logger.js";import{abortMaybe as e,removeMaybe as n}from"../../core/maybe.js";import{throwIfAborted as a,isAbortError as r,isAborted as l}from"../../core/promiseUtils.js";import{when as o,syncAndInitial as h,watch as c,sync as y,on as w,whenOnce as u}from"../../core/reactiveUtils.js";import{property as p,subclass as v}from"../../core/accessorSupport/decorators.js";const d=d=>{const V=d;let g=class extends V{constructor(s={}){super(s),this.view=null,this.analysisView=null,this._reconnectViewTask=null,this._forceInteractiveHandle=null,this._changeFromReconnect=!1,this._startUserOperation=null;const t=s?.analysis;null!=t?this.analysis=t:(this._set("analysis",this.constructAnalysis()),this._set("isAnalysisOwner",!0)),null!=s?.visible&&(this.visible=s.visible)}normalizeCtorArgs(s){const{analysis:t,suppressDeprecationWarning:i,...e}=s;return e}initialize(){const s=()=>{this._changeFromReconnect||this._viewHasAnalysis||this._set("isAnalysisOwner",!1);const s=!this._changeFromReconnect;this._changeFromReconnect=!1,s&&this._scheduleViewReconnect()};this.addHandles([o(()=>null!=this.view&&this.view.ready&&!this.supported,()=>i.getLogger(this).errorOnce(this.unsupportedErrorMessage),h),c(()=>[this.analysis,this._viewHasAnalysis],s,y),w(()=>this.view,"analysis-view-destroy",t=>{t.analysis===this.analysis&&s()}),c(()=>({view:this.view,ready:null!=this.view&&this.view.ready,supported:this.supported}),({view:s},t)=>{const i=t?.view;s!==i&&(this._startUserOperation=e(this._startUserOperation),this._disconnectFromView(i)),this._scheduleViewReconnect()},h)])}destroy(){this._reconnectViewTask=e(this._reconnectViewTask),this._startUserOperation=e(this._startUserOperation),null!=this.analysisView&&(this.analysisView.visible=void 0),this._disconnectFromView(this.view),this._set("view",null),null!=this.analysis&&this.isAnalysisOwner&&(this.analysis.destroy(),this._set("analysis",null))}get supported(){return null==this.view||this.view.type===this.supportedViewType}set visible(s){this._set("visible",s),null!=this.analysisView&&(this.analysisView.visible=s)}get active(){return null!=this.tool&&this.tool.active}get disabled(){return null==this.view||!this.view.ready||!this.supported}set analysis(s){s!==this._get("analysis")&&(this._startUserOperation=e(this._startUserOperation),this._disconnectFromView(this.view),this._setExternalAnalysis(s),this._scheduleViewReconnect())}get ready(){return null!=this.analysisView&&!this.connectingToView}get connectingToView(){return null!=this._reconnectViewTask}get isAnalysisOwner(){return this._get("isAnalysisOwner")}get _viewHasAnalysis(){const{view:s}=this;return null!=s&&s.analyses.includes(this.analysis)}get tool(){return this.analysisView?.tool}clear(){this._startUserOperation=e(this._startUserOperation),this._resetInteractiveCreationState(),null!=this.tool&&null!=this.view&&this.view.activeTool===this.tool&&(this.view.activeTool=null)}async start(){if(!this.visible)return void i.getLogger(this).warn("Cannot start analysis when not visible");this.clear();const s={task:null,abort:null,state:0},e=t(async t=>{if(s.state=1,await u(()=>this.ready,t),s.state=2,null==this.analysisView||null==this.view)return;const i=this.analysisView.tool;null!=i&&(this.view.activeTool=i,o(()=>i.created,()=>{i.active&&null!=this.view&&(this.view.activeTool=null)},{initial:!0,once:!0}))});return s.task=e,s.abort=()=>e.abort(),this._startUserOperation=s,e.promise}onConnectToAnalysisView(s){}onDisconnectFromAnalysisView(){}_scheduleViewReconnect(){this._reconnectViewTask=e(this._reconnectViewTask);const s=t(async t=>{try{await this._reconnectView(t)}catch(e){if(a(t),!r(e))return void i.getLogger(this).warn("Failed to use analysis in view model",e);throw e}finally{s===this._reconnectViewTask&&(this._reconnectViewTask=null)}});this._reconnectViewTask=s}async _reconnectView(s){const{view:t}=this,i=null!=t&&t.ready&&this.supported,e=this.analysis;this._startUserOperation=_(this._startUserOperation),this._disconnectFromView(t),i&&null!=t&&null!=e&&(this.isAnalysisOwner&&(this._changeFromReconnect=!0,t.analyses.add(e)),this.analysisView=await t.whenAnalysisView(e),l(s)?this._startUserOperation=_(this._startUserOperation):(this.analysisView.visible=this.visible,this._forceInteractiveHandle=this.analysisView.forceInteractive(),this.addHandles(this._forceInteractiveHandle),this.onConnectToAnalysisView(this.analysisView)))}_disconnectFromView(s){null!=s&&this.isAnalysisOwner&&s.analyses.includes(this.analysis)&&(this._changeFromReconnect=!0,this.analysis.clear(),s.analyses.remove(this.analysis)),this.onDisconnectFromAnalysisView(),this._forceInteractiveHandle=n(this._forceInteractiveHandle),this.analysisView=null}_setExternalAnalysis(s){null==this.analysisView||this.isAnalysisOwner||(this.analysisView.visible=void 0,this._forceInteractiveHandle=n(this._forceInteractiveHandle)),this.analysisView=null,this._set("isAnalysisOwner",!1),this._set("analysis",s),this._changeFromReconnect=!1}_resetInteractiveCreationState(){this.analysis.clear(),this.tool?.resetCreated()}get testInfo(){}};return s([p()],g.prototype,"supported",null),s([p()],g.prototype,"view",void 0),s([p({type:Boolean,value:!0})],g.prototype,"visible",null),s([p()],g.prototype,"active",null),s([p()],g.prototype,"disabled",null),s([p({nonNullable:!0})],g.prototype,"analysis",null),s([p()],g.prototype,"analysisView",void 0),s([p()],g.prototype,"ready",null),s([p()],g.prototype,"connectingToView",null),s([p({readOnly:!0})],g.prototype,"isAnalysisOwner",null),s([p()],g.prototype,"_viewHasAnalysis",null),s([p()],g.prototype,"_reconnectViewTask",void 0),s([p()],g.prototype,"_forceInteractiveHandle",void 0),s([p()],g.prototype,"tool",null),g=s([v("esri.widgets.support.AnalysisViewModelMixin")],g),g};function _(s){return null!=s&&s.state>=2?(s.abort(),null):s}export{d as AnalysisViewModelMixin};