|
BLOG
|
Search Custom Widget This widget is a customized version of Esri's out-of-the-box Search widget for ArcGIS Experience Builder. It was one of the first widgets I built, and for a long time I had five separate hardcoded copies of it, each one set up for a specific set of City of Grand Junction services and behaviors. That worked for us, but it was a lot to maintain and it was not something anyone else could really pick up and use. I recently went back and cleaned it up. All five variants are now merged into one widget, and everything that used to be hardcoded in widget.tsx, especially the service URLs, has been moved into the settings panel. You point it at your own feature layers and geocoders in the settings instead of editing the code. I wanted to make sure it was friendly for the community to set up with their own services. It still does everything the stock Search widget does, and adds multi-source search, a few different popup behaviors, full control over the map popup, and the ability to move a whole configuration between apps with XML export and import. https://github.com/brianmcleer/search-custom-widget Note: This is a modified version of Esri's OOTB Search widget, shared as a derivative work under the Apache License 2.0 with attribution to Esri. See the LICENSE and NOTICE files in the repo. Note: Built and tested on Developer Edition 1.19 and 1.20 (React 19). EB 1.18 and earlier are not supported. Note: No separate npm install needed. The widget only uses the ArcGIS Maps SDK and Experience Builder modules that EB already provides, so the standard client install covers it. What Can This Widget Do? Original capabilities (from the OOTB Search widget): Search box with suggestions, auto-select, and a configurable result count. Multiple search sources, with an optional "All" source to search them together. Search within the current map view, use-my-location, and the usual ArcGIS Search options. Zoom to a result and show its popup. Enhanced capabilities in this version (what it adds beyond the stock Search widget): Everything below is configured from the settings panel, no code changes needed. Settings-driven sources. Add feature layer sources, geocoder sources, and app data source sources right in the panel. The stock widget needs its sources wired in by an app author, but here you build them in settings, and you can reorder or remove them. URLs out of the code. Every service URL is entered in settings instead of being hardcoded in widget.tsx, so the widget works against any organization's services out of the box. Per-source control. For each source you can set the service URL or data source, the search fields, the display field, suggestions on or off, exact match, a filter (where clause), the result symbol and location type, the zoom scale, and even a per-source popup. Map and search behavior in settings. Choose the map widget, show an "All" option to search every source at once, set a default source, set minimum characters to suggest, max results and max suggestions, auto-select the first result, limit to the current map view, show "Use current location," and set a prefix, suffix, and placeholder text. Popup behaviors the stock widget does not offer. Pick per instance: None (zoom only), use the layer's own popup from the web map, a generated Arcade auto-field popup that lists every field for you, or a spatial lookup popup that intersects the result with context layers and builds custom HTML. Full map popup display control. Dock the popup and set its position, auto-dock on small screens, show the dock button, make it collapsible, highlight the selected feature, open automatically on select, set the number of inline actions, and choose which parts of the popup are visible (close button, collapse button, feature navigation, heading, action bar, and loading spinner). Layer popup builder (Arcade). Set the popup title template, then either auto-generate the Arcade expression from your settings, with an excluded-fields list and a read-only preview of what gets generated, or write your own custom Arcade expression. Spatial lookup rules. Add one or more rules that intersect the result with a context layer and output either an inside and outside message or a field list, with URL, date, and coded-value formatting, a section heading, and a no-result message. URL formatting rules. Field values that match a pattern become clickable links in the popup, with a match type, pattern, base URL, and link text. These feed both the Arcade popup and the spatial lookup field lists. Result navigation choice. Zoom to a set scale or fit to the result's extent, zoom to the result on select, and an optional zoom animation with a duration. Recent searches. The widget remembers recent search terms and shows them in a dropdown when you click into an empty search box, similar to how most search bars work. It is per widget, you can set how many entries to keep, and it can be turned off. Appearance and placement. Set the search bar style, size, and accent color, and choose where the search box appears and its position on the map. XML export and import. Move a whole configuration between apps, orgs, or environments without re-keying it. Accessibility updates across the settings and runtime. Feedback If you have any questions, ideas, or feedback, please feel free to reach out and I can work to make the widget more complete as needed. Thank you, and I hope it is useful for your own Experience Builder apps. Changelog 06/12/2026: Posted to GitHub. Cleaned up the settings panel to be much more user friendly. Migrated the hardcoded service URLs out of widget.tsx so they can be entered in settings. Merged the five original hardcoded Search variants into one settings-driven widget with XML export and import.
... View more
|
1
|
0
|
112
|
|
BLOG
|
Map Layers Custom widget A modified version of the Experience Builder Map Layers widget. It does everything the standard widget does and adds the features below. This was migrated from a Custom Widgets Question where I had the original version. GitHub: https://github.com/brianmcleer/map-layers-custom-widget Features added over the standard Map Layers widget Auto-include new sub-layers: a designated group's newly added sub-layers appear in deployed apps without editing settings or redeploying. Layer focus: isolate a single layer or map-service sub-layer and hide the rest, with an explicit exit. Visible-layer count badge. Collapsible layer list, with an optional start-collapsed state. Add data: add a layer by URL (ArcGIS service, vector tile, WMS, WMTS, GeoJSON, CSV, KML) or local file (GeoJSON, CSV, KML, zipped shapefile). Master opacity: one slider sets opacity for all layers. Basemap switcher using the organization's basemaps. Legend panel. Saved views: save layer-visibility sets and export or import them as JSON. Search match count that includes map-service sub-layers, plus a visible-only filter. Batch tools: turn all on or off, reset visibility, zoom to visible, export map image, expand or collapse all. Per-layer tools: flash, copy URL, refresh, layer details, move to top or bottom, move out of group. Each feature can be turned on or off in the widget settings. Requirements Experience Builder Developer Edition 1.19 or 1.20 (React 19). EB 1.18 and earlier are not supported. Install Download the release zip and extract it. Place the map-layers-custom folder so its manifest.json is directly inside client/your-extensions/widgets/map-layers-custom/. Run npm install in the client folder. Restart the client and hard-refresh the builder. Full install steps and troubleshooting are in the README on GitHub.
... View more
Wednesday
|
5
|
0
|
167
|
|
BLOG
|
6/9/26: Cleaned up the packaging based on standardization ideas from @SunshineLuke90 blog post, so the required modules now install automatically with the standard client install. No more need to run separate npm install commands for the shapefile dependencies. Thanks to everyone who has downloaded, tested, and sent feedback. Bug Fixes: Fix bug where a polygon buffer would reload as a circle around the polygon center instead of following the polygon edges (happens on page refresh, or when drawing before loading previous drawings). Fix bug where buffers on complex or self-overlapping shapes, including shapes with crossing segments, produced odd results, whether drawn or copied from a layer. Fix bug where buffers would not merge when features were copied from a map layer and merged before buffering. Fix bug where using a buffer as a selection returned the wrong areas, which also cleans up selections sent to Mailing Labels and Identify. Fix bug where Identify was not disabled when the Copy To Draw option was turned off. Fix bug where segment labels were lost after reloading drawings from a previous session. Fix bug where segment labels went away when clicking a drawing on the map or in the My Drawings list. Fix bug where measurement and segment labels grouped in the middle of a graphic after resizing or reloading. Labels now stay along their segments. Fix bug where duplicate, overlapping labels showed up while dragging a drawing. Fix bug where multi-line text did not survive a GeoJSON export and re-import. Fix several memory leaks from event listeners that were not being cleaned up. Note: drawings saved before these fixes may have old data and are best redrawn. New drawings will reload fine.
... View more
|
2
|
0
|
296
|
|
BLOG
|
@KeyHunter currently no, I recommend only use for desktop. When it was developed, mobile/tablet long press was an issue. I can revisit this now that it has been a year and look for a mobile option.
... View more
|
1
|
0
|
253
|
|
BLOG
|
06/08/26: Update thanks to community contributions from @SunshineLuke90 , who reworked the widget around the Calcite Design System. The bell is now a calcite-action with built-in indicator support, the popover and modal use calcite-popover and calcite-dialog respectively, and all the manual positioning math the original widget needed for footer placement is gone since Calcite handles it natively (runtime dropped from around 300 lines to 160). New configurable options came along too: pick any icon from the Calcite UI Icons set, set the popover content width in pixels, choose from 21 logical placement values, and adjust the icon size via Calcite's built-in scale property (small, medium, large). A follow-up round of revisions from SunshineLuke90 also fixed a TextArea overflow when the HTML content area is dragged and resized, and added helptext under the ColorPicker components clarifying that leaving them blank preserves the EB theme defaults.
... View more
a week ago
|
3
|
0
|
45
|
|
DOC
|
@JhonGalindo I have put the repo in GitHub finally. Should have done it a while ago. https://github.com/brianmcleer/mailing-labels-widget
... View more
2 weeks ago
|
0
|
0
|
632
|
|
POST
|
Today (6/4/26) Esri released Portal for ArcGIS Security Patch for 11.5 (maybe other versions). This is a critical patch, but no ArcGIS Trust Center RSS feed notification went out yet. Is there a process that can send out as soon as a security patch is released? These are fairly critical as several security patches have come out over the last few months.
... View more
2 weeks ago
|
2
|
1
|
284
|
|
BLOG
|
06/04/2026: Added package.json and package-lock.json to the widget. This widget has no third-party dependencies, so there is nothing extra to install. Setup is just the standard npm install in your client folder that you are already doing. Thanks to @SunshineLuke90 for the suggestion and for walking through the packaging approach.
... View more
2 weeks ago
|
0
|
0
|
70
|
|
BLOG
|
6/03/26: Added package.json and package-lock.json to the widget. You no longer need to run the manual npm install commands listed at the top of this post. Since the widget lives in your-extensions, Experience Builder installs its dependencies automatically when you run npm install in your client folder, so it is just the standard setup you are already doing. Thanks to @SunshineLuke90 for the suggestion and for walking through the packaging approach.
... View more
2 weeks ago
|
0
|
0
|
468
|
|
BLOG
|
Hello @KeyHunter, thanks for the detailed writeup, that nesting clue is exactly the right thread to pull. The "is duplicated" message comes from the build scanning your-extensions\widgets and finding the same manifest name registered twice, so somewhere there are two copies. A single correctly placed copy can't trip it, which is why a fresh basemap-gallery-custom on its own doesn't fix it: the second copy is still sitting elsewhere. Three places to check, in order: a nested folder at widgets\basemap-gallery-custom\basemap-gallery-custom (the manifest has to be one level up, directly inside basemap-gallery-custom); any leftover folder from your 1.19 build, including an old basemapToggleCustom folder this widget was renamed from; and a stale compiled copy in client\dist\widgets carried over from 1.19. For that last one, stop the client, delete the matching folder under dist\widgets, then npm start again. Your "remove it and nothing shows in the Entrypoint list" symptom is the tell that the copy you kept is nested too deep. I also just standardized this widget and put it on this blog post and GitHub with a README that walks through install placement and this exact error: https://github.com/brianmcleer/basemap-gallery-custom-widget. Grab the v1.0.0 release, drop the folder in so the manifest sits directly inside basemap-gallery-custom, and you should be set. Let me know how it goes.
... View more
2 weeks ago
|
0
|
0
|
52
|
|
DOC
|
06/03/2026: Added package.json so jsPDF installs automatically with the standard "npm install" in the EB client folder. No separate jsPDF install needed.
... View more
2 weeks ago
|
0
|
0
|
885
|
|
BLOG
|
Thanks @SunshineLuke90 . I went ahead and added a package.json and package-lock.json to the widget following your approach, so the dependencies now install automatically when you run the standard npm install in the client folder. No more manual npm install commands needed. I also included the exb-widget keyword and an Apache 2.0 license to line up with the conventions you laid out in your Standardizing Custom Widget Sharing thread. Really appreciate you walking through this, it makes the widget a lot easier for others to pick up and use, and I think the standardization effort is a great direction for the community. I am going to go through all of my widgets and standardize more using this approach.
... View more
2 weeks ago
|
0
|
0
|
336
|
|
BLOG
|
6/03/26: Enhancements (1.20 version only) Add support to launch and open Mailing Labels or Property Report when they are nested in accordion widget (Thank you @KeyHunter for idea and testing) Standardized package structure: added package.json, README.md, LICENSE (Apache 2.0), .gitignore, and .npmignore so dependencies install automatically with the standard `npm install` in the client folder. No per-dependency install commands needed.
... View more
2 weeks ago
|
1
|
0
|
473
|
|
BLOG
|
Thank you @KeyHunter, I think your question still needs research and further discussion. From our private messages earlier this week I'm glad you were able to get the dependencies resolved.
... View more
3 weeks ago
|
0
|
0
|
491
|
|
BLOG
|
@Bertrand_Laurancin thank you for your solution and compliments @KARIMLABIDI glad that you could get it worked out!
... View more
3 weeks ago
|
1
|
0
|
675
|
| Title | Kudos | Posted |
|---|---|---|
| 1 | Friday | |
| 5 | Wednesday | |
| 2 | Tuesday | |
| 1 | Tuesday | |
| 3 | a week ago |
| Online Status |
Offline
|
| Date Last Visited |
yesterday
|