Get a first look at what's coming. The Developer Passport Australia Release Preview kicks off March 12. Dive in! 

Dexter Chan
ServiceNow Employee

Workspace Lists in UI Builder: Your FAQ Guide to Common Configurations

 

If you manage workspaces in ServiceNow, you have probably run into situations where the out-of-box list behavior does not quite match what your users need. Whether it is enabling a smoother scrolling experience, troubleshooting slow load times, or adding custom list actions, most of these challenges have well-defined solutions. This guide answers the most common workspace list questions we hear from platform administrators.

 

What You Will Learn

By the end of this post, you will be able to:

  1. Add a Delete button to your workspace list actions

  2. Create an "Assign to Me" action for Database View lists

  3. Diagnose and resolve slow list performance using query and system property optimizations

  4. Set up infinite scroll on a record list to eliminate pagination friction

  5. Troubleshoot common issues including Highlighted Value rendering and ListLayout GraphQL errors

How to Add a Delete Button to Your List

Adding a Delete action to a workspace list is done through declarative actions rather than custom scripting. Here is how to set it up:

  1. Use the application navigator to navigate to Declarative Actions > Create New Action > List

  2. Click New to create a new action assignment.

  3. Set Implemented As to UXF Client Action (required for configurable workspaces).

  4. Set Client Action to Cascade Delete.

  5. Fill in the remaining fields, including associating the action with the appropriate Action Configuration from your workspace.

DexterChan_0-1773755102511.png

 

How to Create an "Assign to Me" Action for a Database View

Database Views add a layer of complexity because you need to trace the relationship back to the underlying table. This example uses the incident_sla table and assigns the related incident record to the current user, but the same pattern applies to other database views.

  1. Use the application navigator to navigate to Declarative Actions > Create New Action > List
  2. Click New and set Implemented As to Server Script.
  3. Click into the Server Script tab.
  4. Add the following code in the script editor:

javascript

// Grabs the sys_id of the incident from the database view

// The "inc" prefix matches the prefix defined in the Database View configuration

var incSysId = current.inc_sys_id;

 

var incRecord = new GlideRecord("incident");

incRecord.get(incSysId);

incRecord.assigned_to = gs.getUserID();

incRecord.update();

 

The key here is understanding the prefix pattern. Because the action runs in the context of a database view, you reference related table fields using the prefix defined in that view's configuration (in this case, inc). Adjust the prefix and field references to match your specific database view setup.

DexterChan_1-1773755102515.png

 

My List Is Slow. How Do I Make It Faster?

List performance issues usually trace back to one of two root causes: too many records being fetched, or record count queries taking longer than expected. Here are the options available to you.

The most universally effective fix is to refine your query filter in the List Controller so that fewer records need to be fetched in the first place. This applies regardless of which other optimizations you pursue and should always be your first step.

DexterChan_2-1773755102539.png

 

Beyond query tuning, the record count badge is a common culprit. Calculating how many total records match a query can be expensive, especially on large tables. There are two system properties you may add by navigating to the sys_properties table that address this:

 

Enabling glide.ui.list.seismic.omit.count prevents all seismic lists across the instance from populating the count badge entirely. If your users do not rely on that count, this is a low-risk way to reduce query overhead. You can also scope this to specific tables by updating the Value field to a comma-separated list of table names rather than a global toggle.

 

Enabling glide.ui.fetch.list.record.count.asynchronously takes a different approach: the list data loads first, and the count is fetched lazily afterward. Set the Type as True/False. This keeps the list feeling responsive even when the count query is slow. Note that this affects seismic-based lists across the entire platform.

DexterChan_3-1773755102542.png

 

If you want to show a count but avoid the performance hit of an exact number, you can enable fuzzy count (displayed as "100+" rather than a precise figure) by setting a value for the Record Count Limit prop on the List Controller.

 

How to Set Up Infinite Scroll

Infinite scroll dynamically loads and appends records as a user scrolls down, creating a seamless browsing experience without pagination controls.

 

One important restriction to know upfront: infinite scroll is exclusively tied to the Record-List-Bundle component. It cannot be used with the standalone Presentational List component or within a menu list.

 

To configure infinite scroll:

  1. Open UI Builder and either create a new experience or open an existing one.

  2. Navigate to the page where you want to add the list and add the Record-List-Bundle component by clicking "Add Content" and searching for "record list."

  3. In the left configuration tree, click on Presentation List under the Record-List-Bundle to open its configuration panel.

  4. Find the Turn on infinite scrolling toggle, turn it on, and click Save.

DexterChan_4-1773755102587.png

 

Why Does My Highlighted Value Not Appear?

The most common reason is field type. The Highlighted Value component does not support link fields, so it will not work when placed on reference fields or on the first column of the list (which is typically rendered as a link).

 

The fix is to choose a field that is not a reference link, or to dotwalk directly to the value so it renders as plain text rather than a clickable reference. If your use case does not require any clickable links on the list, you can also remove reference links or all links entirely via the Enable Reference Links setting in the List Controller configuration.

DexterChan_5-1773755102602.png

 

 

DexterChan_6-1773755102614.png

 

Can I Add a Permanent Filter Query?

Yes. Use the fixed filter property on the configuration panel of the Presentational List component to apply a query that persists regardless of user-applied filters. This is useful for workspace views where you want to scope the list to a specific subset of records by default and prevent users from removing that scope.

DexterChan_7-1773755102639.png

 

Is Parent/Child (Nested Row) Supported in Lists?

Yes, through the Nest By property on the List Controller configuration panel (right side). Set this to the column key you want to use for grouping parent and child records, and the list will render the hierarchy accordingly.

DexterChan_8-1773755102657.png

 

Help, I Am Seeing a ListLayout GraphQL Error!

Start by checking the network tab in your browser's developer tools. If the request is timing out after 30 seconds, you are hitting the platform's transaction time limit.

 

If that is the case, set the system property glide.ui.list.batching.exclusion.list to a comma-separated list of table names in the Value field you want to exclude from batching. This can resolve timeouts on specific tables without affecting the rest of your instance.

 

If the timeout is specifically caused by the list count query rather than the data fetch itself, the count optimization options described in the performance section above apply here as well. Setting glide.ui.list.seismic.omit.count with a comma-separated list of table names will skip the count query for those tables. Alternatively, setting glide.ui.fetch.list.record.count.asynchronously to true will fetch the count after the list data loads, which prevents the count query from blocking the initial render.

DexterChan_9-1773755102658.png

 

Version history
Last update:
an hour ago
Updated by:
Contributors