Release notes for 4.23

March 2022


This release provides many updates for FlowRenderer (formerly known as AnimatedFlowRenderer) that bring this renderer out of beta. FlowRenderer supports color, size, and opacity visual variables, which can be used on the layer's Magnitude field. You can also change the direction of the flow using the new flowRepresentation property. FlowRenderer can now be used with the TimeSlider widget, and the flow visualization will update at each time slice. Lastly, we added support for smart mapping and webmap persistence.

The following sample uses the FlowRenderer with visual variables to visualize wind speeds during Hurricane Ida.

flowrenderer with visual variables

Basemaps with different spatial references

At version 4.23, you can switch the spatial reference of the MapView by changing the spatialReference property or by changing the basemap using the BasemapGallery or BasemapToggle widgets. The following changes were made as part of this work:

Check out Client-side projection and Basemaps with different projections samples to see this in action. BasemapGallery widget

3D updates

Heatmap renderer

Emphasize high density areas in your scene thanks to the added support for HeatmapRenderer in SceneView. Visualize point features that are clustered by location or using a layer’s attribute values. The resulting raster can be draped on the ground or on top of integrated mesh layers, while supporting the same color ramps as MapView to render intensity. A new property referenceScale allows you to adjust the blur radius independent of the current viewing scale.

Try out the new heatmap sample to explore traffic accidents in Munich.

3D Heatmap Renderer

Weather widget

Change the weather in your scene using the new weather widget. Each of the available weather types is represented through built-in Calcite icons, while a slider allows you to interactively adjust the cloud cover or fog density.

Discover the widget in the updated weather sample.

San Francisco scene with the weather widget

Line style markers

Add markers to your line features to emphasize their starting and ending points, or arrows to indicate a direction. The new LineStyleMarker3D class provides a variety of styles aligned with the existing 2D capabilities. The markers can be driven by attribute values and support using visual variables.

Explore the first expedition to Antarctica with the help of new line markers and label placement in this sample.

Label alignment and styles

Improve the appearance of labels and text in your scenes by using the new styling options on TextSymbol3DLayer. Updates include decorations (such as underlines and strikethrough), settings for better text layout (i.e. line spacing and alignment), as well as loading custom fonts. Emphasize specific labels or enhance readability by adding a background to the label symbol.

Bellingshausen Antarctic Expedition

Virtual light

Light up your 3D visualizations around the globe, especially in polar areas. A new VirtualLighting positions the light source relative to the camera, minimizing the amount of visible shadows. Assign it to as an alternative to the existing lighting, mimicking realistic sun light.

See how the new virtual lighting helps explore exaggerated terrain around the globe in this sample.

Virtual light on a globe

Analysis objects

Programmatically place client-side measurements, slices and line of sight analysis in your scene. With this release we are introducing new analysis types DirectLineMeasurementAnalysis, AreaMeasurementAnalysis, SliceAnalysis and LineOfSightAnalysis that can be added to SceneView.analyses for visualization and evaluation. You can also pass the analyses to the constructor of their respective widgets and view models for further user interaction.

A new sample shows how to create analysis from geometries.

Analysis Objects


New and improved Editor widget

This release introduces significant changes to the Editor widget, including an updated UI that contains SnappingControls and a selection tool. The updated UI streamlines the process for creating and updating features which includes support for batch (continuous) feature creation. It is now possible to create multiple features of the same type at once. When doing so, a form displays for each newly-created feature and attributes can be updated as needed.

These updates are just a few of improvements on the Editor roadmap. Expect to see more updates as future versions are released.

4.22 (Two dialogs for one workflow)4.23 (all-in-one)
old-editor new-editor

Notice how the snapping UI is automatically integrated into the Editor. After choosing the type of feature to create, it is possible to continuously create new features. The attributes provided are saved within each feature and can be updated as needed.

updated editor in action


Support for Contingent Attribute values

The FeatureForm widget added support for contingent attribute values. Contingent values are a data design feature (introduced in ArcGIS Pro 2.4) that restricts the valid field inputs in one field based off the field value chosen in another field. This helps enforce data integrity in editing workflows.

The FeatureForm will automatically detect if a feature service was published with contingent values. The form will provide a “Recommended” list of field input values for the values that would be considered valid in a contingency. The rest of the field inputs that are available, but not considered valid will be available under the “Other” list of field inputs. Fields with domains are required when creating contingent values.


Arcade support

The FeatureForm widget added additional support for reading calculated Arcade expressions on field elements. In addition to visibilityExpression and requiredExpression properties, two additional properties were added that make use of calculated expressions. The valueExpression property allows a reference to an Arcade expression. Once this expression is evaluated, the results can be passed as a value to the field. The editableExpression property allows a field to be set as not editable based on whether the expression returns true for allowed editing or false disabled editing.

FormTemplate.expressionInfos returns three additional returnTypes. In addition to boolean, it now also returns string, date, and number values.

MapView.hitTest improvements

MapView.hitTest() now returns all features that intersect the specified screen coordinates from FeatureLayer, CSVLayer, GeoJSONLayer, GraphicsLayer, StreamLayer, OGCFeatureLayer, WFSLayer, GeoRSSLayer, MapNotesLayer, and KMLLayer. Previously, it only returned the topmost feature from a layer.


Use reactiveUtils to watch properties

This release introduces reactiveUtils to provide new utilities and convenience functions for watching properties inherited from Accessor. It offers significant enhancements over watchUtils. Some of these enhancements include: improved developer usability and type safety, (i.e. using optional chaining of object properties), as well as the ability to work directly with Collections and multiple properties. reactiveUtils can watch the state on a variety of different data types and structures, and it allows for combining values from multiple sources, this reduces or eliminates the need to create multiple watchers.

The following code snippets compare watching the view.updating property with both watchUtils and reactiveUtils. Take note of the different syntax.

Use dark colors for code blocksCopy
// WatchUtils: watch for changes in the view's "updating" property, ie. true/false, "updating", (updating) => console.log(updating));

// ReactiveUtils: Does the same as above with slightly different syntax => view.updating, (updating) => console.log(updating));

Checkout the Property Changes with ReactiveUtils sample for a demonstration of these new capabilities.

Aggregate spatial statistics

Version 4.23 added support for aggregate spatial statistics. A statistics query can now return an aggregate extent, center or convex-hull geometries encompassing features when the statistics are grouped by fields. The aggregate geometries will return with result features and can be accessed via the aggregateGeometries property. Check out the Aggregate spatial statistics sample to see it in action.


RouteLayer is a new layer that provides routing analytics and route visualization in 2D MapViews. A RouteLayer consists of two or more stops, and optionally, barriers. Solved routes can be saved individually as an ArcGIS Online or Portal item, or as part of a webmap. See RouteParameters for more information on input parameters for solving a route request. Results include overall travel time, distance, and turn-by-turn directions.

Note that in some instances you may want to use the route.solve() method. For example, the RouteLayer always requests output of type featureSets, whereas you may prefer the historic route result type. Additionally, RouteLayer always requests all inputs to be returned in the solved route. In more complex scenarios this may not be optimal.

At a future release, the RouteLayer will be integrated with the Directions widget. This will allow new RouteLayers to be created and saved from the Directions widget, as well as allowing the Directions widget to open and even update existing RouteLayers.

Checkout the Intro to RouteLayer sample to see it in action. RouteLayer

Widget updates


Improved graphic highlighting

Sketch graphic highlighting was improved for CIMSymbol, PictureMarkerSymbol, and TextSymbol graphics. The highlight better encompasses the graphic symbol.

cim-before cim-after
text-before text-after
pms-before pms-after

Sketch graphic highlighting can now be overridden with MapView.highlightOptions.

Configure snapping UI with visible elements

Visible elements are supported on many widgets to control what UI elements are displayed in the widget. In this release, we added VisibleElements.snappingControlsElements to the Sketch widget to show or hide snapping UI elements.


The FeatureTable widget had some significant updates this release:

  • Sort multiple fields by setting FeatureTable.multiSortEnabled to true. Setting the direction and new initialSortPriority properties provides control over what column gets prioritized over others when the table initially displays. If these combined properties are not set, the priority defaults to the most recently sorted column. The image below shows the second column, "Enrollment", having a higher sort priority than the "School Name".
multisortenabled new menu items

Popups will display attachments as thumbnail images instead of listed links by default when working with a webmap that is using a default template or when calling the createPopupTemplate method on a layer.

In addition, some updates were made for controlling the behavior of popups. The new chartAnimation ability has been added to the FeatureViewModel to control the animation of charts residing in media content elements within Popup and Feature widgets.

The shouldFocus option for the Popup open method has been added as an accessibility enhancement to provide a way to set focus to the popup automatically as it opens.


Update the color and opacity of the trace result with the defaultGraphicColor property in the UtilityNetworkTrace widget. Additionally, you can override the label and description headings and sub-headings of both the "Starting points" and "Barriers" sections of the widget using the inputSettings property. Both the starting and barrier point graphic symbols can also be overridden with the inputSettings. Only SimpleMarkerSymbols and PictureMarkerSymbols are currently supported.


Slider updates

You can restrict users to only move the slider thumbs inside a subset of the min and max using the new effectiveMax and effectiveMin properties on Slider widget.

This can be useful for representing ranges of values in a dataset that should not be selected or filtered with the slider. For example, you may want to use a slider to represent the full range of data, but prevent the user from including outliers in a selection of features.

Use dark colors for code blocksCopy
// slider.max = 100
slider.effectiveMax = 60;
// slider.min = 0
slider.effectiveMin = 10;
// now the user cannot slide thumbs beyond the bounds of 10-60. The inactive part of
// the slider track may be used to communicate what data exist even if it can't be filtered

Layer updates

VectorTileLayer Updates

You can easily update the sprite source for your VectorTileLayer style by calling setSpriteSource method and passing the URL of your new sprite source. This eliminates the need of having to update the sprite source in the style json file.

Raster updates

ImageryLayer can be highlighted now as we added ImageryLayerView.highlight() method.

Performance improvements

We've improved the performance when working with large image services with multiple bands by switching to Web Assembly for the LERC decoder for ImageryLayers.

In previous releases, VectorFieldRenderer.symbolTileSize value was capped at 30 for performance reasons. At 4.23, you can set the symbolTileSize to a number less than 30 and the renderer will perform well.

Enhanced labeling support for MapImageLayer

Previously, MapImageLayer could only be labeled using SQL and the labelExpression property. Now, if working with a MapImageLayer that supports Arcade, you can also label using Arcade and the labelExpressionInfo property instead. To determine if a layer supports this, check the supportsArcadeExpressionForLabeling property. If true, then labelExpression or labelExpressionInfo can be used. If false, then only labelExpression can be used.

Printed legend support for tiled layers

Tiled layers are now supported in the printed legend using the Print widget and rest/print. Tile layers must still have legendEnabled equal to true to display in the Legend widget and the printed legend.

CIMSymbol - improved support

Each release, we continue to improve support and fix bugs for CIMSymbol. In this release, we added support for overriding effects, which allows you to use a PrimitiveOverride to override a property defined in a CIMGeometricEffect.

We have also updated the CIMSymbol documentation so that you no longer need to view the CIM specification in order to create your CIM symbols. All supported properties from the CIM spec are included in the API Reference, along with images and code snippets.

cim documentation

Collection updates

We added, which allows you to return an item at the specified index. Unlike Collection.getItemAt(), the at() method allows you to return items from the end of the collection using negative integers.

Use dark colors for code blocksCopy
// get the layer at the first position
// (i.e. the layer rendered below all others,
// but on top of the basemap)
let firstLayer =;

// get the layer at the last position
// (i.e. the layer rendered on top of all others)
let lastLayer =;

Updates to OAuth Authentication

OAuth authentication now defaults to automatically use short-lived access tokens generated via two-step with Proof Key for Code Exchange (PKCE) flow. This will be the default behavior for applications using the default page redirection for OAuth sign-in. This update follows the recommendations suggested in the OAuth 2.0 Security Best Current Practices specifications.

Prior to this version, the default was to use the one-step flow. Once authenticated, an access token would append as a URL hash to the client in a single step. This could potentially cause problems if the token was leaked or stolen since any resource accessible using this token would also be compromised.

Applications utilizing two-step authentication with user sign in via a popup window should opt in by setting flowType = "authentication-code". In addition, any existing callback page should be updated to support it. To aid in this, the default oauth-callback.html has been updated to allow for the two-step approach, although it will still work if using the one-step flow.

This update should be transparent with no changes needed by the developer if popups are not used for signing in and the application accesses ArcGIS Online or a version of ArcGIS Enterprise that supports PKCE.

Added classes, properties, methods, events

Deprecated classes, properties, methods, events

Breaking changes

The following classes, methods, properties and events have been deprecated for at least 2 releases and have now been removed from the API:

Class/Property/Method/EventAlternate optionVersion deprecated

Please refer to the Breaking changes guide topic for a complete list of breaking changes across all releases of the 4.x API.

Bug fixes and enhancements

  • BUG-000111371: MapView now accepts center, extent or viewpoint.targetGeometry with projections that do not match view spatialReference.
  • BUG-000120919: Fixed an issue where a popup was displaying different number results depending on where features where clicked.
  • BUG-000138677: Fixed an issue with WMSLayer sending a lowercase value for the transparent parameter instead of an uppercase value.
  • BUG-000139261: The FeatureTable now supports zooming to selected features within the table.
  • BUG-000139569: Fixed an issue with Sketch where it was difficult to determine whether a graphic with certain symbology was selected.
  • BUG-000140688: Fixed an issue with popups not loading an image when a URL is specified with a linkURL in the ImageMediaInfoValue.
  • BUG-000142065: Fixed an issue with a WMSLayer with a spatial reference of EPSG: 3045, 3046, 3835, or 3836 failing to load due to bounding box values not being in the correct order.
  • BUG-000144839: Fixed an issue with Sketch where an error is thrown when overriding the popupTemplate on the graphic returned from a create event.
  • BUG-000145335: Fixed an issue with the IdentifyParameters.layerIds property not being properly handled in an identify request.
  • BUG-000145914: Fixed an issue with the documentation explaining which units are available in the measurement widgets.
  • BUG-000145975: Fixed an issue with FeatureEffect and labeling, where the labels would not be shown if FeatureEffect was set to null.
  • BUG-000146147: Fixed an issue where StreamLayerView.filter stops getting updated when toggled a few times if the StreamLayer has labels.
  • BUG-000146233: Fixed an issue where StreamLayer.definitionExpression always uses the previously defined definitionExpression.
  • BUG-000146346: Fixed an issue where resizing a CIMSymbol when FeatureReductionCluster was set on the layer only applied to one symbol layer. Now all symbol layer sizes properly scale for clusters.
  • BUG-000147011: Fixed an issue where maxAllowableOffset parameter not being sent in query requests when the service does not quantization.
  • BUG-000147540: Fixed an issue in SceneView with StreamLayer.customParameters that were not appended to all the requests.
  • Esri Community - 1130415: Fixed an issue where some widget buttons were missing a type=button property. This only affects button elements when wrapped in a form.
  • Esri Community - 1131736: Fixed an issue where some TravelMode parameters were not being properly set for some routing services.
  • GitHub - 150: Fixed an issue where BasemapGallery widget selects basemaps with same URL but different layers.
  • GitHub - 379: Fixed an issue where client-side FeatureLayer fields with parenthesis fail to be created.
  • Fixed an issue where CIMSymbols with rotated CIMPictureMarker symbol layers were getting cut off at tile boundaries.
  • Fixed an issue where CIMSymbols with primitive overrides were not getting updated when a graphic's attribute changed.
  • Fixed an issue where features from FeatureLayer were disappearing along tile boundaries.
  • Fixed an issue where GroupLayers in a MapView consume too much GPU memory.
  • Fixed an issue where TimeSlider widget did not automatically switch from compact to wide layout when the app window resizes.
  • Fixed an issue where the Legend for relationship renderer displayed text in the wrong order for right-to-left languages.
  • Fixed an issue with LineOfSightViewModel.start() now always clears the and LineOfSightViewModel.targets properties, and starts the creation of a new line of sight. To resume the creation of a line of sight without clearing any properties use LineOfSightViewModel.continue().
  • Fixed an issue with SliceViewModel.start() which now always clears the SliceViewModel#shape, and starts the creation of a new slice plane.
  • Fixed an issue where the FloorFilter did not honor definition expressions for the Sites, Facilities, and Levels layers in a web map.
  • ENH-000120395: Added support for contingent attribute values in the FeatureForm widget.
  • ENH-000131683: Tile layers can now be included in the printed legend if they have legendEnabled equal to true.
  • ENH-000133571: Updated the documented return type for route.solve() and RouteTask.solve() methods to be more accurate.
  • ENH-000135083: The FeatureTable widget now supports displaying only selected rows.
  • ENH-000143099: Added support for the symbolUtils.getDisplayedSymbol() method to evaluate the overrides for CIM text symbols when using DictionaryRenderer symbols.
  • ENH-000143951: Symbols now display for individual Sublayers in the LayerList widget when a Legend is added to LayerList panels.
  • Esri Community - 1132750: Enhanced the CoordinateConversion widget with a storageType property so that either sessionStorage or localStorage can be used to store widget state.
  • Esri Community - 1137614: Enhanced the Search widget so that the Search in dropdown arrow can open or close the list of available locators.
  • Calling GroupLayer.loadAll() will now return layers in addition to tables. Prior to this release, it only returned layers.
  • Enhanced cimSymbolUtils.applyCIMSymbolColor() by adding a parameter that allows you to specify where the color should be applied - to the fill, the outline, or both.
  • VoxelLayer is out of beta with better support for integrated GPUs.
  • DirectionsViewModel.stops now supports a Collection or array of Stops or Graphics. The assigned value will be automatically autocast to a Collection of Stops.

Additional packages

Version 4.23 of the ArcGIS Maps SDK for JavaScript uses ArcGIS Arcade 1.17 (since 4.23).

Version 4.23 of the ArcGIS Maps SDK for JavaScript uses Calcite Design System (Beta), version 1.0.0-beta.77.

How to access the SDK

  • The API library is available on both CDN and npm, Read more at Install and set up.
  • For supported versions, you can also download both the documentation and the API library. These downloads are typically available 3-4 weeks after release.

Previous releases

Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.