@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 8.32 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */
import{__decorate as e}from"tslib";import{JSONMap as s}from"../core/jsonMap.js";import{clone as t}from"../core/lang.js";import i from"../core/Logger.js";import{property as o,cast as r,subclass as a}from"../core/accessorSupport/decorators.js";import{ensureString as l,ensureType as n}from"../core/accessorSupport/ensureType.js";import{collectArcadeFieldNames as u,collectField as p}from"../layers/support/fieldUtils.js";import c from"./Renderer.js";import{VisualVariablesMixin as m}from"./mixins/VisualVariablesMixin.js";import d from"./support/ClassBreakInfo.js";import{rendererBackgroundFillSymbolProperty as h,rendererSymbolProperty as f}from"./support/commonProperties.js";import y from"./support/RendererLegendOptions.js";import{loadArcade as g}from"../support/loadArcade.js";import{ensureType as x}from"../symbols/support/typeUtils.js";import{reader as b}from"../core/accessorSupport/decorators/reader.js";import{writer as k}from"../core/accessorSupport/decorators/writer.js";import{enumeration as I}from"../core/accessorSupport/decorators/enumeration.js";var v;const B="log",F="percent-of-total",V="field",E=new s({esriNormalizeByLog:B,esriNormalizeByPercentOfTotal:F,esriNormalizeByField:V}),S=n(d);let w=v=class extends(m(c)){constructor(e){super(e),this._compiledValueExpression={valueExpression:null,compiledFunction:null},this.backgroundFillSymbol=null,this.classBreakInfos=null,this.defaultLabel=null,this.defaultSymbol=null,this.field=null,this.isMaxInclusive=!0,this.legendOptions=null,this.normalizationField=null,this.normalizationTotal=null,this.type="class-breaks",this.valueExpression=null,this.valueExpressionTitle=null,this._set("classBreakInfos",[])}readClassBreakInfos(e,s,t){if(!Array.isArray(e))return;let i=s.minValue;return e.map(e=>{const s=new d;return s.read(e,t),null==s.minValue&&(s.minValue=i),null==s.maxValue&&(s.maxValue=s.minValue),i=s.maxValue,s})}writeClassBreakInfos(e,s,t,i){const o=e.map(e=>e.write({},i));this._areClassBreaksConsecutive()&&o.forEach(e=>delete e.classMinValue),s[t]=o}castField(e){return null==e?e:"function"==typeof e?(i.getLogger(this).error(".field: field must be a string value"),null):l(e)}get minValue(){return this.classBreakInfos&&this.classBreakInfos[0]&&this.classBreakInfos[0].minValue||0}get normalizationType(){let e=this._get("normalizationType");const s=!!this.normalizationField,t=null!=this.normalizationTotal;return s||t?(e=s&&V||t&&F||null,s&&t&&i.getLogger(this).warn("warning: both normalizationField and normalizationTotal are set!")):e!==V&&e!==F||(e=null),e}set normalizationType(e){this._set("normalizationType",e)}addClassBreakInfo(e,s,i){let o=null;o="number"==typeof e?new d({minValue:e,maxValue:s,symbol:x(i)}):S(t(e)),this.classBreakInfos.push(o),1===this.classBreakInfos.length&&this.notifyChange("minValue")}removeClassBreakInfo(e,s){const t=this.classBreakInfos.length;for(let i=0;i<t;i++){const t=[this.classBreakInfos[i].minValue,this.classBreakInfos[i].maxValue];if(t[0]===e&&t[1]===s){this.classBreakInfos.splice(i,1);break}}}getBreakIndex(e,s){return this.valueExpression&&null==s?.arcade&&i.getLogger(this).warn(""),this.valueExpression?this._getBreakIndexForExpression(e,s):this._getBreakIndexForField(e)}async getClassBreakInfo(e,s){let t=s;this.valueExpression&&null==s?.arcade&&(t={...t,arcade:await g()});const i=this.getBreakIndex(e,t);return-1!==i?this.classBreakInfos[i]:null}getSymbol(e,s){if(this.valueExpression&&null==s?.arcade)return void i.getLogger(this).error("#getSymbol()","Please use getSymbolAsync if valueExpression is used");const t=this.getBreakIndex(e,s);return t>-1?this.classBreakInfos[t].symbol:this.defaultSymbol}async getSymbolAsync(e,s){let t=s;if(this.valueExpression&&null==s?.arcade){const e=await g(),{arcadeUtils:s}=e;s.hasGeometryOperations(this.valueExpression)&&await s.enableGeometryOperations(),t={...t,arcade:e}}const i=this.getBreakIndex(e,t);return i>-1?this.classBreakInfos[i].symbol:this.defaultSymbol}get symbols(){const e=[];return this.classBreakInfos.forEach(s=>{s.symbol&&e.push(s.symbol)}),this.defaultSymbol&&e.push(this.defaultSymbol),e}getAttributeHash(){return this.visualVariables?.reduce((e,s)=>e+s.getAttributeHash(),"")??""}getMeshHash(){const e=JSON.stringify(this.backgroundFillSymbol),s=JSON.stringify(this.defaultSymbol),t=`${this.normalizationField}.${this.normalizationType}.${this.normalizationTotal}`;return`${e}.${s}.${this.classBreakInfos.reduce((e,s)=>e+s.getMeshHash(),"")}.${t}.${this.field}.${this.valueExpression}`}get arcadeRequired(){return this.arcadeRequiredForVisualVariables||!!this.valueExpression}clone(){return new v({field:this.field,backgroundFillSymbol:this.backgroundFillSymbol?.clone(),defaultLabel:this.defaultLabel,defaultSymbol:this.defaultSymbol?.clone(),valueExpression:this.valueExpression,valueExpressionTitle:this.valueExpressionTitle,classBreakInfos:t(this.classBreakInfos),isMaxInclusive:this.isMaxInclusive,normalizationField:this.normalizationField,normalizationTotal:this.normalizationTotal,normalizationType:this.normalizationType,visualVariables:t(this.visualVariables),legendOptions:t(this.legendOptions),authoringInfo:t(this.authoringInfo)})}async collectRequiredFields(e,s){const t=[this.collectVVRequiredFields(e,s),this.collectSymbolFields(e,s)];await Promise.all(t)}async collectSymbolFields(e,s){const t=[...this.symbols.map(t=>t.collectRequiredFields(e,s)),u(e,s,null,this.valueExpression)];p(e,s,this.field),p(e,s,this.normalizationField),await Promise.all(t)}_getBreakIndexForExpression(e,s){const{viewingMode:t,scale:i,spatialReference:o,arcade:r,timeZone:a}=s??{},{valueExpression:l}=this;let n=this._compiledValueExpression.valueExpression===l?this._compiledValueExpression.compiledFunction:null;const u=r.arcadeUtils;if(!n){const e=u.createSyntaxTree(l);n=u.createFunction(e),this._compiledValueExpression.compiledFunction=n}this._compiledValueExpression.valueExpression=l;const p=u.executeFunction(n,u.createExecContext(e,u.getViewInfo({viewingMode:t,scale:i,spatialReference:o}),a));return this._getBreakIndexfromInfos(p)}_getBreakIndexForField(e){const s=this.field,t=e.attributes,i=this.normalizationType;let o=parseFloat(t[s]);if(i){const e=this.normalizationTotal,s=parseFloat(this.normalizationField?t[this.normalizationField]:void 0);if(i===B)o=Math.log(o)*Math.LOG10E;else if(i!==F||null==e||isNaN(e)){if(i===V&&!isNaN(s)){if(isNaN(o)||isNaN(s))return-1;o/=s}}else o=o/e*100}return this._getBreakIndexfromInfos(o)}_getBreakIndexfromInfos(e){const s=this.isMaxInclusive;if(null!=e&&"number"==typeof e&&!isNaN(e))for(let t=0;t<this.classBreakInfos.length;t++){const i=[this.classBreakInfos[t].minValue,this.classBreakInfos[t].maxValue];if(i[0]<=e&&(s?e<=i[1]:e<i[1]))return t}return-1}_areClassBreaksConsecutive(){const e=this.classBreakInfos,s=e.length;for(let t=1;t<s;t++)if(e[t-1].maxValue!==e[t].minValue)return!1;return!0}};e([o(h)],w.prototype,"backgroundFillSymbol",void 0),e([o({type:[d],json:{write:{isRequired:!0}}})],w.prototype,"classBreakInfos",void 0),e([b("classBreakInfos")],w.prototype,"readClassBreakInfos",null),e([k("classBreakInfos")],w.prototype,"writeClassBreakInfos",null),e([o({type:String,json:{write:!0}})],w.prototype,"defaultLabel",void 0),e([o(f)],w.prototype,"defaultSymbol",void 0),e([o({type:String,json:{write:!0}})],w.prototype,"field",void 0),e([r("field")],w.prototype,"castField",null),e([o({type:Boolean})],w.prototype,"isMaxInclusive",void 0),e([o({type:y,json:{write:!0}})],w.prototype,"legendOptions",void 0),e([o({type:Number,readOnly:!0,value:null,json:{read:!1,write:{overridePolicy(){return 0!==this.classBreakInfos.length&&this._areClassBreaksConsecutive()?{enabled:!0}:{enabled:!1}}}}})],w.prototype,"minValue",null),e([o({type:String,json:{write:!0}})],w.prototype,"normalizationField",void 0),e([o({type:Number,json:{write:!0}})],w.prototype,"normalizationTotal",void 0),e([o({type:E.apiValues,value:null,json:{type:E.jsonValues,read:E.read,write:E.write}})],w.prototype,"normalizationType",null),e([I({classBreaks:"class-breaks"})],w.prototype,"type",void 0),e([o({type:String,json:{write:!0}})],w.prototype,"valueExpression",void 0),e([o({type:String,json:{write:!0}})],w.prototype,"valueExpressionTitle",void 0),w=v=e([a("esri.renderers.ClassBreaksRenderer")],w);export{w as default};