@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 6.33 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */
import{__decorate as e}from"tslib";import t from"../../request.js";import r from"../../core/Accessor.js";import{makeHandle as o}from"../../core/handleUtils.js";import{getOrCreateMapValue as i}from"../../core/MapUtils.js";import{abortMaybe as s}from"../../core/maybe.js";import{onAbort as a,throwIfAborted as l,createAbortError as n,createResolver as c,throwIfAbortError as p}from"../../core/promiseUtils.js";import{watch as u}from"../../core/reactiveUtils.js";import{property as d,subclass as f}from"../../core/accessorSupport/decorators.js";import{isSharedGroupTemplate as m,isSharedPresetTemplate as h,isSharedFeatureTemplate as y}from"../templateUtils.js";import{SharedTemplateMissingTemplatesError as w,SharedTemplateUtilityNetworkResolverError as v,SharedTemplateLayerResolverError as k,SharedTemplateRequestError as g,SharedTemplateLayerUnavailableError as S}from"./support/sharedTemplateErrors.js";import{isFeatureLayer as _,isSubtypeGroupLayer as b}from"../../layers/support/layerUtils.js";import{getServices as N}from"../../undoredo/support/Services.js";import{isWebMap as T}from"../../webmap/utils.js";const R=new Map;function j(e,t){return i(R,e,()=>{const r=new C({layerResolver:t?.layerResolver??A(e),makeSharedTemplateFromJSON:t.makeSharedTemplateFromJSON,utilityNetworkResolver:t?.utilityNetworkResolver??F(e),view:e});return e.addHandles(o(()=>{R.delete(e),r.destroy()})),r})}let C=class extends r{constructor(e){super(e),this._abortController=null,this._cache=new Map,this._pending=new Map,this._utilityNetworkLookupHelperCache=new Map,this.layerResolver=null,this.makeSharedTemplateFromJSON=null,this.utilityNetworkResolver=null,this.view=null}initialize(){this.addHandles(u(()=>this.view.spatialReference,()=>this._reset()))}destroy(){this._abortController=s(this._abortController)}async getTemplates({templateIds:e,featureService:t,signal:r}){const o=this._cache,i=this._pending,s=[],n=new Set,c=new Set,p=Symbol();for(const a of new Set(e)){const e=O(t,a);if(o.has(e))s.push(o.get(e));else if(i.has(e)){const t=i.get(e);t.subscribers.add(p),c.add(t)}else n.add(a),i.set(e,H())}if(s.length===e.length)return s;const u=()=>{for(const{subscribers:e}of c)e.delete(p)},d=a(r,u);try{const e=await this._loadTemplates({templateIds:Array.from(n),featureService:t,signal:r}),o=await Promise.all(Array.from(c).map(({resolver:e})=>e.promise));s.push(...e),s.push(...o)}catch(f){u();for(const e of n){const r=O(t,e),o=i.get(r);o?.resolver.reject(f),i.delete(r)}throw f}finally{d?.remove()}return l(r),s}async _loadTemplates({templateIds:e,featureService:t,signal:r}){if(0===e.length)return[];const o=this._cache,i=this._pending,s=this._abortController=new AbortController,l=a(r,()=>{for(const r of e){if(I(i.get(O(t,r))))return}s.abort()}),c=await U({featureService:t,templateIds:e,signal:s.signal,spatialReference:this.view.spatialReference});if(c.length<e.length)throw new w(e,c);const p=await Promise.all(c.map(e=>this._makeTemplate({json:e,featureService:t})));for(const a of p){const e=O(t,a.templateId),s=i.get(e);!r?.aborted||I(s)?(o.set(e,a),s?.resolver.resolve(a)):s?.resolver.reject(n()),i.delete(e)}return l?.remove(),p}async _attachUtilityNetworkToTemplate(e){let t=null;try{t=await this.utilityNetworkResolver(e.featureService)}catch(r){throw new v(e.templateId,r)}if(t){e.definition.utilityNetwork=await this._getOrCreateUtilityNetworkLookupHelper(t);const r=t.associationsTable;e.definition.utilityNetworkAssociationsTable=r,N(this.view).additionalLayers.add(r)}return t}async _makeTemplate({json:e,featureService:t}){const{view:r}=this,o=this.makeSharedTemplateFromJSON(e);o.featureService=t,o.view=r;const{layerIds:i,subtypeCode:s}=o;try{o.layer=await this.layerResolver({featureService:t,layerIds:i,subtypeCode:s})}catch(a){throw new k(o.templateId,a)}if(m(o)&&o.definition?.createUtilityNetworkAssociations&&await this._attachUtilityNetworkToTemplate(o),h(o)&&o.definition){o.definition.spatialReference=r.spatialReference;for(const e of o.definition.allParts)e.geometry&&(e.geometry.spatialReference=r.spatialReference);o.definition.origin.spatialReference=r.spatialReference,(o.definition.associations?.length??0)>0&&await this._attachUtilityNetworkToTemplate(o)}if(y(o)&&o.definition?.defaultValues){const e=o.definition.defaultValues,t={},{fieldsIndex:r}=o.layer;for(const i in o.definition.defaultValues)t[r.get(i)?.name??i]=e[i];o.definition.defaultValues=t}return o}async _getOrCreateUtilityNetworkLookupHelper(e){const t=this._utilityNetworkLookupHelperCache.get(e);if(t)return t;const{UtilityNetworkLookupHelper:r}=await import("../../networks/support/UtilityNetworkLookupHelper.js"),i=await new r({utilityNetwork:e}).load();this._utilityNetworkLookupHelperCache.set(e,i);const s=o(()=>{i.destroy(),this._utilityNetworkLookupHelperCache.delete(e)});return e.addHandles(s),this.addHandles(s),i}_reset(){this._abortController?.abort(),this._cache.clear(),this._pending.clear()}};async function U({templateIds:e,featureService:r,spatialReference:o,signal:i}){const s=`${r.url}/sharedTemplates/templates`,a=await t(s,{query:{f:"json",outSR:o,ids:e.join(",")},signal:i}).catch(t=>{throw p(t),new g(e,t)});return a.data?.templates??[]}function I(e){return null!=e&&e.subscribers.size>0}function H(){return{resolver:c(),subscribers:new Set}}function O(e,t){return`${e.url}/${t}`}function L(e){return _(e)||b(e)}function A(e){return async({featureService:t,layerIds:r})=>{if(!e.map)throw new S(r);const o=new Set(r),{allLayers:i,allTables:s}=e.map,a=i.concat(s).find(e=>e.url===t.url&&L(e)&&o.has(e.layerId));if(null==a)throw new S(r);return a}}function F(e){return async t=>{const{map:r}=e;if(!T(r)||!r.utilityNetworks)return null;for(const e of r.utilityNetworks)if(e.featureServiceUrl===t.url)return e.load();return null}}e([d()],C.prototype,"_abortController",void 0),e([d()],C.prototype,"_cache",void 0),e([d()],C.prototype,"_pending",void 0),e([d({constructOnly:!0})],C.prototype,"layerResolver",void 0),e([d({constructOnly:!0})],C.prototype,"makeSharedTemplateFromJSON",void 0),e([d({constructOnly:!0})],C.prototype,"utilityNetworkResolver",void 0),e([d({constructOnly:!0})],C.prototype,"view",void 0),C=e([f("esri.editing.sharedTemplates.SharedTemplateProvider")],C);export{C as SharedTemplateProvider,j as getSharedTemplateProvider};