QuerySimple & HelperSimple: High-Performance Search and Spatial Query for ExB

1144
16
03-19-2026 10:15 AM
Labels (2)
adamsimple
Regular Contributor

My team is in the middle of transitioning King County's main public-facing GIS application, iMap, to ArcGIS Experience Builder. After exploring everything Esri offered out of the box, we quickly realized it would not deliver the same user experience as Robert Scheitlin's (@RobertScheitlin__GISP) Enhanced Search widget in Web AppBuilder. With our tech lead out for three weeks, I had a window. I decided to use it.

I started with Esri's Query widget as a base, took design cues from Robert's Enhanced Search, and used Vector Coding to go from concept to what you see here. My team has tested these widgets extensively, with a handful of enhancement requests in the backlog.

QuerySimple is designed to explain itself so users can work confidently without reading documentation. Every mode, every control, and every state has a plain-language description of what it does and why something may not be available. For those familiar with the old Web AppBuilder, the advanced query and draw functions lived separately. I brought them together under one roof in the Spatial tab. While I am biased, I think the result is fairly intuitive.

I have been building this for what feels like an eternity. There are a lot of little things baked in that you will discover as you use it. Every time I said "I'd prefer this to be done this way," I made it a configurable item, because not everyone likes it my way. The features listed here are the highlights, but the details are in the demo.

Screenshot-2026-03-19-100014

Try It Live

https://exb-sample.mapsimple.org
https://exb-sample.mapsimple.org/#pin=2223059013
https://exb-sample.mapsimple.org/#major=222305

When you open the demo, look at the layer list. The magnifying glass icon is a persistent result layer controlled by the layer list, like any other operational layer. The funnel icon is a widget-managed graphics layer that appears and disappears based on the widget's state. Both are live in the demo, so you can see the difference in action.

Screenshot 2026-03-19 100323.png


HelperSimple

ExB widgets only exist in the DOM when they are open. A collapsed widget is not listening. HelperSimple solves this by running independently of widget state, continuously monitoring the URL, and opening QuerySimple and firing the appropriate query when a matching parameter is detected.

  • Always mounted and always listening
  • Maps ShortIds (e.g., pin) to technical field names (e.g., PROP_KEY_NUM)
  • Hash fragment (#) support for page-reload-free navigation
  • Auto-generated info button per layer: when a ShortId is configured, a help icon automatically appears next to the layer title, showing users the exact URL format for both hash and query string deep links

Screenshot 2026-03-19 093420.png


QuerySimple

  • Hierarchical two-dropdown UI: group 30+ queries without list fatigue
  • Typeahead and suggest: configurable per query
  • Results mode control with contextual helper text: each mode (New, Add, Remove) displays a plain-language description of its behavior so users understand the outcome before executing
  • Execute on Enter with input-driven validation
  • Dynamic zoom control with user override at runtime
  • High-volume result loading: full result set at once, no lazy-loading
  • Label point centering for irregular polygons
  • Duplicate button: clone queries with all settings preserved
  • Mobile per-breakpoint configuration overrides
  • Result layer modes: widget-managed graphics layer or persistent layer list layer
  • Selection styling: color, opacity, outline, marker style per query
  • Multi-source results support: parcels, address points, wetlands, school districts, and more can all coexist in a single result set. Open Table opens all source tables independently. Export zips each data source separately, preserving the original schema per layer.

Screenshot 2026-03-19 093631.png


Spatial Query Tab

  • Two modes with plain-language descriptions: Operations and Draw each display a description of their purpose when selected
  • Smart tab default: if no results are loaded when the Spatial tab is opened, the widget automatically defaults to Draw mode
  • Contextual disabled state messaging: when Operations mode cannot execute, a plain-language callout explains why and directs the user to the correct action
  • Operations mode: use results as source with real-time geodesic buffer preview on the map as distance changes
  • Draw mode: 7 tools, including freehand line and polygon, geometries accumulate
  • Multi-target layer selection: run a single spatial operation against multiple target layers simultaneously, and the results from all layers come back together in a single execution
  • 7 spatial relationships with context-aware warnings: when a selected relationship combined with the current geometry or buffer is likely to return zero results, an amber warning explains why before execution
  • Spatial relationship help: most relationships include a built-in visual diagram showing geometry type compatibility, plus a plain-language description
  • Spatial-only query layers: configure layers for spatial operations without exposing them in the attribute search dropdown
  • Results mode control (New/Add/Remove) available on the Spatial tab
  • Configurable draw symbol color and buffer preview color

Screenshot 2026-03-19 094233.png

Screenshot 2026-03-19 094032.png

Screenshot 2026-03-19 094331.png

Screenshot 2026-03-19 093827.png


Performance

  • 93.4% query latency reduction via Universal SQL Optimizer (21.1s to 1.4s on 2M+ record layer)
  • 93% memory reduction per query

Developer

  • Glass Box debug logging via URL: ?debug=all or specific flags
  • Independent versioning and config migration

GitHub: https://github.com/MapSimple-Org/ExB-Simple-Public
Docs: https://mapsimple.org/samples/querysimple-helpersimple-widgets/

ExB Developer Edition 1.19.0+. Open source, free to use.

16 Replies
adamsimple
Regular Contributor

With ExB 1.20 released, I am working through addressing changes between 1.19 and 1.20. I should have a new release available early next week. 

ncramer11
Occasional Contributor

Hello Adam! This looks like a powerful upgrade of the standard Query widget. Can you confirm if a release for ExB 1.20 is available? Or does the 1.19+ version work?

0 Kudos
adamsimple
Regular Contributor

Just released a 1.20 version. 

0 Kudos
RyanKelso
Frequent Contributor

Hi Adam. One of your friendly neighbors to the south in Lewis County here, I'm working on rebuilding several of our GIS applications with Experience Builder. What to do about replacing the functionality of Enhanced Search is something I have not sorted out yet, and it's been concerning. I can't even tell you how excited I am about your MapSimple widgets. Thank you for this!

0 Kudos
adamsimple
Regular Contributor

You’re welcome! We are all in this together, right? If you have feedback or suggestions, I am more than happy to try and accommodate. I am trying to give this widget maximum flexibility so people aren’t locked in to the way we like doing things at King County. 

0 Kudos
adamsimple
Regular Contributor

Update: QuerySimple & HelperSimple now run on Experience Builder 1.20 (r028.122)

The widgets have been rebuilt for Experience Builder 1.20, and this release also brings the largest QuerySimple feature update to date. If you have been waiting on 1.20 support, this is it.

Experience Builder 1.20 / JSAPI 5.0 support

The full suite now runs natively on ExB 1.20 with ArcGIS Maps SDK for JavaScript 5.0.4, Calcite 5.0, React 19, and Node.js 24 (tested on 24.16.0). This was a deep migration: DataRecord.getId() now returns a number, the __esri ambient namespace was replaced with explicit @ArcGIS/core ESM imports across the codebase, Calcite 5.0 event and input changes were applied throughout, and JSAPI 5.0 API swaps (for example geometryEngine.union() to unionOperator.executeMany()) were made end to end. All type-only changes, no behavior loss.

Note: this build targets ExB 1.20 and is not backward compatible with 1.19. If you are still on 1.19, the previous release on the Releases page covers you.

New in r028 (the headline features)

• Native map identify. Query results are now stored as real client-side feature layers instead of plain graphics. Visually nothing changes, but you can click any result on the map to open its popup, and clicking scrolls to and flashes the matching result card. A new setting toggles the flash. Results also participate in the native legend and layer list.

• Unified field-table rendering. The Customize display (pick your fields, show them as a table) now renders through one shared engine across the result card, the on-map popup, and the card-click popup, so they are finally identical: same fields, same order, formatted dates and numbers, decoded domains, same striped table. You can also set a per-field display label (alias) in settings, so a field like OWNER_NM can show as "Owner Name" without touching the data.

• Spatial mixed-geometry fix. An un-buffered spatial query with mixed input shapes (for example a polygon plus a line) previously kept only the highest-dimension shape and silently dropped the rest. Every input shape is now queried and the matches combined. If you used un-buffered mixed-shape spatial queries, re-run them.

• Sturdier Spatial tab. Drawn shapes survive switching between Draw and Operations modes, a new Draw-mode option folds current results into the draw input, and target-layer labels now match what you configured.

• Truncation notice. When a query hits a layer's max record count, an amber notice on the results panel names the actual matching total instead of silently looking complete.

Also added on the way to 1.20 (r027)

• Unified markdown template engine shared by QuerySimple and FeedSimple: {{field | filter}} syntax with 16 chainable pipe filters, markdown formatting, pipe-delimited tables, a visual Table Builder in settings, and a one-click migration button from the old {FIELD} syntax.

• Security hardening: HTML escaping on substituted values, dangerous URL scheme blocking (javascript:, data:, vbscript:), and SQL field-name validation in typeahead.

• Output data source conflict detection with a one-click "Regenerate IDs" fix for copy-pasted configs.

• Data source rebinding when a layer is swapped in the web map.

• Configurable widget header and a configurable subset of spatial relationships in the Spatial tab.

Get it

Latest release and per-widget downloads: https://github.com/MapSimple-Org/ExB-Simple-Public/releases/tag/QS-r028.122-FS-r005.018

Copy query-simple, helper-simple, and shared-code into your-extensions/widgets, then rebuild.

Tested on: Experience Builder 1.20.0, ArcGIS Maps SDK for JavaScript 5.0.4, Calcite 5.0.2, React 19, Node.js 24.16.0.

Feedback and issues welcome in this thread.

James_Kellough
Occasional Contributor

Thanks for your hard work and community contributions Adam!

I was recently asked to investigate options that reproduce the functionality of the query tool from ArcIMS (yes, ArcIMS!) in an updated ExB app. The specific functionality my users wish to see is features flash or highlight when mousing over the results in the returned results table. Your QuerySimple widget is very similar with its hover preview pin. This is great but, in addition to that, I would like to see the feature also highlight and differentiate from the surrounding features. 

Is this functionality you have considered adding to a future release or something a non-developer like myself could do to extend the widget? 

James_Kellough_0-1780589559983.png

 

0 Kudos
adamsimple
Regular Contributor

Hey, ArcIMS was a good product, and it's definitely a blast for the past. I don't see why this couldn't be a configurable option. Would you imagine the choice being the drop pin or this highlight on hover? The tighter I can get the spec, the faster it is to implement and the closer it is to your desired outcome. 

0 Kudos
James_Kellough
Occasional Contributor

Thanks for the quick replay and consideration. 

The choice between the two would be cool with both being more advantageous than the other in particular use cases. In my use case, transmission lines with multiple sections (spans between angle towers), some that are very long and others that are very short relative to the total line length, highlighting the linear feature on hover seems the best option and would definitely help distinguish the section from the rest of the line. 

0 Kudos