@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 5.83 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.33/esri/copyright.txt for details.
*/
import{resultOrAbort as e}from"../../../../core/asyncUtils.js";import{clone as t}from"../../../../core/lang.js";import{normalizeGlobalID as n}from"../../../../core/uuid.js";import{queryAllJSON as o}from"../../../../layers/support/featureQueryAll.js";const r={setAttribute(){},rollback(){},commit(){}};var i;function s(e,n){const o=n.attributes[e.objectIdField];if(null==o)return r;const s=e.sessions.get(o);if(s)return s;const l=t(n.attributes),u=new Set,a=e.i3sOverrides.createInteractiveEditSession(o),d=new Map,f=(e,t)=>{const n=d.get(e);if(null==n){const n=t.indexOf(o);return d.set(e,n),n}return n};let c=i.EDITING;const I={setAttribute(t,o){if(c!==i.EDITING)return;const r=e.fieldsIndex.get(t);if(!r)return;const s=e.attributeStorageInfo.findIndex((e=>e.name===r.name));if(s<0)return;if(!(t in l))throw new Error(`Attribute "${t}" is not an attribute of the edited feature.`);a.setAttribute(s,o);const d=e.attributeStorageInfo[s];let I=!1;u.add(t),e.forEachNode(((t,r)=>{const i=f(t,r);if(-1===i)return;const s=e.getAttributeData(t.index);if(s){const r=s[d.name];r&&(r[i]=o,e.setAttributeData(t.index,s,n),I=!0)}})),I&&e.clearMemCache()},rollback(){if(c===i.EDITING){for(const e of u)this.setAttribute(e,l[e]);a.remove(),c=i.ROLLED_BACK,e.sessions.delete(o)}},commit(){c===i.EDITING&&(a.remove(),c=i.COMMITTED,e.sessions.delete(o))}};return e.sessions.set(o,I),I}function l(e,t,n){const{gidToFeatureInfo:o,oidToFeatureInfo:r,fieldsIndex:i,objectIdField:s,globalIdField:l,featureOrIdentifierList:u}=n;if(!n.featuresResolved&&null!=u){for(const e of u){const t={feature:null,oid:-1,gid:null};if("attributes"in e){t.feature=e;const n=e.attributes;if(null!=n)for(const e in n){if(-1!==t.oid&&null!=t.gid)break;const o=i.normalizeFieldName(e);o===s&&(t.oid=n[e]??-1),o===l&&(t.gid=n[e])}}else t.oid=e.objectId??-1,t.gid=e.globalId;null!=t.gid&&o.set(t.gid,t),-1!==t.oid&&r.set(t.oid,t)}n.featuresResolved=!0}return(-1!==e?r.get(e):null)??(null!=t?o.get(t):null)}function u(e,t,o,r,i=null,s=!0){const u=[],a={gidToFeatureInfo:new Map,oidToFeatureInfo:new Map,featuresResolved:null==o,fieldsIndex:e.fieldsIndex,objectIdField:e.objectIdField,globalIdField:e.globalIdField,featureOrIdentifierList:o};for(const d of t){if(null!=d.error)continue;const e=d.objectId??-1,t=d.globalId,o=(-1===e||s?l(e,t,a):null)??{feature:null,oid:e,gid:t},f={oid:-1===e?o.oid:e,gid:t??o.gid,feature:o.feature,result:d};u.push(f);const c=f.gid?n(f.gid):null;if(-1===f.oid&&null!=c&&null!=i&&(f.oid=i.get(c)??-1),-1===f.oid&&null!=c){let e=r.get(c);null==e&&(e={gid:f.gid,edits:[]},r.set(c,e)),e.edits.push(f)}}return u}async function a(e,t){const n=new Map,o=u(e,t.addedFeatures,t.edits?.addFeatures,n),r=u(e,t.updatedFeatures,t.edits?.updateFeatures,n),i=u(e,t.deletedFeatures,t.edits?.deleteFeatures,n,t.globalIdToObjectId,!1);return n.size>0&&await d(e,n),{adds:o.filter((e=>-1!==e.oid)),updates:r.filter((e=>-1!==e.oid)),deletes:i.filter((e=>-1!==e.oid))}}async function d(t,r){const i=t.i3sOverrides.layer.associatedLayer;if(null==i?.globalIdField)return;const s=i.createQuery(),{objectIdField:l,globalIdField:u}=i;s.where=Array.from(r.values()).map((({gid:e})=>`${u}='${e}'`)).join(" OR "),s.returnGeometry=!1,s.outFields=[l,u],s.cacheHint=!1;const a=await e(o(i,s));if(!a.ok)return;const d=a.value.features;for(const e of d){const t=e.attributes[u],o=e.attributes[l];if(null==t||null==o||-1===o)continue;const i=r.get(n(t));if(null!=i)for(const e of i.edits)e.oid=o}}function f(e,t){const n=new Map,o=e=>{for(const{oid:t,feature:o}of e){const e=o?.geometry;"mesh"===e?.type&&n.set(t,e)}};o(t.adds),o(t.updates);for(const r of t.deletes)n.set(r.oid,null);for(const[r,i]of n)e.i3sOverrides.updateGeometry(r,i)}function c(e,t){const n=g(e,t),o=I(e,t);if(0===n.size&&0===o.size)return;const r=new Map;for(let c=0;c<e.attributeStorageInfo.length;c++)r.set(e.attributeStorageInfo[c].name,c);let i=!1;n.forEach(((t,n)=>{const o=e.getAttributeData(n);let s=!1;t.forEach(((t,n)=>{const l=null!=o?o[n]:null,u=r.get(n);for(const{featureIndex:o,value:r,featureId:a}of t)l&&(l[o]=r,s=!0,i=!0),e.i3sOverrides.updateAttributeValue(a,u,r)})),s&&e.setAttributeData(n,o,null)})),i&&e.clearMemCache();const{fieldsIndex:s,i3sOverrides:l,objectIdField:u,globalIdField:a}=e,d=l.layer.associatedLayer?.infoFor3D,f=new Set(d?[...Object.values(d.assetMapFieldRoles),...Object.values(d.transformFieldRoles)]:[]);for(const[c,I]of o){l.featureAdded(c);const{attributes:e}=I;for(const t in e){if(t!==u&&t!==a&&f.has(t))continue;const n=s.normalizeFieldName(t),o=null!=n?r.get(n):null;if(null==o)continue;const i=e[t];l.updateAttributeValue(c,o,i)}}}function I(e,t){const n=new Map,o=t.adds;if(!o||0===o.length||null==e.globalIdField)return n;for(const r of o){const e=r.oid,t=r.feature;"mesh"===t?.geometry?.type&&n.set(e,t)}return n}function g(e,t){const n=t.updates;if(!n||0===n.length)return new F;const o=new F,r=new Map;for(let i=0;i<e.attributeStorageInfo.length;i++)r.set(e.attributeStorageInfo[i].name,i);return e.forEachNode(((t,r)=>{for(const i of n){if(null==i.feature)continue;const n=i.feature,s=i.oid,l=r.indexOf(s);for(const r in n.attributes){const i=e.fieldsIndex.normalizeFieldName(r),u=b(o,t.index,i),a=n.attributes[r];u.push({featureIndex:l,featureId:s,value:a})}}})),o}function b(e,t,n){const o=m(e,t),r=null!=n&&o.get(n);if(r)return r;const i=new Array;return o.set(n,i),i}function m(e,t){const n=e.get(t);if(n)return n;const o=new p;return e.set(t,o),o}!function(e){e[e.EDITING=0]="EDITING",e[e.ROLLED_BACK=1]="ROLLED_BACK",e[e.COMMITTED=2]="COMMITTED"}(i||(i={}));const p=Map,F=Map;export{s as createInteractiveEditSession,a as normalizeEditResultsEvent,c as processAttributeEdits,f as processGeometryEdits};