Skip to main content
Version: 4.13.0

Catalog UI Policies

Guide for building ServiceNow Catalog UI Policies (catalog_ui_policy) — conditionally shows, hides, or sets variables on a catalog item, record producer or variable set based on a condition.


Catalog UI Policy Reference​

Properties​

For the complete property reference including all properties, types, and detailed descriptions, see the cataloguipolicy-api documentation.

Condition Syntax​

// Simple condition
catalogCondition: `${catalogItem.variables.priority}=high^EQ`;

// Multiple conditions with AND
catalogCondition: `${catalogItem.variables.env}=prod^${catalogItem.variables.critical}=true^EQ`;

// Multiple conditions with OR
catalogCondition: `${catalogItem.variables.env}=prod^OR${catalogItem.variables.critical}=true^EQ`;

// Not empty check
catalogCondition: `${catalogItem.variables.reference}ISNOTEMPTY^EQ`;

Priority Rules​

  1. Mandatory has highest priority
  2. If a variable is mandatory and has no value, readonly/hide actions do not work
  3. If a variable set/container has a mandatory variable without value, the entire set cannot be hidden
  4. "Clear value" action does not work on variable sets and containers

Variable Type Limitations​

Policy TypeNot Applicable To
MandatoryFraction, Container Split, Container End, UI Macro, Label, UI Page
Read-onlyFraction, Container Split, Container End, UI Macro, Label, UI Page
VisibilityFraction, Container Split, Container End

Policy with Client Scripts​

Set runScripts: true and provide executeIfTrue / executeIfFalse scripts via Now.include(...). These scripts run client-side in the browser where modules are not available, so Now.include() is the correct approach. Scripts must be wrapped in function onCondition() {}.


Examples​

Catalog UI Policy -- Show/Hide Based on Condition​

import { CatalogUiPolicy } from "@servicenow/sdk/core";
import { hardwareRequestItem } from "./catalog-items/HardwareRequest.now";

export const managerApprovalPolicy = CatalogUiPolicy({
$id: Now.ID["manager_approval_policy"],
shortDescription: "Show manager approval when high priority selected",
catalogItem: hardwareRequestItem,
catalogCondition: `${hardwareRequestItem.variables.priority}=high^EQ`,
actions: [
{
variableName: hardwareRequestItem.variables.manager_approval,
visible: true,
mandatory: true
}
]
});

Catalog UI Policy -- Read-Only with Value​

import { CatalogUiPolicy } from "@servicenow/sdk/core"
import { softwareRequestItem } from './catalog-items/software-request'

export const readOnlyPolicy = CatalogUiPolicy({
$id: Now.ID["readonly_license_policy"],
shortDescription: "Make license type read-only for standard software",
catalogItem: softwareRequestItem,
catalogCondition: `${softwareRequestItem.variables.software_type}=standard^EQ`,
actions: [
{
variableName: softwareRequestItem.variables.license_type,
readOnly: true,
value: "standard_license",
valueAction: "setValue"
}
]
});

Catalog UI Policy -- With Client Scripts​

import { CatalogUiPolicy } from "@servicenow/sdk/core"
import { cloudVmRequest } from './catalog-items/cloud-vm-request'

CatalogUiPolicy({
$id: Now.ID["vm_prod_controls_policy"],
shortDescription: "VM: Prod/BizCritical Controls",
catalogItem: cloudVmRequest,
catalogCondition: `${cloudVmRequest.variables.environment}=prod^OR${cloudVmRequest.variables.business_critical}=true^EQ`,
active: true,
onLoad: true,
reverseIfFalse: true,
runScripts: true,

actions: [
{
variableName: cloudVmRequest.variables.backup_required,
value: "true",
valueAction: "setValue",
readOnly: true,
order: 100
},
{
variableName: cloudVmRequest.variables.cost_center,
mandatory: true,
order: 200
}
],

executeIfTrue: Now.include("../../scripts/vm-production-controls.js"),
executeIfFalse: Now.include("../../scripts/vm-development-controls.js")
});

vm-production-controls.js:

function onCondition() {
var PROD_REGIONS = [
["AP-South-1", "AP-South-1 (Mumbai)"],
["EU-West-1", "EU-West-1 (Ireland)"]
];

g_form.clearOptions("region");
PROD_REGIONS.forEach(function (pair) {
g_form.addOption("region", pair[0], pair[1]);
});

g_form.showFieldMsg(
"environment",
"Production VMs enforce backup and require cost center.",
"info"
);
}

Catalog UI Policy -- Applied to Variable Set​

import { CatalogUiPolicy } from "@servicenow/sdk/core"
import { shippingVariableSet } from './variable-sets/shipping'

export const internationalShippingPolicy = CatalogUiPolicy({
$id: Now.ID["international_shipping_policy"],
shortDescription: "Show customs fields for international shipping",
variableSet: shippingVariableSet,
appliesTo: "set",
catalogCondition: `${shippingVariableSet.variables.shipping_country}!=US^EQ`,
appliesOnCatalogItemView: true,
appliesOnRequestedItems: true,
actions: [
{
variableName: shippingVariableSet.variables.customs_declaration,
visible: true,
mandatory: true,
variableMessage: "Required for international shipping",
variableMessageType: "warning"
}
]
});

Multiple Actions on Multiple Variables​

export const urgentRequestPolicy = CatalogUiPolicy({
$id: Now.ID["urgent_request_policy"],
shortDescription: "Show additional fields for urgent requests",
catalogItem: laptopRequest,
catalogCondition: `${laptopRequest.variables.urgency}=1^EQ`,
onLoad: true,
reverseIfFalse: true,
actions: [
{
variableName: laptopRequest.variables.justification,
mandatory: true,
variableMessage: "Justification required for urgent requests",
variableMessageType: "info",
order: 100
},
{
variableName: laptopRequest.variables.manager_approval,
visible: true,
mandatory: true,
order: 200
},
{
variableName: laptopRequest.variables.delivery_date,
visible: true,
order: 300
}
]
});