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