Experience Builder Tips and Tricks

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Latest Activity

(70 Posts)
JeffreyThompson2
MVP Frequent Contributor

It will be is was* ArcGIS Online Update Day again, so it's time for the fourth addition of our First Thoughts series. Before we talk about what the official development team has been up to, I'd like to shout out the work of the unofficial development team: us. We have been super busy coming out with a lot of new high impact Widgets over the past couple months. I have been struggling to keep up with the changes in the List of Custom Widgets. Some of the things added by these Widgets include: freehand drawings and editing drawing symbology, changing map symbology at runtime and saving the state of an application. Features that don't now have OOTB support in Experience Builder. But make sure to keep checking that list often, there's still many ways the Community is ahead of ESRI. Other headline grabbing features in the June '25 Update include: advanced formatting options, Arcade support, and batch editing. All in all, this is the most impactful update in at least a year.

Here are the rules for this series:

  • I read the official What's New in Experience Builder Blog post.
  • I maybe try a few things for a few minutes. (That's a big maybe today. ESRI is having a bad day.)
  • I attempt to translate the What's New page from developer to English.
  • If I don't think something is going to be very important to many people, I leave it out of my notes.
  • I might make some guesses how the new stuff can be used.
  • You don't get mad at me if you can't actually do those things.

Accessibility

Accessibility features have been added to a ton of Widgets and Template. If you are working for a government entity, you probably have legal accessibility targets to hit, so make sure you are using whatever tools are available. If you aren't working for a government entity, try to hit those accessibility targets anyway. 

Actions

  • Open View will open a View in a Section Widget. (Is this new? Didn't we already have this?) 
  • Toggle Widget lets you open and close a Widget in a Widget Controller. This DIY Widget Controller build just got better.
  • Add Marker lets you point a point on a map.
  • With the Add/View in Table Actions, you can decide to open in a new sheet or not.
  • Export Data as shapefiles, geodatabases or KML.

Advanced Formatting

This might invalidate like half the posts on this Blog. Use your data to change text, image sources, links, backgrounds, borders and more. Do it no-code or write some Arcade for more complicated stuff.

Data

  • Datasource IDs are no longer a mystery. (Unhiding the Widget IDs would also be nice.)
  • Search for data outside your organization, if your Admin says it's ok.
  • Add data with Arcade.
  • New field types:
    • Big Integer - Don't you hate it when you can't count past 4,294,967,296? Now, you can count to 9,007,199,254,740,991.
    • Date Only - For timeless days.
    • Time Only - For dayless times.

Embedding

There is a new policy involving the Embed Widget, which I believe is more strict than it used to be and (if it is more strict) will break some of your apps. Here's the quote, then we'll talk about what it means and why they are doing this.

There are new rules for sharing authentication. ArcGIS uses token-based authentication for all access requests. When you embed an Experience Builder app in another ArcGIS app with the arcgis-auth-origin URL parameter, the Experience Builder app requests an access token from the parent app. The parent app decides whether to reply to the token. When you embed another app in an Experience Builder app with the Embed widget, the parent Experience Builder app only replies to the token request if the child app is under the*.arcgis.com domain or the same domain as the parent Experience Builder app.

The Embed Widget works using something called an iframe, that allow a little bit of one website to show on another website. In ye olden days of the Internet, iframes were very common. They are less common now for two reasons: branding and security. Many large websites have code that will reject connections from iframes. If you try to embed google.com, you will see a google.com refused to connect warning because Google doesn't want you to pretend you are Google. But the security problems are really the main reason for the downfall of iframes. Depending on the security settings of the iframe, the browser may have no way to tell where your website ends and the other website begins. So if you aren't careful, if the website you are embedding has a security issue, your website has a security issue, too. 

In order to access secured features, the embedded and parent site need to do a super secret handshake. Experience Builder won't take part in this handshake unless its with arcgis.com. If you are on Developer Edition, both apps can be on yourcompany.com.

General Settings

Remember this from WebAppBuilder?

JeffreyThompson2_0-1750967771520.png

 

 

 

It's in Experience Builder now. Restore your app state. Restore your heart.

Because of the major ArcGIS Online outage today, I have been dealing with complaints all day about login prompts and inaccessible content warnings. It's getting near the end of the day and I'm only this far through the What's New page. A few weeks from now, when the new Developer Edition comes out, I will be able to turn these login prompts off forever and then I can die happy. 

Languages

Do you need to translate to Norwegian? NO. That's what it's called now.

Pending List

The Pending List has been redesigned to clarify what, if any, screen sizes a Widget is used in.

Templates

Set sail on the new Templates called Harbor and Beacon. The Capabilities Button will help you decide which Template you should use.

New Widgets

I don't think I will ever use any of these new Widgets, but they sound useful to the people that will need them.

Display Order - For controlling mosaic datasets.

Document Explorer - Find ACC or BIM 360 files and folders then view them with 👇.

Document Viewer - See those ACC or BIM 360 documents.

Link Explorer - Find ACC or BIM 360 files linked to your map then view them with 👆.

Widget Updates

Add Data - Look, I said I would ignore pointless stuff, but this is just so pointless that it deserves recognition: there's a button to copy the sample URLs. Actually useful updates: symbology of imported layer will be respected and an option to limit the types of data imported.

Analysis - Support for geoprocessing of security enabled layers.

Business Analyst - New ESRI Tabular Reports template. If your American, your data can automatically update once a year. Rest of the world... look, it's been kind of rough around here lately... can you just let us have something?

Chart - Label your pie. Personally, I will label every slice 'mine'.

Directions - End users can save their routes. Builders can add a lot of barriers and define start and end points.

Draw - Freehand drawings and editing the symbology after drawing means ESRI has caught up to @RobertScheitlin__GISP three and a half years ago. Edit multiple graphics at once. @Brian_McLeer, they beat us on that one, but we still maintain the overall lead.

Edit - It was promised in each of the last two updates, but this time it actually happened: batch editing. Enjoy.  Change the attributes, size, location and rotation of multiple features at once. Cherish it.

Other stuff: Line segment length labels for 3D scenes. Reorder the layers. If you add data using Arcade, the editor can edit it. Faster layer loading.

Elevation Profile - You can choose whether or not to clear the results when the Widget closes or hides.

Feature Report - Make a report from any feature layer. Survey123 is no longer required.

Filter - Change the order of predefined values. 

Floor Filter - Your floor aware stuff just got way more floor aware. I don't really do Indoor stuff, but from the description, it sounds like floor filters actually work the way you would expect them to now. Also, floor aware Arcade editing support.

Flow Row - Add the Space Around and Space Between attributes to complete the Flexbox CSS options. Space Around is my favorite flavor of Flexbox.

Image - Expand your images. Pan around. Zoom and Enhance. Click arrows or swipe through multiple images. Make Tinder for geographic features?

Legend - Hide layers from your legend, including runtime layers.

List - Comma separator for the count of long lists. (Europe is really getting shafted on this update.) Checkmark if you're using a sort.

Map - Add a marker or lots of markers to the Map using URL Parameters. By default, 3D scenes render in lower quality on iPhone, so overpriced, underperforming phones don't explode.

Map Layers - Change the symbology of layers added at runtime. This is making fancy Widgets to add/remove data at runtime look even cooler. According to a promise made by @Jianxia at DevSummit, the show/hide all layers button should respect the Map Layers customization. According to testing, it does not. I will bring this up on every update until it does.

Measurement - A few updates ago, the Measurement Widget had snapping turned on by default. Since then many users have reported serious performance issues with it. And maybe, you just don't want snapping. Now, snapping can be turned off by the Builder. Or you could use a Draw/Measurement Widget where snapping must be deliberately enabled by the user.

Near Me - A whole lot of map surround options have been added to PDF reports. You can choose whether or not to clear the results when the Widget closes or hides. Hope this doesn't break all the fun hacks that depend on a hidden Near Me Widget.

Oriented Imagery Viewer - Make your own version of Google StreetView with Directional Navigation. Or define some other order for Sequential Navigation. Support for video. Use triangulation to the distance, area and location of stuff. These are things that make you say we really are living in the future.

Print - Pick what WKID to use for printing.

Query - Not in the What's New document, but my email says the broken Query Widget from the last update is unbroken and some quick testing confirms it.

Search - Search results that match what's been searched appear first. (Why wasn't it always like this? What was it doing before?)

Select - Reorder the layers in the Select Widget. It took a weird, unintuitive click sequence, but it can be done. Also, not in the What's New page, but if you place a Select Widget in a Widget Controller and close it with a select tool enabled, it will disable the select tool.

Share - Write the text that will appear in the email when a user shares by email.

Table - Support for showing and editing related records. Hovering over something in a Table will highlight the feature on the map in yellow. Option to automatically add runtime generated layers as tables. Decide what order you would like the tables to be in. Text display options, most importantly, text wrapping. Option to hide the Show/Hide Columns option.

That's all the notes for this update. The expect the next update to include those last set of edit tools missing from WebAppBuilder, just a bit too late for Enterprise 12.

* I got an early jump on writing this post this time around, but with all the disruptions caused by the ArcGIS Online outage (ESRI broke Nearmap real bad.) and the amount of stuff in this update. I couldn't get this all written up on update day. Sorry, I tried.

more
3 0 61
JeffreyThompson2
MVP Frequent Contributor

Three Buttons for the Pages under the URL,

Seven for the Views in their Section homes,

Nine for Widgets doomed to close,

One for the link on an external site

In a Sidebar where a hidden Widget Controller lies.

One set of Buttons to rule them all,

One set of Buttons to find them,

One set of Buttons to bring them all,

And in a Header bind them,

In a Sidebar where a hidden Widget Controller lies.

- J. R. R. Tolkien, probably, the books are really long and often quite boring.

Picture a project with a Widget Controller in the Header. From this one set of Buttons, you could jump from Page to Page in a project, change Section Views, open and close Widgets and Sidebars and link to external webpages.

... But they were all of them deceived, for there wasn't a Widget Controller in the Header, it's a set of Buttons.

A while back, I made a DIY Widget Controller. It was complicated to set up and probably not worth the effort. Today, I thought of a better way to pull off this trick and some more ways it could be used. The trick is just use a Widget Controller after-all. You may still want to use the self-changing Buttons from that post to add even more refinement. Note: we are building in ArcGIS Online. Older versions of Enterprise will not have all of these options. I'm too lazy today to figure out how far back this build is viable for.

Widget Controllers are cool and all, but they aren't without issues and almost all of them can be fixed by hiding your Widget Controller and replacing it with Buttons. Here are some of the problems we can fix this way:

  • Buttons placed in a Widget Controller don't just do what the Button should do, instead they pop-out a Button in the Widget Panel. So, they don't really work well for making links or controlling Section Views.
  • Widget Controller Buttons are icon only. The title of the Widgets can be added below the button with the Label option, but these titles are frequently cut-off.
  • Limited style options.
    • Only three sizes of buttons, unusably tiny, tiny and acceptable but still a little small.
    • Only two shapes of buttons, circle or square with rounded corners.
    • No borders around buttons.
  • All the buttons must have the same style, so no thematic coloring buttons.
  • All the buttons must be next to each other in a vertical or horizontal line.
  • All Widgets must float next to the Widget Controller or open at the same Fixed location.

Do you want to give this a try? Alright, let's make some Buttons that control a Widget Controller. For this build, I will be making basically just a standard Widget Controller, but with larger buttons that have a border around them. They will be neatly lined up, single-color, circular, icon-only buttons. But if you want to mix in some normal Buttons amongst your Widget Controller Buttons, or have radically different styles and for each Button, that's your choice.

Starting from a blank layout, I will add a Sidebar Widget and make it Full Size. Into the Collapsible side of the Sidebar, I'll add a Widget Controller and throw a few Widgets inside it. You must used the Fixed Widget Panel Arrangement for this build, but if you want your Widgets to open in different locations, you could use multiple Widget Controllers. (Another small downside of this method, is clicking the Button again will not close the Widget, so you may not want to stick to the Single Widget Behavior and ignore that last bit about multiple Widget Controllers.) The Always Open side will contain the actual application. I'll put a Full Size Map Widget here to fill the space. The Widget Controller is now set up, so we don't need to look at it again. In the Sidebar Settings Panel, set Resizable to off, the Default State to Collapsed, click that Collapse Button to close the Sidebar, and then turn off the Collapse Button so the user can't open it.

JeffreyThompson2_0-1749585183839.png

Now, we build the counterfeit Widget Controller.  Add a Flow Row Widget and in its Style Tab set the Width and Height to Auto. Add a Button Widget to it.

JeffreyThompson2_1-1749585502547.png

In the Button Settings Panel, delete the Text and pick an appropriate Icon. All of the Icons for Experience Builder Widgets are in the Brand And Logos page of the Icon Picker. Hint: there's a sneaky dropdown menu in the Icon Picker. Look carefully.

JeffreyThompson2_2-1749585725848.png

To make our icon bigger, turn on Advanced, open the Icon dropdown menu and type in a number. I went with 30px. Maybe a little too big for most applications, but its not outrageous. I changed the color to white using the box next to the size input and then opened the Background dropdown to set the Fill to blue.

JeffreyThompson2_3-1749586564223.png

In the Border dropdown, I set the color to a dark gray, picked a single line from the dropdown menu and set the thickness to 1px. You may not be able to see this border, but your brain does. Good borders are usually barely visible. To make it a circle, open the Border Radius dropdown and make it 50%.

JeffreyThompson2_4-1749587022098.png

In the Style Tab, Lock the Aspect Ratio at 100:100 and set the Width. I like the way 42px just barely cuts off the corner of the icon. It looks very dynamic to me.

JeffreyThompson2_5-1749587439238.png

Finally, in the Action Tab, add a Button Click > Widget Controller > Open Widget > Your Widget Action. (If you want this Button to link to something, that's in the Content Tab under Set Link.)

Ugggh, that was a lot of work, do I have to do that for every Widget in my Widget Controller? Nope, hit the Duplicate Button. All you need to change is the icon and the target for the Action.

JeffreyThompson2_6-1749587857675.png

And we've got a set of Buttons that look a lot like a Widget Controller and work a lot like a Widget Controller but give you way more control over the design than a Widget Controller. And you can mix in a normal Button that will act like a Button, too.

JeffreyThompson2_7-1749588252682.png

...Until a hobbit throws your computer in a volcano, in a complex allegory for hubris and greed by someone who claims not to like or use any allegory or symbolism.

more
4 0 168
JeffreyThompson2
MVP Frequent Contributor

Before we get into the meat of today's post, let's clarify some terms. Both Experience Builder and the Maps SDK for JavaScript (or JavaScript API, if like me, you refuse to accept the name change) have things called Widgets. In both platforms, Widgets are blocks of reusable code designed to do some task that can be easily called in to an application by Builders. We will be discussing both types of Widgets today, so to make things a bit clearer Widgets in Experience Builder will be referred to as ExB Widgets and Widgets in the JavaScript API will be called JS Widgets.

In my opinion, one of the greatest selling points of Experience Builder Developer Edition is that anything in the JavaScript API, including JS Widgets, are readily available. So by firing up Experience Builder, I instantly get access to all the code that the Experience Builder team has made for me and, with a little more effort, all the code the JavaScript API team made for me. If, for example, I was disappointed that Experience Builder does not have a simple, cleanly designed, user-friendly way to switch between exactly two basemaps, I could create a Custom ExB Widget and call in the JS Widget that does the job. Calling in JS Widgets from ExB Widgets is a common programming pattern. In fact, if you look into the code, many of the OOTB ExB Widgets are little more than loaders of JS Widgets. It sure would be a problem for people making Custom ExB Widgets, if JS Widgets went away...

Hey, did you click that last link? Did you see that red rectangle?

JeffreyThompson2_0-1749042950337.png

It's deprecated. Every JS Widget is either already deprecated or is about to be. Starting next year, JS Widgets are going to start being Thanos snapped out of existence.

mr-stark-peter-park-infinity-war-gif.gif

Way back in the second most popular post on this Blog, my React primer, I noted that Experience Builder 1.13 would include Components, a new part of the JavaScript API better designed for working with frameworks like React that use a Virtual DOM, and that you should probably prefer to use Components over JS Widgets. Have I done that? Nope. And now it is official, Components are coming to kill JS Widgets. Better learn how to use Components. Hey, that's what this post is about. Are we finally getting to the point?

And now that I've wasted enough words that this post becomes legally copyrightable, like an online recipe, let's build a Basemap Toggle ExB Widget using a JavaScript API Component. I will start with some boilerplate code in widget.tsx:

import { React } from 'jimu-core'
import { MapViewManager, JimuMapView, JimuMapViewComponent } from 'jimu-arcgis'
import { Loading } from 'jimu-ui'
import reactiveUtils from 'esri/core/reactiveUtils'

const { useEffect, useState } = React

const Widget = (props) => {
	const viewManager = MapViewManager.getInstance()
	const mapView = viewManager.getJimuMapViewById(viewManager.getAllJimuMapViewIds()[0])
	const [jimuMapView, setJimuMapView] = useState<JimuMapView>(mapView)
	const [mapReady, setMapReady] = useState(false)

	useEffect(() => {
		if (jimuMapView) {
			reactiveUtils.whenOnce(() => jimuMapView.view.ready)
				.then(() => {
					setMapReady(true)
				}
			)
		}
	}, [jimuMapView])

	const activeViewChangeHandler = (jmv: JimuMapView) => {
		if (jmv) {
			setJimuMapView(jmv)
		}
	}	

	return (
		<div className='jimu-widget' >
			{
				props.useMapWidgetIds &&
				props.useMapWidgetIds.length === 1 && (
					<JimuMapViewComponent
						useMapWidgetId={props.useMapWidgetIds?.[0]}
						onActiveViewChange={activeViewChangeHandler}
					/>
				)
			}

			{mapReady ? 'map ready' : <Loading />}
		</div>
	)
}

export default Widget

 On it's own, this code doesn't really do anything. The net effect is to wait for JimuMapView to load, then save it to a variable and display the 'map ready' text. Let's breakdown exactly how we accomplish nothing with this code.

On the first render, the mapView is captured by the viewManager and stored into state as jimuMapView. It's actually a null value at this point. mapReady is given a default value of false. Somewhere about this point, the map starts to load, triggering the onActiveViewChange property of the JimuMapViewComponent.

One thing that frequently confuses developers is that the onActiveViewChange property only fires when the entire mapView object changes. As in, the Map Widget contains two maps and the user switches between them. For an example of someone not quite getting this concept, you can look at the official using map components example, which requires having two maps in the Map Widget and the end-user to swap between them before the Legend and Map Layers will actually load.

The onActiveViewChange property calls the activeViewChangeHandler function that sets jimuMapView to the actual mapView object and triggers render number two. Because jimuMapView has changed from null to a truthy object, the useEffect function fires on the second render. useEffect and the activeViewChangeHandler functions also started on the first render but their if clauses prevented them from doing anything. At this point, jimuMapView is truthy, but it is a very complex object and may not actually be fully loaded, so reactiveUtils is called to wait a little bit for the map to actually be ready. And when jimuMapView says it's really, actually ready this time, the mapReady value is set to true, triggering render number three.

Theoretically, the ExB Widget has been showing a loading graphic through the first two renders, but they have actually happened faster than Loading can load and now that mapReady is true the ExB Widget should be showing text saying 'map ready'. And that was a Shakespearian amount of ado about nothing. Isn't React fun? Now that we've got the code to load the map without crashing, we can start adding the functional bits.

In the import statements, I'll add this:

import { ArcgisBasemapToggle } from '@arcgis/map-components-react'
import Basemap from 'esri/Basemap'

I change the ternary in the return statement to this:

{mapReady ? <ArcgisBasemapToggle id='basemapToggle' /> : <Loading />}

And add this block between the activeViewChangeHandler and the return:

const toggle = document.getElementById('basemapToggle')
if (toggle) {
	toggle.componentOnReady().then(() => {
		toggle.referenceElement = jimuMapView
		toggle.nextBasemap = new Basemap({
			portalItem: {
				id: 'id'
			},
            thumbnailUrl: 'url'
		})
	})
}	

Assuming I have entered the correct values for id and thumbnailUrl, this Widget should now be fully functional. Let's talk about what this code does.

The code asks the browser to find the Basemap Toggle Component by the id we gave it. On the first two renders, the browser won't be able to find it because it doesn't exist yet. On render three, it will exist, toggle will become truthy and we will enter the if statement. If you console log toggle, you will find it is a DOM node, but it can also be treated as a JavaScript Object, functionally the same as a JS Widget. I don't really understand what quantum mechanics trickery is going on here, but it does work and you will see many examples like this if you look at the Components documentation. We will choose to believe that the cat is alive and collapse the waveform with toggle as a JavaScript Object.

TypeScript will claim everything inside this if statement is impossible. TypeScript is often right about things, but not today. You can just ignore TypeScript if you don't like what it says, if the Widget doesn't crash, then you were probably doing something legal after all. The first thing TypeScript doesn't believe in is the componentOnReady() method. This method is on every Component and it tells the code to wait for the Component to fully load before proceeding with the rest of the function. By my count, this is the fourth time we have asked the browser to slow down and wait in the past 100 micro-seconds, making it only slightly more patient than my four-year-old.

Now inside the then() statement, toggle is ready to receive further instruction. We will set the referenceElement property to jimuMapView. This tells the toggle what map to toggle. The nextBasemap property is the basemap it should toggle to. The toggle also has an activeBasemap property, but we don't need to worry about setting that, toggle will pull it from jimuMapView automatically. For ease creating a Settings Panel, I am making my nextBasemap from a Portal Item. In testing, I found that the thumbnail image will not load until the toggle is clicked, unless a thumbnailUrl is specifically added, so I'm doing that as well.

If I was making this Widget as a one-off, I could stop here, but I want to make this re-usable, so we'll build a Settings Panel next. Here is some boilerplate for setting.tsx:

import { React } from 'jimu-core'
import { AllWidgetSettingProps } from 'jimu-for-builder'
import { MapWidgetSelector } from 'jimu-ui/advanced/setting-components'

const Setting = (props: AllWidgetSettingProps<any>) => {

    const onMapWidgetSelected = (useMapWidgetIds: string[]) => {
        props.onSettingChange({
            id: props.id,
            useMapWidgetIds: useMapWidgetIds
        })
    }

    return (
        <div className="widget-setting">
            <MapWidgetSelector
                useMapWidgetIds={props.useMapWidgetIds}
                onSelect={onMapWidgetSelected}
            />
            <p>This widget id: {props.widgetId}</p>
        </div>
    )
}

export default Setting

Not much to say about this code, it just lets Builders tell this Widget what Map Widget it should work with. I also like to show props.widgetId in the Settings Panel of all my Widgets. I don't have any specific need for it in this Widget, but it's useful information that ESRI doesn't want you to have. I have been known to temporarily add one of my Widgets to a project, just so I can figure out the id of an ESRI Widget, usually a Sidebar.

Now the functional bits, in the imports:

import { TextInput, Label, TextArea } from 'jimu-ui'

Between onMapWidgetSelected and return:

const handleBasemapId = (e) => {
    props.onSettingChange({
        id: props.id,
        config: props.config.set('basemapId', e.target.value)
    })
}

const handleThumbnailUrl = (e) => {
    props.onSettingChange({
         id: props.id,
         config: props.config.set('thumbnailUrl', e.target.value)
    })
}

In the return statement:

<Label
    className='w-100'
>
    Portal Item Id Of Other Basemap:
    <TextArea
        defaultValue={props.config.basemapId}
        onChange={(e) => handleBasemapId(e)}
    />
</Label>
<Label
    className='w-100'
>
    Thumbnail Url Of Other Basemap:
    <TextInput
        defaultValue={props.config.thumbnailUrl}
        onChange={(e) => handleThumbnailUrl(e)}
    />
</Label>

I also need to change config.json to this:

{
  "basemapId": "",
  "thumbnailUrl":  ""
}

 I also need to go back to widget.tsx and change that if statement we looked at earlier to this:

if (toggle) {
	toggle.componentOnReady().then(() => {
		toggle.referenceElement = jimuMapView
		if (props.config.basemapId) {
			toggle.nextBasemap = new Basemap({
				portalItem: {
					id: props.config.basemapId
				}
			})
			if (props.config.thumbnailUrl) {
			        toggle.nextBasemap.thumbnailUrl = props.config.thumbnailUrl
		        }
		}
	})
}

The settings.tsx allows Builders to enter an id and thumbnailUrl for the basemap they want to add. With onSettingsChange() being a built-in method for turning typing in the Settings Panel into data stored in the config.json in the server files. The changes in widget.tsx are designed to grab the stored values from the config.json file and use them in the Widget and the if statements are designed to prevent the Widget from crashing when/if the data is missing.

That pretty much does it. We built an ExB Widget using Components instead of JS Widgets, but since you all waited patiently through my story, how about a treat? Here's a Basemap Toggle Widget that probably won't crash next year.

more
4 0 152
JasonBOCQUET
Frequent Contributor

Hello everyone,

This post will follow on from the previous one I wrote. (https://community.esri.com/t5/experience-builder-tips-and-tricks/how-to-easily-connect-your-data-and...)

The aim is to be able to filter a first data source (transactions, for example) so that, thanks to a common identifier present in each of the tables, the other data sources (properties, offers, assignments) present in other widgets (Map, List, Table, Graph) are updated. All this without having to duplicate columns in each table concerned or select items on a map to bypass the system.

Last time, I mentioned the difficulty that ArcGIS Experience Builder had in offering dynamic rendering between several widgets with different data sources.
Indeed, if I want to filter my data according to criteria linked to transactions, and have a map rendering that shows me the buildings linked to these transactions, I must add the fields that I use to filter my transactions to my Building table.

In this way, the data I display in my application about buildings is updated according to the transactions I've filtered.
But this process isn't easy to set up and requires a lot of changes to be made to our databases that aren't normally necessary.

Since this post, there's been nothing new on the ESRI side, and no update along these lines, so I had to get my brain working at full speed to find a way of cobbling together something that would work.

So I concentrated on the way widgets currently work: it's possible to set actions on our data. For example, we can add an action when items are selected and only then can we give the order to filter the data records that have been selected. This filtering is done using action parameters, creating a link between two different data sources (one triggering, and one ‘undergoing’ the action) using a common identifier.
So let's suppose that we're filtering a ‘Transaction’ data layer according to the years in which the transactions were signed, and that I don't have a replica of the ‘Transaction year’ column in my ‘Building’ data layer. I want to see the transactions for 2021 and therefore the buildings associated with these transactions on a map.

 

If I'm doing things using a ‘Modification of record selection’ action and if you followed my first post, this means that once I've filtered my transactions, I have to make a selection on the map by hand in order to filter the buildings.
Otherwise, I need to have added the ‘Transaction Year’ column to my Building layer beforehand for the Group Filter to work, but this solution is not possible if we have an N-1 relationship between our data*.

*the Transaction-Building relationship is N-1, there are N transactions for 1 building, which means that if I add the ‘Transaction Year’ column to the Building table, I'll have to ‘clone’ each building for each transaction involving that building, otherwise I'll lose information. And clearly, cloning buildings sucks because in terms of cartographic rendering it means having N points superimposed...


With that in mind, I was left with only 2 solutions:

  • Pray that ESRI will finally develop an action parameter that is triggered not when you SELECT something, but rather when you FILTER something
  • Succeed in creating a SELECTION action, without the user having to do it himself.

 

As you can imagine, I had to focus on the second solution.

The idea was simple: what if I used the Selection tool to simulate a Selection action without the user realising?

So we're going to take a Selection Widget and choose ‘Select according to attributes’ as the source. Then click on ‘New data’. To follow my example, I'm going to choose my data source ‘Transactions’ (in my case it's a simple Table), thanks to the SQL expression generator, I'll be able to set up Filters that will be used to select the data according to attributes (I'm using several fields with the ‘AND’ condition).

Once that's done, all that's left is to set up actions when there's a Modification of record selections. This action is set up with ‘Structure’ as the target, then ‘Filter data records’ is selected and all that's left is to choose the Building source (or any other source) which has an identifier in common with the transactions (in my case we have an ID called ‘ID_LP’).

The final result is as follows:

JasonBOCQUET_0-1746607140587.png

As you can see, we ‘disguise’ this Selection widget as being a sort of Filter widget, and thanks to this, I can filter my transactions according to using fields that are not present in any other table or entity layer AND I manage to filter my other cascading data sources. Something that used to be impossible.
The other advantage is that, because we've set up our actions so that the data records are filtered, it doesn't show up, either on the map rendering or even in a Table or List Widget. There's no big highlight.


Of course, you have to bear in mind that this technique has its limits:

  • Even if there aren't any lines highlighted in blue or Highlight points in neon yellow, you're still selecting data, so if you make a selection by hand in addition, or click on an item, the widget can quickly find itself no longer knowing who the source of the selection is. For optimum use, remember to click on ‘Delete selection’ if you wish to make another type of selection, to avoid conflicts.

 

  • Let's say you want to offer a view of the contents of the Transactions table. You integrate a Table widget so that the user can see the contents of the table. Be very careful with this: if you don't set any filter actions, you will only select the transactions in the table that you have filtered (logically). But if you set up a filter action, you have to do so by setting the same source (i.e. transaction & transaction) as the action's trigger and target. Well, by doing this, you're going to bug the filters in the Selection widget, which will no longer be able to be modified without first deleting the current selection.
    Here's what I recommend to get round this little problem: if you want to display tables, maps or other widgets relating to the data source you've used in the Selection tool, duplicate this layer/table for the other widgets. By doing this, you're querying ANOTHER data source (which is actually the same one) and you can set up your filter action to filter the records without bugging the filters in the Selection tool.


I think I've come to the end of this tip, so I hope it's helped you. This solution is really in the ‘do-it-yourself’ category, but at least it has the merit of being able to resolve certain situations.
I'm still hoping that ESRI will one day come up with a solution for this, because I think it's a real shame that in such a powerful GIS tool you can't manage relationships between several data sources by simply using a common ID... something that's been done since the dawn of time in lots of other software.

 

Gone°

more
1 1 331
JeffreyThompson2
MVP Frequent Contributor

A creeping contagion is taking over the ESRI ecosystem. Every update it swallows a little more. Soon, it will devour everything leaving nothing in its wake. The name of this virus is Calcite and it is coming for your CSS. Once Calcite swallows something all your CSS hacks will break as the Shadow DOM and infinite wrappers surround and subsume your target. Calcite will infest everything. We are powerless to stop it. It is different and I am instinctually fearful of change. However, hope is not yet lost, we may not be able to stop Calcite, but we can adapt it. 

(Actually, there are two creeping contagions taking over ESRI, but Components are a problem for next year.) 

As I upgraded to Developer Edition 1.17, I found that the Map Layers Widget was the latest victim of Calcite and my custom font added in the Theme was no longer being respected. The Map Layers Widget occupies a very prominent space in my overall design, so the font change was very noticeable and distracting. And Calcite was blocking my typical CSS targeting attacks. So, I did something unthinkable. Something I hoped I would never have to do. I learned about Calcite and CSS variables.

First, I will show you my solution. Then, I will explain why it works. In the style.scss of my Theme, I added this...

:root {
    --calcite-font-family: Relish Pro Medium,"Avenir Next",Avenir,"Helvetica Neue",sans-serif;
}

The :root CSS selector is the default CSS settings of the page, so altering :root will change everything. Using -- is how you declare or alter a CSS variable. Calcite variables are written like --calcite-variableName, with font-family being the specific variable I am changing. After the colon is a list of fonts that the page will attempt to use in order. I've put my custom font, Relish Pro Medium, at the start of this list making it the default Calcite font for my application. For the rest of the list, I used my browser's Dev Tools to find and copy the Calcite defaults, so if Relish fails for some reason, it will follow the standard Calcite backups.

That's all it took. Fight Calcite with Calcite and change the Calcite variables to better fit your needs.

more
0 3 273
JeffreyThompson2
MVP Frequent Contributor

You turned off updating and deleting in a Feature Layer. You put an Edit Widget in Experience Builder and what's that Delete Button doing there? And it works, too?

Two important questions:

  1. Do you own the data layer?
  2. Are you an Admin on your ArcGIS Online/Enterprise Portal?

If you answered yes, to either of these questions, that's a quirk of the ESRI ecosystem. It's not just limited to Experience Builder. If you own a data layer or you're an Admin, you can always do whatever you want to the data even if it's not allowed for other users. It's on one hand a very sensible and on the other very poor design choice by ESRI. Afterall, if you are an Admin, you may need to delete some bad data maybe even against the will of the data owner, but being an Admin doesn't make you immune from "Oops, wrong button syndrome". Try logging in as some other user and the Delete Button should be gone.

If you're not an Admin or a data owner, contact ESRI Support. Something is very wrong.

Edit: Here's an official quote about this issue from the JavaScript API documentation.

Authenticated users that are layer owners, administrators or users with full editing privileges will have their elevated user privileges applied in regards to editing behavior and data access. This mimics the behavior available in Map Viewer. To opt out, set esriConfig.userPrivilegesApplied to false.

Note that last line. If you are on Developer Edition, there is a way to opt out of your elevated powers.

more
3 4 431
JeffreyThompson2
MVP Frequent Contributor

Last week, I traveled to the ESRI Developer and Technology Summit in Palm Springs, California. I learned/re-learned/experienced a lot of stuff between getting off the plane to the airport bar on the way back. Here are my notes. Some of them are about Experience Builder, some are more general web development stuff, some are about other ESRI products and some are about Palm Springs and the conference itself. This is just going to be a bunch of one liners and don't expect me to elaborate in the comments. I don't have many details on much of this stuff myself. Ordinarily I try to cite my sources on this blog, but for practical and confidentiality reasons, I'm keeping stuff anonymous this time. There were a number of improvements I spoke to ESRI staff about. I'll be tagging these with YCTML (you can thank me later), so you know I am solely and personally responsible for making this stuff happen when and if it does. Unless you don't like this stuff in which case I really had nothing to do with any of it. 

I can't do a post like this without showing my stupid face, so here you go. I'm on the right. My new bestie @SimonSchütte_ct is on the left. The guy in the middle is Jack "What the Internet Would Name a Volcano" Dangermond.

PXL_20250311_014822731.MP-ANIMATION.gif 

Experience Builder Stuff

  • I successfully convinced with a rigorous intellectual argument the Build Team that the Clear Map Highlighting Button is in a very bad place, YCTML.
  • I successfully emotionally manipulated the Build Team into getting the new Turn On/Off All Layers Buttons to respect the customization in the Map Layers Widget. YCTML, we're getting native support for thematic groups.
  • If you want to allow your users to print an entire Page, for say creating a custom report, the Button Widget can link to Print Preview.
  • Windows can be reused multiple times throughout an application and called from any Page.
  • For best results, design based on multiples of 16px.
  • Place a Column Widget inside a Sidebar Widget and add some Padding for a neat floaty effect.
  • Having trouble navigating around a complicated layout? Use these carrot things at the bottom of the Builder.JeffreyThompson2_0-1742399901364.png

     

  • Need to add an npm package to a Custom Widget? Create a package.json within the file structure of the Widget and call npm i on that folder.
  • Don't change the version number when upgrading a Custom Widget to a new version of Experience Builder.
  • Stop and restart the client server when first creating a new Custom Widget.
  • The Python API is capable of transferring an Experience Builder project between Portals.
    • It can handle remapping of Webmaps and Datasources.
    • But, as of now, it will break if you have any Custom Widgets.

General Web Stuff

  • Plan before you build.
  • User Testing
    • Make a scenario for your end-users to test. Write them a story. Give them a character. Dress in Elizabethan costume. Ok, maybe not that last one.
    • It doesn't take a lot of testing to find most problems.
      • If a user can successfully make the first click on a task, they will complete the task 86% of the time.
      • Five test users can find 80% of usability issues.
    • My notes say "question your end-user's goals." I'm pretty sure that means ask them what they want to accomplish, not belittle their worthless dreams, but you do you.
    • Watch and take notes as your users test stuff, but resist the urge to tell them how to do stuff.
      • If you can find a sneaky way to watch them work without telling them you made the app, even better.
      • Assure your users that you are testing the dumb application, not their dumb selves.
    • Classify your problems based on severity, not frequency and assume any issue will be worse on the live application than in testing.
  • Some types of applications, like how to get help in an emergency, can instantly go from zero users to thousands. Make sure your servers can handle that kind of jump.
  • Do you have a design with a list next to a map? (Something similar to the JewleryBox Template in Experience Builder.) That design doesn't work on a phone. Instead use a "two-page" list on one page, map on the other layout for phones.
  • ESRI Webmaps will not pass accessibility testing, at least for now, but if you can convey the same information some other way, like a list, then the map becomes more "decorative, than functional."

Other ESRI Stuff

  • Coming Soon to (or maybe already in) an ArcGIS Pro Near You
    • Create a Utility Network from a Feature Class.
    • Automatically turn a Geometric Network into a Utility Network.
    • Pre-trained AI models that tell you why they class stuff the way they did.
    • AI Arcade Coding Assistant.
    • Estimate Time To Event will tell you the exact day your bridge will fall down.
    • DIY-AI extensions to the AI Assistant.
  • ArcGIS Online/Enterprise
    • I talked to several members of the Online staff about building a button to send an email to the members of a Group. I could put YCTML here, but it seems like they have been asked so many times that I was a few seconds away from a punch to the face.
    • Did you run a Credit report on your ArcGIS Online organization? Was your biggest user No Username? That's storage.
      • They say they are going to make the Credit Reports better, in a vague nebulus way.
    • ArcGIS Enterprise 11.6 will be released...never. The version after 11.5 will be called Enterprise 12.0.
      • The main reason for the new version number is the retirement of all the JavaScript 3.X stuff, like WebAppBuilder.
  • ArcGIS JavaScript API
    • Take a look at this Demo to see how to make a shapefile into a FeatureLayer.
    • I spoke with one staff member who said the saveAs() function can be used to create a new Portal Item from a client-side FeatureLayer.
      • But the documentation disagrees.
      • I am following up on email about this. Update: I have confirmation that the documentation is correct. I have opened an Enhancement request and dropped a new Idea.
      • I guess, YCTML, if this isn't supported and it spirals into an actual function.
      • If it is a function, I may take a stab at a FeatureLayer Maker Widget.
    • The hitTest() function and the selectFeatures() function built on top of it will allow for developers to set the search radius rather than its current fixed 6px, YCTML.
    • I overheard some staff members discussing building an Interactive Legend Widget. Assuming those guys build it, expect it to flow into Experience Builder eventually. Which leads me to...
  • Instant Apps
    • Instant Apps have their own Component Library out on a Public GitHub Repo that you can totally just use if you want.
      • That Interactive Legend Component looks fun.
      • The Instant Apps Team can't think of a reason you couldn't hack one of their Components into Experience Builder.
      • I think I may have to try that.
    • There is no Developer Edition for Instant Apps or Dashboards.
      • But if you ask the Instant Apps Team nicely, they will send you the code for any Instant App you want.
      • And if it becomes a thing, YCTML.
  • ArcGIS Solutions

Other Stuff

  • Palm Springs Tramway
    • When I stepped onto the Tram, it was 80 degrees in the desert.
    • When I stepped off the Tram 10 minutes later, it was 40 degrees with a foot of snow on the ground.
    • Closest thing to a closet to Narnia I have ever experienced.
    • No matter what Van Halen says, do not jump on the gondola.
  • Chew thoroughly before swallowing.
  • Congratulations to @RasterFan98 for getting the Custom Widgets Group into the Plenary Session.
  • If you ask the ESRI Events staff for a telescope to view the lunar eclipse during the Summit Party a few days before the conference, they will be disappointed they could not make it happen.
  • I attempted to fill my time attending every possible talk I could.
    • In retrospect, I wish I blocked out at least an hour a day to spend on the Expo floor, as most of the things I learned and accomplished happened outside of the tech sessions.
    • And many of the talks were also recorded.
  • If you uncover a massive conspiracy that aligns with your values and goals, is it your moral duty to still expose the truth?
  • NATO is investigating reports by German Intelligence that the Nord Stream Pipeline was sabotaged by ....
    • NATO apparently thinks they can show a lolz so random spot in the Baltic Sea to a room full of map nerds and no one would know what it was about.
  • ESRI Events staff makes some pretty good food.
    • Thursday's lunch was probably the best meal I have ever had in a high volume cooking situation.
    • If someone can get me the recipe for that quinoa salad, I might eat some quinoa again. 
  • Why didn't you Dooooooooooodge?
  • Mapillary - Strap a camera on something and make your own version of Google StreetView, for free, according to my source.
  • No one likes the sound of their own voice.
  • @KenField gets to go to DevSummit, but not @JohnMNelson. Is it because Ken is a public figure?
  • There is apparently a set music playlist that ESRI uses before the Plenary/Keynote Session everyday. Inexplicably, Maps by the Yeah Yeah Yeahs is not on it.
  • Palm Springs is a pretty town. I see why the celebrities used to hang out there. Here's a sunrise rainbow on a mountain from the Conference Center.eedcc675-441f-4ba4-8af0-e4dca527287c~1.jpg
  • The Palm Springs Airport is mostly outdoors.
    • Neat when I swiftly walked through it on a perfect weather day.
    • Not so neat when I had to wait there for three hours in very bright sun with a strong, chilly wind.
    • Considering the length and intensity of the Palm Springs summer, I think there are probably more not so neat than neat days for this concept.
  • The Big Kahuna Burger just sounds better with cheese. 
  • The face of a vicious barbarian.JeffreyThompson2_0-1742482907472.png

     

more
15 1 659
JeffreyThompson2
MVP Frequent Contributor

I made a map. Do you want to see it?

JeffreyThompson2_0-1741103835472.png

It's kind of pretty in a way, like a Jackson Pollock painting, and it's almost as informative. There's just too much stuff here. If only, I could group my data into logical categories that my end-users could easily turn on and off as they wanted. But that's just a dream...or is it? I don't actually know. I'm writing this as I go, but the February 2025 ArcGIS Online update should have made this dream come true. Let's find out together.

The first thing I will do is turn off the visibility for all the layers in my map, except Single People And Cheese. Why Single People And Cheese? Because someone at ESRI made a data layer about Single People And Cheese and how else can I tell you that exists? It's one of many delights you can find on this testing server, I will be getting my data from. I've grabbed basically every layer on that server that falls into these categories: Demographics, Natural Disasters, Animals and Cryptids, and I will try to make Experience Builder recognize these categories.

In Experience Builder, I am starting with the Pocket Template and I've added my webmap to the Map Widget. This Template has a big Placeholder Widget on the right side of the screen where I've added an Accordion Widget. If I was using a smaller number of categories, I would probably use a Section or Grid Widget instead, but somewhere around three or four an Accordion starts to make more sense.

And into the Accordion, I'll add a Map Layers Widget. I'll rename this Widget to Demographics. Then, I'll Customize Layers. I'll use the handy new layer toggle to turn off all the layers at once. Then, I'll turn back on just the demographic related data. For the other options in this Widget the most important thing is: Enable Layer Batch Options.

JeffreyThompson2_0-1741115640686.png

Hey, before we go any farther, let's take a moment to test this out.

JeffreyThompson2_1-1741115921454.png

In Preview Mode, I click on the lines and triangle and Turn On All Layers...

JeffreyThompson2_2-1741115956138.png

Oh, no. Pollock is back. Sorry folks, this isn't going to work. I really thought it would. I wouldn't have put so many layers into the map if I didn't think it would work.

Hey Dev Team, restrict the on/off all layers function to the Customized Layers within a Map Layers Widget and we would have something very great here.

Update Live From DevSummit: I told @Jianxia that this made me cry and she said this is not the intended behavior, it is now a priority fix that will be taken care of in the next update, or maybe even sooner...

more
6 2 382
JeffreyThompson2
MVP Frequent Contributor

Your company doesn't want anyone downloading your data and you've got a lot of data in your Experience Builder project, you stopped counting at fifty layers. Do you have to go through every one of them one-by-one and turn off data exports? If you're on ArcGIS Online, not anymore. Any other form of Experience Builder? Put on some music, you'll be clicking for awhile. There's a new magic button in Experience Builder and ESRI loves to hide them, so here's where to look.

  1. Click on the Data Button in the Left Side Panel. It looks like a stack of pancakes.
  2. Now click the gear by Export Settings.JeffreyThompson2_0-1740776906196.png

     

  3. Now, click the other gear next to Layers.
  4. Next, click the Allow Export Switch.
  5. Finally, click Apply. If you don't Apply, it doesn't count.JeffreyThompson2_1-1740777132594.png

If you only want to turn off certain kinds of exports, you can use the checkboxes by the export types. Again, remember to Apply. If you want these options at a layer-by-layer basis, use the gears and switches by the layer names.

more
2 1 294
JeffreyThompson2
MVP Frequent Contributor

I go away for one day and everything is different... Yesterday, was ArcGIS Online update day and now we have a new version of Experience Builder to play with. This is Experience Builder 17 and its been going through big changes all through it's teens. Experience Builder is really becoming a mature program, which is good, because daddy WebAppBuilder is getting old and wants to retire and Experience Builder is going to have to start taking over the family business soon. We are going to talk about what's in this update soon, but first we need to talk about what's not in it. Batch editing has been pushed back again for another update, hopefully we finally get it next time.

This is the third edition of this series, but if you're new here's how this goes:

  • I read the official What's New in Experience Builder Blog post.
  • I maybe try a few things for a few minutes.
  • I attempt to translate the What's New page from developer to English.
  • If I don't think something is going to be very important to many people, I leave it out of my notes.
  • I might make some guesses how the new stuff can be used.
  • You don't get mad at me if you can't actually do those things.

Map Viewer Updates

Technically not Experience Builder so I make this quick, but the ArcGIS Online Map Viewer has a couple new tricks that should translate into Experience Builder: Animated Symbols, Multi-dimensional imagery popups, improved attachment pop-ups and Display Filters. 

Action Updates

  • Select - You just ran a query and would like the results selected. There's an action for that now.
  • Show Pop-up - Make a Pop-up pop up from another Widget.
  • Statistics - The statistics are smarter about what they calculate and don't try to do math with OBJECTIDs.

Builder

If you Duplicate a Page, View, Section or Window, all the Widgets within should be copied exactly with all their settings configured.

Data Sources

  • You create a List Widget and spend an hour setting it up just the way you want it, then you realize it should show Selected Features instead of the Default View. Now, you can switch to the other View without losing all that work.
  • Dynamic Imagery without fields is now supported.
  • The exports should be smarter about what fields to export.

Export Options

  • These exist now. That's a big improvement.
  • You can choose what formats are allowed for exports. Use this to prevent clutter on your Portal or to prevent unsufficitated users from wondering who JSON is and why he doesn't have an a in his name.
  • You can turn the exports on/off for all layers at once. I know this was a major pain point for some users. It took me awhile to find the option, but it exists. There will probably be a follow up post with how to find this magic button.

Layer Selector Component

They are really underselling one of the most powerful and interesting features in this update. This is a set of options that appears in many Widgets, mostly in the Build Mode, that allows people to do stuff to every layer at once. Highly requested options to instantly expand/collapse Layer Groups and turn on/off multiple layers at once. We have previously discussed Five Ways To Handle Groups of Layers. The first one involved using multiple Map Layers Widgets. I hope that that method with this new function will result in the best way to manage Layer Groups without a Custom Widget. If it works, there will be a link here within the next few weeks. And if it doesn't work, there will be a link here.

Sharing

Open up your phone camera and scan a QR code to see your in-progress application on your phone. Potentially a faster, easier and more accurate way of seeing what your application really looks like than this developer's trick.

Templates

New templates called Poster, Booth, FAQ, Catalog and Prism.

Theme

By default the keyboard focus color is very similar to the Primary App color. For accessibility reasons, it would probably be best to make them very different. This tool by Adobe is very good for making color themes and checking for accessibility. I found the setting to change this, but I didn't actually see it do anything in my testing app. 

Updating

I feel like this quote requires some clarification from the product team.

In the builder, widgets now update to the latest available version when you open at least one of their type of widget. Opening a widget means switching to the page or view that contains the widget. When you open a specific type of widget in the builder, all widgets of that type upgrade simultaneously. For example opening one Map widget updates all Map widgets in an app.

Do Widgets not update when ArcGIS Online is updated? Is it possible to run old versions of a Widget if an update breaks something? Do deployed apps not change with an update?

New Widgets

  • Flow Row - Old Row has got to go. New Row has better flow...I don't know...how to make this all rhyme. It's a new Layout Widget. In my brief testing, this version of the Row Widget is just easier to work with than the original flavor. Maybe there's enough room in this town for both of them, but this one is probably the one you should reach for first.
  • Oriented Imagery Viewer - Wait, this is new? Didn't we already have this? Yes, we did. Old Oriented Imagery Viewer is now Classic Oriented Imagery Viewer. Why do we have two? I don't really know. I think this new Widget does more stuff? I assume there is some technical issue that the old version couldn't handle, so they rewrote it by machine with new technology and now I understand the problem you can see. Oh-a-oh, ESRI didn't kill the old version, so your apps would keep working.
  • Processing Templates - A Widget for applying raster calculations to an imagery layer. Does this cost credits? I don't see anything saying it costs credits. Sure looks like something that costs credits. ESRI has been doing some shady stuff lately around credits, like ModelBuilder in the Online Map Viewer charging by time it takes to make a model. The Raster Function Editor looks a lot like ModelBuilder, too.

Updated Widgets

  • Add Data - End users can resize it, sort their searches by relevance and upload up to 30 files at once.
  • Analysis - If a parameter is not required, you can hide it from the end user. New tools: Tabulate Area and Zonal Geometry As Table. New layer types supported: Map Service Layers and Subtype Group Layers.
  • Chart - Control your axis spacing better and make their labels easier to read. The No Data Message is now editable.
  • Directions - Add stops and barriers to your route. The Optimize Order option solves the traveling salesman problem for you to make good routes. Choose between metric and freedom units. Point layers can be used as search sources. Limit your search results to the map area or a country.
  • Draw - Use Tooltips and press Tab to precisely control your drawings. Good luck training your users to actually use this feature, but it exists. The draw tools optionally have snapping. Who's option? Both builders and end-users. (Maybe make snapping an option for the Measurement Widget as well, ESRI, as it appears to be a huge memory drain.) Make a grid appear on the map and snap to it. A few new freedom unit measurement options.
  • Edit - Also, gets the grid and snapping options above. Warns you if you try to quit without saving.
  • Elevation Profile - Use one or more line segments at a time to make your profile. Matches to the map highlight color. Selecting features actually selects them.
  • Embed - Autoplay YouTube. Very important for effective Rickrolls. HTML in the Embed Widget is in the app theme font if anyone still knows how to write HTML. Didn't they outlaw it ten years ago?
  • Feature Info - Has a Clear Selection button.
  • List - Flow template based on the Flow Row, oh no, let's go. Cool, Bro. Don't ya know, Fargo was set almost entirely in Minnesota except for one scene and yet it defines North Dakotan culture in the popular perception.
  • Map - Decide how far in and out the end user can zoom. The Zoom To Action of the Search Widget should be smarter about how far to zoom with a Locator Source.
  • Map Layers - In addition to the stuff in the Layer Selector Component section, end users can now set the visibility range of map layers, tables can also appear in this Widget and run-time generated layers can be excluded from this Widget. Additionally, the transparency controller is now a slider offering more control and better visual feedback to the end user
  • Near Me - The changes were big enough to warrant its own What's New post. Export your results to a PDF. Save your search inputs to a layer if you want.
  • Print - Print dynamically generated stuff.
  • Search - Builders can turn off the user's option to turn off search sources. Do you ever search for stuff and the World Geocoding Service helpfully suggests something from the wrong continent in a language you can't even recognize? Try Local Searches. The closer to the map center, the higher on the result list. Really great if you are near the Bight of Benin.  If Local Searches aren't restrictive enough, you can completely exclude results that aren't in the map area.
  • Table - CRUDy Attachments. For those of you that don't speak programmer, CRUD is an acronym for Create, Read, Update, and Delete.
  • Text - You can put an image inside a Text Widget, now. So, this hack is now Enterprise only.

Alright, that's it for this update. See you in the summer for Batch Editing and Arcade.

more
7 1 625
189 Subscribers