Skip to content
  • There are no suggestions because the search field is empty.

Power Plus - List Filter Module

Interactive filter controls (dropdown, radio, checkbox, multiselect, or tabs) that let visitors narrow list results. Filter options can be defined manually or generated automatically from the data schema so they stay in sync with the underlying data.

The List Filter module adds interactive filter controls to your page. Visitors can narrow down list results by selecting one or more filter options. For example, on a product catalog page, you might add a “Category” dropdown that lets visitors show only shoes, or only electronics. On a job board, you might add location, department, and employment type filters.

The filter module supports two fundamentally different modes: Manual (you define every option by hand) and Data-Schema (options are generated automatically from the data). The data-schema mode is especially valuable because it keeps your filters in sync with your data — when someone adds a new category to the HubDB table or CRM, the filter automatically picks it up without any page editing.

Configuration

Field

Type

Description

Name

Text

A unique identifier for this filter instance (e.g. category_filter, industry_filter). This name is used internally for state management and URL parameters. It must contain only letters, numbers, hyphens, and underscores.

List Name

Text

The Name of the List module this filter controls (e.g. product_list). This is how the filter knows which list to update when the visitor changes a selection. The name must match exactly.

Title

Text

An optional label displayed above the filter control. For example, “Category”, “Industry”, or “Filter by Type”. If left empty, no label is shown.

ARIA Label

Text

An accessibility label for screen readers. This is important for users who navigate with assistive technology. If you set a Title, you can often leave this empty. If you don’t set a Title (e.g. for a filter that’s visually obvious from context), you should set an ARIA Label.

Mode

Choice

Manual — you define each filter option by hand in the module settings. Data-Schema — options are generated automatically from the actual data values or schema. See detailed sections below.

Style Options

The filter can be rendered as several different UI controls. Choose the one that best fits the number of options and the available space on the page.

Field

Description

Type

The visual style of the filter control. Options: Radio — single-select radio buttons (vertical list). Checkbox — multi-select checkboxes (visitors can select multiple options, combined with OR logic via ONE_OF operator, or AND logic via multiple filter modules). Dropdown — single-select dropdown menu (compact, saves space). Multiselect Dropdown — multi-select dropdown with checkbox items in a flyout panel. Tabs — horizontal tab bar (great for few options that should be visually prominent, includes a responsive dropdown fallback on mobile).

Color Scheme

Light or Dark. Inherits the POWER THEME’s color variables for the selected scheme.

Form Style

When Override Form Style is enabled, you can choose a POWER THEME form style (e.g. box, underline, rounded) to override the default styling. This is useful when you want the filter to match a specific design that differs from the page’s global form style.

Alignment

Horizontal alignment of the filter options: Left, Center, or Right.

Children Alignment

For radio and checkbox types: vertical (stacked) or horizontal (side by side). Horizontal works well when you have few options with short labels.

Animation

AOS (Animate on Scroll) settings. When enabled, the filter control fades or slides into view as the visitor scrolls to it.

History & URL Options

These settings control how the filter’s state is preserved across page navigation and browser history.

Field

Description

Use in History

When true (the default), the filter’s current selection is stored in the browser’s history state. This means the back and forward buttons correctly restore previous filter selections. There’s rarely a reason to disable this.

Use in URL

When true, the filter’s selection is stored as a URL query parameter. This makes filtered views bookmarkable and shareable — visitors can copy the URL and send it to someone, and the filters will be pre-selected when they open it. Highly recommended for primary filters.

URL Parameter Name

The name of the query parameter in the URL. For example, if you set this to category, the URL might look like ?category=shoes. Choose short, descriptive, lowercase names. For multi-select filters, multiple values are joined with semicolons (e.g. ?category=shoes;bags).

“Show All” Option

Field

Description

Disabled Filter

When true, a special “Show All” option is prepended to the filter options. When the visitor selects this option, the filter is effectively turned off — no filter is applied. This is the default starting state. Without this option, the visitor must always have a filter option selected.

Disabled Filter Label

The label text for the “Show All” option. Default: All. You might customize this to something like All Categories, All Industries, or No Filter.

Mode: Manual

In manual mode, you define each filter option yourself in the module settings. This gives you complete control over what options appear, what they’re labeled, and what filter they apply. Manual mode is best when you have a fixed, known set of options that rarely change — for example, content types (Blog, Whitepaper, Video) or time ranges (This Week, This Month, This Year).

Each filter option has these fields:

Filter Option Field

Description

Name

An internal identifier for this option (e.g. electronics, blog_post, this_week). This is used in state management and URL parameters — it’s what appears in the URL, not the Label. Use lowercase with underscores, no spaces.

Label

The display text that visitors see. Supports rich text (HTML), so you can include icons, bold text, or custom formatting. For example: <strong>Electronics</strong> or 📱 Mobile Devices. In data-schema mode, labels use the [[ ]] JSONata template syntax.

Property Name

The path to the data field that this filter checks. For HubDB data, this is typically prefixed with values. (e.g. values.type.name, values.category). For CRM data, use the property name directly (e.g. category). This can also be a JSONata expression for complex matching — for example, $map(values.tags, function($v) {$v.name}) to match against any item in a multi-select array.

Operator

The comparison operator used to test each data item against the filter value. See the Filter Operators Reference below. The most common operators are == (exact match) and Contains Token (value contains the term, useful for tags and multi-select fields).

Value

The value to compare against. This is usually a simple string like electronics or blog_post. It also supports JSONata expressions enclosed in [[ ]] for dynamic values — for example, [[$millis()]] evaluates to the current timestamp.

Selected

Whether this option is selected by default when the page first loads. If no options have Selected: true and the “Show All” option is enabled, the filter starts on “Show All”.

Manual Filter Example: Content Type Tabs

A typical use case: letting visitors filter content by type using a horizontal tab bar.

Filter Module:
Name: type_filter
List Name: content_list
Title: Content Type
Mode: Manual
Style: Tabs
Filters:
- Name: blog
Label: Blog Posts
Property Name: values.type.name
Operator: ==
Value: blog_post
- Name: whitepaper
Label: Whitepapers
Property Name: values.type.name
Operator: ==
Value: whitepaper
- Name: video
Label: Videos
Property Name: values.type.name
Operator: ==
Value: video
Disabled Filter: true
Disabled Filter Label: All Types

This creates a tab bar with four options: “All Types”, “Blog Posts”, “Whitepapers”, and “Videos”. Selecting “Blog Posts” adds a filter values.type.name == "blog_post" to the request.

Manual Filter Example: Time-Based Chart Filter

For the weather chart, a filter lets visitors switch between forecast and historical data using the current time:

Filter Module:
Name: time_filter
List Name: chart_list
Style: Tabs
Mode: Manual
Disabled Filter: true
Filters:
- Name: forecast
Label: Forecast
Operator: >=
Property Name: millis
Value: [[$millis()]]
- Name: history
Label: History
Operator: <
Property Name: millis
Value: [[$millis()]]

The [[$millis()]] expression evaluates to the current time in milliseconds. “Forecast” shows data points with a timestamp in the future (>= now), and “History” shows data points in the past (< now).

Mode: Data-Schema

In data-schema mode, filter options are generated automatically from the actual data. The framework analyzes the loaded data to build a schema of all unique values for a given field, and creates a filter option for each one.

This is extremely powerful because: - Filter options stay in sync with the data — when someone adds a new category to the HubDB table, the filter automatically includes it. - No manual maintenance — you don’t need to edit the page every time the data changes. - Works with any datasourceJSON, HubDB, and CRM datasources all support schema generation.

The way it works depends on the datasource type: - Client-side datasources (JSON, XML, HubDB) — The framework loads all the data, then builds a schema by scanning every item for unique values. This schema includes all field names, their types, and all distinct values found. - Server-side datasources (CRM) — The datasource provides a schema from the CRM property definitions (via the -schema endpoint). This includes property names, labels, types, and dropdown options as defined in HubSpot.

You configure data-schema filters using several JSONata expressions that tell the framework how to navigate the schema and build options:

Field

Description

Filter Query

A JSONata expression that extracts the list of options from the schema object. For client-side data, the schema is auto-built from the data. For CRM data, the schema comes from the -schema endpoint. This expression must return an array of objects.

Filter Name Query

A JSONata expression evaluated against each option object to get its internal name (used in state management and URLs). Usually object.value or object.name.

Filter Label

A rich text template for the display label of each option. Uses the [[ ]] JSONata syntax. For example, [[object.value]] or <p>[[object.label]]</p>.

Filter Property Name

The data field path to filter on. This is evaluated against each data item. For simple fields, it’s a path like values.industry.name. For multi-value fields (like HubDB multi-select), use a JSONata function: $map(values.types, function($v) {$v.name}).

Filter Value Query

A JSONata expression evaluated against each option to get the comparison value. Usually object.value.

Filter Operator

The comparison operator. For multi-value fields, Contains Token is the most common. For single-value fields, == works.

Filter Selected Query

A JSONata expression that returns true or false for each option, determining whether it’s selected by default. Default: false (nothing pre-selected).

Understanding the Schema Object

To write data-schema filter queries, you need to understand the shape of the schema object. The easiest way is to use debug mode to see the exact schema in your browser’s console. But here’s the general structure:

For client-side datasources, the schema is built by scanning the data and looks like this:

{
"properties": [
{
"name": "id",
"type": "string",
"values": [{ "value": "1", "num": 1 }, { "value": "2", "num": 1 }]
},
{
"name": "values",
"type": "object",
"properties": [
{
"name": "category",
"type": "object",
"properties": [
{
"name": "name",
"type": "string",
"values": [
{ "value": "electronics", "num": 5 },
{ "value": "clothing", "num": 3 }
]
},
{ "name": "label", "type": "string", "values": [...] }
]
}
]
}
]
}

Each values array contains all unique values found in the data for that field, along with a count (num) of how many items have that value.

To navigate to a specific field’s values, chain .properties[name="..."] selectors. For example: - schema.properties[name="values"].properties[name="category"].properties[name="name"].values → gets all unique category names from a HubDB table - schema.properties[name="values"].properties[name="industry"].properties[name="label"].values → gets all unique industry labels

For CRM datasources, the schema comes from the HubSpot property definitions:

{
"properties": [
{
"name": "category",
"label": "Category",
"type": "enumeration",
"options": [
{ "label": "Electronics", "value": "electronics" },
{ "label": "Clothing", "value": "clothing" }
]
}
]
}

To navigate CRM schema: schema.properties[name="category"].options → gets all dropdown options for the category property.

Data-Schema Example: Category Dropdown from HubDB

This automatically creates dropdown options from all unique values in the industry column of a HubDB table:

Filter Module:
Name: industry_filter
List Name: card_list
Title: Industries
Mode: Data-Schema
Style: Dropdown
Filter Query: schema.properties[name="values"].properties[name="industry"].properties[name="label"].values
Filter Name Query: object.value
Filter Label: [[object.value]]
Filter Property Name: values.industry.name
Filter Value Query: object.value
Filter Operator: Contains Token
Disabled Filter: true (adds "All Industries" option)
URL Parameter: true
URL Parameter Name: industry

The Filter Query navigates the auto-built schema to find all unique values of values.industry.label. Each value becomes a filter option. The ^(value) suffix can be added to sort options alphabetically.

Data-Schema Example: Multi-Value Filter with JSONata

When HubDB items have multiple tags or types (multi-select columns), each item’s values.types field is an array of objects. You need to: 1. Extract the unique values from the schema (which already flattens the arrays) 2. Use $map() in the Property Name to match against array items

Filter Module:
Name: types_filter
List Name: content_library_list
Mode: Data-Schema
Filter Query: schema.properties[name='values'].properties[name='types'].properties[name='name'].values^(value)
Filter Name Query: object.value
Filter Label: <p>[[object.value]]</p>
Filter Property Name: $map(values.types, function($v) {$v.name})
Filter Value Query: object.value
Filter Operator: Contains Token
URL Parameter: true
URL Parameter Name: cltype

The $map(values.types, function($v) {$v.name}) expression is evaluated against each data item. It extracts all name values from the types array, creating a flat list that the Contains Token operator can search through.

Data-Schema Example: CRM Product Category Filter

For CRM datasources that provide a schema endpoint, the schema comes from HubSpot’s property definitions rather than from scanning the data:

Filter Module:
Name: category_filter
List Name: product_list
Mode: Data-Schema
Style: Dropdown
Filter Query: schema.properties[name="category"].options
Filter Name Query: object.value
Filter Label: [[object.label]]
Filter Property Name: category
Filter Value Query: object.value
Filter Operator: ==
URL Parameter: true
URL Parameter Name: category

This reads the category CRM property’s dropdown options and creates a filter option for each one. The label comes from object.label (the human-readable name defined in HubSpot), and the value comes from object.value (the internal value).

Filter Operators Reference

Operator

Description

Typical Use Case

== (EQ)

Exact match — the data value must exactly equal the filter value

Single-select dropdowns, category filters

!= (NEQ)

Not equal — excludes items where the value matches

“Exclude” filters, negative filtering

< (LT)

Less than — for numeric and date comparisons

Price upper bound, “before this date”

<= (LTE)

Less than or equal

Price range ceiling

> (GT)

Greater than

Price lower bound, “after this date”

>= (GTE)

Greater than or equal

Date range floor, minimum price

Has Property

The field exists and has a non-empty value

“Has image” filter, “Has description”

Not Has Property

The field is missing or empty

“Missing data” filter

Contains Token

The data value contains the filter value as a substring or array member

Multi-select fields, tag matching, text fields with multiple values

Not Contains Token

The data value does NOT contain the filter value

Exclude items with specific tags

Contains Item

A semicolon-separated string contains the filter value as one of its items

Legacy data with "a;b;c" format

Not Contains Item

A semicolon-separated string does NOT contain the item

Exclude from legacy lists

IN

The data value appears in a provided list of values

Server-side “one of these values” filter

NOT_IN

The data value does NOT appear in a provided list

Server-side exclusion (e.g. exclude items already in cart)

ONE_OF

Any of multiple selected filter values matches the data value

Multi-select checkbox filters where selecting “A” and “B” means “show items that are A OR B”

When to Use Which Operator

  • Single-value fields (text, number, single-select dropdown): Use == for exact matching.

  • Multi-select fields (HubDB multi-select, arrays): Use Contains Token and combine with $map() in the Property Name.

  • Date fields: Use >= and < for date ranges.

  • Tags/categories with OR logic: Use ONE_OF — when the visitor selects multiple options, items matching ANY of them are shown.

  • Excluding items: Use !=, NOT_IN, or Not Contains Token in default list filters. For example, the Wishlist’s “Recommended Products” uses NOT_IN with $cartProductIds() to exclude products already in the cart.

Combining Multiple Filters

You can place multiple filter modules on the same page, all targeting the same list. Filters combine using AND logic — results must match ALL active filters simultaneously. For example, if the visitor selects “Electronics” in the category filter and “Large” in the size filter, only items that are BOTH in the “Electronics” category AND the “Large” size are shown.

For OR logic within a single filter (e.g. “show Electronics OR Clothing”), use the ONE_OF operator with checkbox or multiselect dropdown style. This lets the visitor select multiple options, and items matching ANY selected option are shown.