Select to view content in your preferred language

Removing empty fields from popup in Portal Map Viewer using Arcade Expression

1882
18
02-13-2024 01:56 AM
CJCowardin
Emerging Contributor

Trying to configure a pop-up to remove all of the fields with no data since the list is very long.  I tried using IsEmpty but they are still there.  Any help is appreciated. 

This is a sample popup

CJCowardin_0-1707818197175.png

 

0 Kudos
18 Replies
AdamGebhart
Frequent Contributor

@ZachBodenner 

Thanks, I'll change the H3 and see how that goes.  That's a bummer (and a little annoying) on the expression part.

0 Kudos
AdamGebhart
Frequent Contributor

@ZachBodenner 

I think I have what I need now, subject to a few minor changes after feedback from our users.  Thanks again for all of your help and for sharing the code.  It is greatly appreciated and things went much faster after you responded.

0 Kudos
ZachBodenner
MVP Regular Contributor

Glad to help!

Happy mapping,
- Zach
0 Kudos
CJCowardin
Emerging Contributor

I just need to create a new Arcade expression under my pop-up properties box, add the above and change to my fields?

0 Kudos
ZachBodenner
MVP Regular Contributor

That's right! You can think of the two variable fieldsArray and labelsArray as matched pairs. The fieldsArray values need to be the actual database field names, then you can alias them (like you would do from the field menu in map Viewer), just making sure that the label is in the same order as the field name.

 

Of course, you'll also have to adjust the HTML. This part of the code:

var returnString = `<h3 style="background-color:${backgroundColor};padding-left:2%">Ramp Info</h3><table style="width:100%;background-color:#f4f4f4;">`;

wont work for you because it's relying in my backgroundColor variable, which is based in the field "Condition." 

You cane remove this portion: 

var cond = $feature.Condition
var backgroundColor = When(cond=="1 (Non-existant)","#fc461d",cond=="2 (Poor)","#df750c",cond=="3 (Functional)","#f2cc0d",cond=="4 (ADA Compliant)","#37aac4","#cccccc") 

and then just remove everything after "h3" in that tag.

Happy mapping,
- Zach
0 Kudos
CJCowardin
Emerging Contributor

I added this and just used 2 fields to test.  I don't see anything different in my popup.  It's still showing Afghan which is empty and that's what I don't want to show.

// Use Arcade > Text template
// create one expression for all fields
// return as table showing only populated fields
// If field is null, do not add row to table
// if field has a value, add row to table
 
// Create variables for checked-for-field and what their labels should be.
// Select the fields to look for
var fieldsArray = ['Afghan','Akan'];
// Set the field aliases in the same order as the fields above
var labelsArray = ['Afghan','Akan'];
var arrayLength = Count( fieldsArray );

// Table Header
// Identify condition and set background color accordingly

// Set table header
var returnString = `<h3>`;

// Make sure the final table is searching for correct attributes
Expects( $feature, 'Afghan','Akan')

/*loops through a number of times eual to the length of the array (that's the i<arrayLength part), incrementing by one each time (i++). If the attribute if the field array is not empty
(!IsEmpty), then the value of the the variable returnString is equal the value in the fieldsArray equal to the index value of the array (fieldsArray[i]) plus the additional portion of the
return string enclosed in the curly brackets. If it is empty, then the value of returnString  
*/

for (var i = 0; i < arrayLength; i++ ) {
  if ( !IsEmpty( $feature[ fieldsArray[i] ] ) ){
    //returnString = returnString + "<tr><td>" + labelsArray[i] + "</td><td>" + $feature[ fieldsArray[i] ] + "</td></tr>";
    returnString = `${returnString}<tr><td style="border-bottom: 1px solid #cccccc;border-right: 1px solid #cccccc;width:50%;padding-left:2%"><b>${labelsArray[i]}</b></td><td style="border-bottom: 1px solid #cccccc;width:50%;padding-left:2%">${$feature[ fieldsArray[i] ]}</td></tr>`;
  }}
 
returnString = returnString + "</table>";

return {
   type : 'text',
   text : returnString
0 Kudos
ZachBodenner
MVP Regular Contributor

I see a couple things which could be tripping you up. Your text string starts with an <h3> tag, but doesn't have a closing tag. Try adding text followed by a close tag just to see what happens:

var returnString = `<h3>This is my popup title</h3>

Next, are you using the Arcade popup element (as opposed to text popup element or an arcade expression)? This format of Arcade will only work using the Arcade popup element.

 

Happy mapping,
- Zach
0 Kudos
GretaSveinsdóttir
Emerging Contributor

I want to use domain names in the return string, is that possible?

0 Kudos
GretaSveinsdóttir
Emerging Contributor

I want to use domain names for one field in the return string, is that possible?

0 Kudos