Enhanced Search Widget Version 2.17 - 12/11/20

07-14-2014 03:57 PM
Labels (1)

Enhanced Search Widget Version 2.17 - 12/11/20

Live Preview Site

Web AppBuilder for ArcGIS | Help - Enhanced Search widget


List of the latest enhancements and changes:

  1. Fixed Issue with Print Legend using "override 1" for search and/or buffer Layers.
  2. Fixed autozoom issue under certain configurations.


Older enhancements or changes

Check the "Older enhancements or changes.txt" in the download for a complete list.


Older Versions

Last 2.13 version

Last 2.12 version

Last 2.11 version

Last 2.9 version

Last 2.7 version

Last 2.6 version

Last 2.5 version

Labels (1)


   No currently the eSearch widget is not able to search tables (i.e. a layer with no geometry). It is something on my list though.

Hi rscheitlin Is this widget supported as an item in Portal for ArcGIS version 10.6?  When I try to load it I just get the waiting gif, and it appears to be looking for a CSVUtils.js file that it can't find.




   The one person that I have talked with about using the eSearch in Portal said they had to copy that file from WAB developer into their portal install.

Hi Robert,

I’m using WAB developer 2.7 and you’re Enhanced Search Widget Version 2.7. Under the Results Tab the three dots do not show up for Result Menu. How can I fix this?


   That happens when the .svg mime type is not registered in your IIS

I'm trying to get the "disable link if null" part to work, but I'm struggling. I am using version 2.3 of the Enhance Search widget. I see in the List.js file where the links get created, but I don't see any code in there that would check if the value is null. How does the widget determine if it should show the link? 


   I handle this in the Widget.js search for "linkFieldNull".

I found it and it works just fine. User Error on my part. 


Have you considered adding the option of generating/downloading labels (like in the Public Notification Widget) from this widget?  I LOVE, and prefer your widget for a number of reasons, but our Assessor's really like this feature in the Public Notification Widget.


When I saw that feature in the Public notification widget I did think about adding it to the eSearch. I just have not found the time to dedicate to this as of yet.

Thanks for the reply! I'll keep my eyes peeled for any revisions.


    First, I want to say thanks a lot for all the work you have done over the years. I have been using your widgets for years and I'm positive the GIS community has benefited immensely from your work.
   I am currently using your enhanced search widget and I'm running into an issue with it. The issue is NULL values. I have the widget setup where it searches through the data and creates the dropdown list of available values. All string values within a field work well. The "all" option works well too. The problem is that the drop down creates a value of "null". I am glad it does but when the user selects "null", the search fails. Any help is greatly appreciated.

Ryan Jones


   I am not sure what version you are using or if you have modified the eSearch, because I have code in there to NOT add null values to the widget drop down list when you have configured the search expression to use unique.


     I upgraded my Web App Builder Developer Edition to the version 2.7. I re-imported your Enhanced Search Widget and now null values are not populated in the drop down list. Is it possible to give the user the ability to search for any null values or does that always introduce a failed search?




   I have added this to my list to possibly add back in the next release.

Robert -- we are looking for a way to force a specific Search Layer based upon a url parameter onOpen.


   I allow you to search based on a specified layer and search value using url parameters:


If you are only looking to set the search layer based on the url (and not execute a search) then I don't think I have anything in place for that.

I think I'm asking for the latter, Robert.  That is, I had a request to specify the Search Layer's default value as the widget loads.  Perhaps I was looking for a way to tweak the index, but it looks like much more would have to be altered than just the Search Layer.

Thanks for your feedback!

In that case a code change like this would need to be made to the _initLayerSelect function (lines 48 thru 56):

            //now check if there is a url search to do
            var myObject = this.getUrlParams();
            if (myObject.esearch) {
              if(myObject.esearch === "last48"){
                var today = new Date();
                var priorDate = new Date(today.getTime() - (((24 * 60 * 60 * 1000) - 1000) * 2));
                var priorDateStr = this._formatDate(priorDate.getTime(), 'yyyy/MM/dd');
                myObject.esearch = priorDateStr + "~" + this._formatDate(new Date().getTime(), 'yyyy/MM/dd');
              if(myObject.esearch === "thismonth"){
                var today = new Date();
                var thisMonthStr = this._formatDate(today.getTime(), 'yyyy/MM/dd');
                myObject.esearch = thisMonthStr + "~" + this._formatDate(new Date().getTime(), 'yyyy/MM/dd');
              if(myObject.esearch === "thisyear"){
                var today = new Date();
                var thisMonthStr = this._formatDate(today.getTime(), 'yyyy/MM/dd');
                myObject.esearch = thisMonthStr + "~" + this._formatDate(new Date().getTime(), 'yyyy/MM/dd');
              if(this.config.layers[myObject.slayer].expressions.expression.length > 0){
                var valuesObj1 = lang.clone(this.config.layers[myObject.slayer].expressions.expression[myObject.exprnum || 0].values.value);
                var values = myObject.esearch.split("|");
                array.forEach(values, lang.hitch(this, function(val, index){
                  if (val.indexOf('~') > -1){
                    var ranges = val.split("~");
                    valuesObj1[index].valueObj.value1 = ranges[0];
                    valuesObj1[index].valueObj.value2 = ranges[1];
                    valuesObj1[index].valueObj.value = val;
                if(this.config.layers[myObject.slayer].expressions.expression[myObject.exprnum || 0].textsearchlabel !== ""){
                  html.place(html.toDom(this.config.layers[myObject.slayer].expressions.expression[myObject.exprnum || 0].textsearchlabel), this.textsearchlabel);
                  html.style(this.textsearchlabel, 'display', 'block');
                  html.style(this.textsearchlabel, 'display', 'none');
                this.paramsDijit.build(valuesObj1, this.resultLayers[myObject.slayer], this.config.layers[myObject.slayer].url,
                on.once(this.paramsDijit, 'param-ready', lang.hitch(this, function () {
                  this._queryFromURL(myObject.esearch, myObject.slayer, myObject.exprnum || 0, myObject.close || false, attribOptions.length);
            } else if(myObject.slayer && !myObject.esearch) {
              var valuesObj2 = lang.clone(this.config.layers[myObject.slayer].expressions.expression[myObject.exprnum || 0].values.value);
              this.paramsDijit.build(valuesObj2, this.resultLayers[myObject.slayer], this.config.layers[myObject.slayer].url,
              on.once(this.paramsDijit, 'param-ready', lang.hitch(this, function () {
                if(attribOptions.length > 1){
                  this.selectLayerAttribute.set('value', myObject.slayer);
            } else {

hi Robert , 

please how can i use the widget filtre with coded values (domains ) . 


   A coded domain is automatically used by the eSearch if it finds one.

What a fantastic widget! Major props.  

As I was exploring it, I was wondering where one would go to deactivate the auto-zoom or even the auto-pan functionality of the results tab upon mouse click of a found feature after a graphical search.  I am still looking in the code.   

The autozoom setting under the layer is turned off, and the autozoom in general settings as well.   


   Strange. When I uncheck "Auto zoom to search results" in the general settings and then use the graphical search it does not auto zoom for me...

So even with that unchecked, it doesn't autozoom for you when you click the feature or between the features in the results window?  It is for me.  :shrug:


   The "Auto zoom to search results" setting means that it will or not automatically zoom to the extent of the search results as soon as the search is complete. As far as the widget zooming to the search result when you click on the result item in the widget list this is a default behavior that is no configurable.

Hi Robert,




Jack announced that you won the 2018 GeoNet MVP Award at the Closing Session of the International ESRI User Conference in San Diego.



On behalf of the Web Builder Community, a million thanks for all your hard work and passion behind creating, enhancing, and updating all these powerful Custom Widgets.


By the next User Conference, the Web AppBuilder will switch from the 3.x JavaScript API to the 4.x JavaScript API, although full parity is not expected.


That will be a monumental task for you to rework all your widgets!

Congratulations Robert -- well deserved!

Yep well done Robert.


Congratulation on your 2018 GeoNet MVP Award! You really deserve this!

I was trying to add data in Esearch widget 2.8 from one of our rest map service which have almost 900,000 records. When I added the expression by the unique values it is taking a lot of time to load. I wonder how big the data records(no) can be handled by Esearch widget?


Irfan Afsar


   Anytime the widget has to retrieve unique values from 900,000 records it is going to take a long time. I don't have a number that I can say is the limit but logically 900K is alot of data.

Is there a version map that says which version of the widget is compatible with which version of Portal? Thanks

What I know is Portal is always 2 versions behind WAB Dev. So right now WAB Dev is 2.9 and Portal is 10.6.1 so the WAB version deployed with Portal 10.6.1 should be 2.7.

And we are always a few versions behind.  I was more looking for
10.5.1 Portal is 2.x

10.6 Portal is 2.y

10.6.1 Portal is 2.z

Since we have to plan ahead before the upgrade

10.6.1. = 2.7

10.6 = 2.6

10.5.1. = 2.5

10.5 = 2.4

Hi Robert,



I have something exciting to share with you on the Web AppBuilder. We had asked for a Widget that will allow us to create Custom Reports. The task seemed too complicated because it is impossible to design a standard template that satisfied everyone.


A one-size-fits-all scenario does not work when it comes to designing Reports.


Latitude Geographics surprised us with their new Geocortex Reporting 5 software.


Anyone can now design Custom Reports via a simple drag & drop interface, position the headers, footers, labels, tables, picture boxes, etc. within the page and save the finished report to their ArcGIS Online Content folder.


This finished report can be used within the Geocortex Reporting Widget that works inside the Web AppBuilder.


This makes it very easy for the end user to select a feature and run a report.


I have a simple demo:





Click on a Park



Expand the Menu



Run Report



Select Report



Wait for 2 minutes



Download Report



You get a professional looking Report of all the Trees within this Park grouped by Common Name with hyperlinks to open Google Search and a Table of Contents to make it easy to browse through this long report.


Here is a sample report:




Everything works like a charm.

The best part is that you do not have to write a single line of code to create this fancy report.


You can also use the Select Widget to select more than one Park.


Press Done to close the Reporting Widget.



Open the Select Widget



Select two Parks



21 features are selected



Expand the Menu and select Run Report



The Reporting Widget shows that 21 features have been selected.


Select the LA County Parks Report



Wait for 5 minutes.



Download Report



View the Report




Everything works like a breeze.

We wanted this feature for such a long time.

Now, this is available to the Web AppBuilder Community.



Now here is my plea to you.



Would it be possible to make this 3rd party Reporting Widget work with your Identify Widget and Enhanced Search Widget?



I know this is asking too much since you are not involved with the Reporting Widget.

However, it would be the icing on the cake if I could somehow use your Enhanced Search Widget to search and zoom to a Park, and then trigger the Report by selecting Run Report from the expanded menu.


Let me explain what is happening now.



Open the Identify Widget (version 2.7)

Use the Extent Tool to select a Park.

Expand the Menu



Select Run Report



This triggers the Reporting Widget.

It shows that one feature has been identified.

This is good.


However, it shows that no reports are available.



 Let’s try the Enhanced Search Widget (version 2.7)


Search for Elysian Park.




Expand Menu



Run Report



This triggers the Reporting Widget.

One feature is found from the Search Results.

However, no reports are available.




I am including the Zipped file of this Website.

It is using the Web AppBuilder Developer Edition 2.8





Here is a doc that shows how I created this Website using the Geocortex Reporting Widget.





The Reporting Widget needs an ObjectID to run the Report.

It works off the selected Object IDs.


If there is only 1 feature in the current selection, the report is generated for 1 park.


If there are 3 features in the current selection, the report is generated for the 3 selected parks.


At the moment, the Reporting Widget seems to work with the standard Web Map Popup and the standard ESRI Select Widget.



Oh, by the way, I have changed my name from Tapas to David.

This is why my website domain reads davidapps.net



Hope to see you at the ESRI Dev Summit next April.



Best regards,





   It sounds like the report widget is selecting the appropriate report based on the layer id or layer name and because I have the name of the results layer from the identify and eSearch different from the main layer it symbolizes there is no matching report found. One suggestion is to run the eSearch or Identify first and has them add the results layer and then go and configure the report widget to see if it picks up the result layers from the map in the report widgets settings screens. If it does then configure a report and you are good to go. If not then some effort will need to be done to figure out the report widget logic.

Hi Robert,


Thanks a million for your prompt and helpful response as always!


Now I have a better understanding of what the Reporting Widget is looking for.


I will give your suggestions are try today and let you know my results.


Best regards,



Hi Robert,



Thanks for your expert tips on how to make the Geocortex Reporting Widget work with your Enhanced Search Widget and Identify Widget.


I played around with these tools this weekend and here are my findings.


I started with the new Web AppBuilder Developer Edition 2.9 (July 2018) and added the latest version of all your Custom Widgets as of 8/2/2018.


Enhanced Search Widget 2.7, Version 78                             2/23/2018


Enhanced Basemap Gallery Widget 2.8, Version 18            5/1/2018


Google Street View Widget 2.1, Version 12                         7/20/2016


Identify Widget 2.8, Version 31                                            7/6/2018


Elevation Profile Widget 2.8, Version 19                             7/23/2018


Map Progress Indicator Widget 2.8, Version 11                   7/23/2018


Enhanced Bookmark Widget 2.5, Version 8                         8/17/2017


Enhanced Locate Widget 2.7.1, Version 16                          2/23/2018


Popup Panel Widget 2.9, Version 17                                     8/1/2018


In addition, I included these widgets from Kevin McLeod and Larry Stout.


Pictometry Widget for ESRI WebApp Builder 1.2 (Kevin McLeod)           10/27/2015




Google Earth Widget (Kevin  McLeod)




PrintPlus Widget Version 1.1.6 (Larry Stout)                                   6/12/2015




I wanted to start off with a solid template.


I had to change the wabVersion value to 2.9 in the manifest.json file of each widget:


  "wabVersion": "2.9",


Surprisingly, all the Custom Widgets are working flawlessly in the Web AppBuilder Deverloper Edition 2.9.


This is great news!


This is one of the rare occasions where a Web AppBuilder upgrade has not broken your Custom Widgets.



I tested this Foldable Template against our Maricopa County Parcel Map.






Everything is working a like a charm.


Next, I decided to create the simplest possible Custom Report using the Geocortex Reporting software.


Since this is a Software-as-a-Service, all you need is to open this URL in Firefox and enter your ArcGIS Online credentials to start.




I created a Parcel Report that only returns the ObjectID and Parcel Number.


Next, I opened the Web AppBuilder and added the Geocortex Reporting Widget.


Finally, I ran a few tests:



Web Map Popup



Click to select a Parcel.

This opens the Web Map Popup



Expand the Menu Actions and Select Run Report.



This opens the Geocortex Reporting Widget


The Layer Name is correctly identified as Parcel


This is critical.


The Parcel Report will appear as an option if and only if the selected feature includes a layer named Parcel.



Click on Parcel Report.


Download the Report.



Press Done and close the Reporting Widget.


Here is how the Parcel Report looks like:




Popup Panel Widget


Open the Popup Panel Widget


Select another parcel and expand the Menu Actions



Run Report



Once again, the Layer Name is correctly returned as Parcel



Select the Parcel Report







This works since your Popup Panel Widget mirrors the Web Map Popup.



Enhanced Search Widget


Open the Enhanced Search Widget and select a few parcels with the Extent Tool.



Expand the Menu Actions



Run Report



This opens the Reporting Widget.

The Layer Name is correctly returned as Parcel

Parcel Report shows up as a valid option.



Click on Parcel Report and Download the Report.


The report contains the Parcel Numbers for the 5 selected parcels.



This is perfect!


This is exactly what I was hoping for.


Press Done and Close the Reporting Widget

Click on a Search Result.

This opens the Popup Panel

Expand the Menu Actions



Run Report



The Layer Name is correctly returned as Parcel.

Click on Parcel Report and Download the PDF file.



This is excellent.


So now we have verified that the Geocortex Reporting Widget works with your Enhanced Search Widget and your Popup Panel Widget.



Identify Widget


Refresh the Web App


Open the Identify Widget.

Select a Parcel



Expand Menu Actions



Run Report



Now we can clearly see the source of the problem.

The Identify Widget is returning the Layer Name as Identify Results.


The Reporting Widget is configured to look for a layer named Parcel.

Since it cannot find this, it is saying:


No Reports Available.



I understand now why this cannot be easily fixed.

Unlike the Enhanced Search Widget which only works on a single layer at a time, the Identify Widget can return results from multiple layers.


This is why the Identify Widget is returning Identify Results as the Layer Name rather than naming any specific layer like Parcel.


Potentially, the layer list may contain all of these layers:



Zip Code


Township Range Section



Your Identify Widget is a simple and excellent tool. I do not wish to mangle this widget for the sake of making it compatible with the Geocortex Reporting Widget.


The Enhanced Search Widget is doing the job. This is the Widget that everyone will use to Search for a Parcel, and then they can expand the Menu Actions and Select Run Report to get a detailed Parcel Report with all the Attributes grouped logically.


Here are the detailed steps for creating this simple report using Geocortex Reporting:




Here is the Zipped file for the demo Web App:





I am thrilled to find how simple it is to design Custom Reports with Tables, Pictures and Charts and generate these PDF docs directly off your Enhanced Search Widget.


All this is like magic to me!


I cannot thank enough all the brilliant minds that went into designing these helpful tools.

I cannot believe that all this information for 1.6 million parcels is accessible to the end user on their Smartphones!



Best regards,




I used your enhanced widget, for the search result I could 'Add Result as Operation Layer', this way when I use the print widget the result will be in the printout. I am wondering that would it possible to add the buffer from the spatial search as operation layer? This way I could print out the buffer from the print widget. Right now if I click on the print the buffer graphic is gone.




   This is already an option in the widgets settings. Go to the buffer deaults > Add the buffer layer to the maps legend

Hi Robert, will the below code work on your eSearch widget?  I'm using multi part graphics and I just want to clear all graphics using the onClose or onDeactivate event.  I've tried adding this.map.graphics.clear(); to your onDeactivate function in Widget.js of (server/apps/21/widgets/eSearch) but it's still not clearing the buffers.  Thanks for any advice.

onDeactivate: function() {


   If you are talking about the buffer that the eSearch uses then that is the issue. I do not use the map.graphics layer in my widget I have a specific GraphicsLayer I use for the buffer.

Yes thank you for pointing that out.  What is the name of that GraphicsLayer and how would one clear it's graphics?  Is the onDeactivate function like I mentioned above a good place to do this? 

I see that you've used this.graphicsLayerBuffer.clear(); in Widget.js within the _bufferGeometries function.  I tried adding that in eith the onClose or onDeactivate functions and no luck so far.  Do I need to loop through the graphic container within either of those functions and remove buffers that way?


   It is called "graphicsLayerBuffer" so this.graphicsLayerBuffer.clear(); Yes the onDeactivate should work fine.

Hi Robert, unfortunately that did nothing to the buffers so I must of missed a step.  Below is the onDeactivate function within (server\apps\21\widgets\eSearch\Widget.js).  I'm using WAV dev 2.6 I believe and Portal 10.5, AGS 10.5.  Is there another js file I need to update this code by chance?  After I close the window for the eSearch tool using the upper right X, the buffers I created still remain (screenshot below).  Thoughts?

onDeactivate: function() {


   In version 2.6 of the eSearch the onClose onDeactivate functions look like this:

      onDeactivate: function() {

      onClose: function () {
        if (!this.config.bufferDefaults.addtolegend) {
          if (this.graphicsLayerBuffer) {
        if (this.tempResultLayer) {

So if you have the buffer setting set to add to legend then it will not clear when the widget is closed.

That makes sense but unfortunately I do not have "add to legend" checked which makes this even odder.  I'll keep tweaking the code around this area in widget.js and maybe I'll get lucky, thanks

In case anyone is interested, using Robert's idea I modified the code to clear graphics within the onClose function.  Add this code to that function

this.dynamicGraphic = this.map.getLayer(this.map.graphicsLayerIds[1]);

if(this.dynamicGraphic != null) {

Hi Robert,






Your Enhanced Search Widget version 2.7 is working with the Reporting Widget exactly as we expected.


I can search for a Parcel by Address or Owner or simply select a parcel by clicking on the map and then expand the Action Menu and select Run Report.


This downloads a nicely formatted 5-page PDF doc showing all the Parcel Attributes including external Web Links and a Parcel Map and an Overview Map like this:




This approach is much more elegant than trying to download a CSV file to an Excel Table.


Best of all this entire workflow works on my Smartphone. This will allow the citizens of Maricopa County to access and download all the relevant Parcel Information right on their handheld devices without ever having to step into a County Office.


Here is the Web App based on the Foldable Theme of Web AppBuilder Developer Edition 2.9





Let’s locate the County Administration Building based on the Address:



Enter Address = 301 W JEFFERSON ST



Expand the Action Menu and select Run Report



The user gets to select from 3 Report Choices.



I can also download a report for all Parcels within 200ft of this Parcel.


Open the By Spatial Tab and draw a 200ft buffer.



Select the Intersected By tool



13 Parcels are found within 200ft of the County Admin Parcel



Expand the Menu and Run Report.


Select Parcel Report with Web Links



This creates a nicely formatted PDF doc with a Table of Contents for the 13 Parcels that can be viewed on a Smartphone.



I think this is quite a breakthrough.


Before this, there was no elegant way to select, display and download so much information on your smartphone with just a few mouse clicks.


This can be used by realtors and prospective buyers to find the selling price of houses within 300ft of their target parcel. It is easy to insert Charts and Graphs into the Report.


I hope future upgrades to the Web AppBuilder does not break your Enhanced Search Widget. This has become a critical tool for all our Web Apps.


Best regards,



DAVID DAS your post is epic - thank you greatly.  Josh Vickrey‌ thanks I'll add this as well. 

edit: DAVID DAS‌ so I added the "Report Feature" Widget. (which I was wondering about since it is for QA/QC reporting) and do not see 'Run Report' show up in eSearch.  May I ask, what widget exactly do you mean by "Report Widget"? Report Feature? I would think maybe it would more be the Screening widget. So, I added both of these plus Infographic and any other ones that looked relevant.  I added Select, Public Notice (which I couldn't get to work or save oddly) Location and Incident. To no avail, Report does not show up.  (although location and incident do, and they work. That is why eSearch is so amazingly awesome, in how it ties in to the other widgets).   Robert I looked in the Docs and searched Report and did not see indication of it in there. Which Esri widget should I add for Report?

Version history
Revision #:
4 of 4
Last update:
‎12-22-2020 09:34 AM
Updated by: