--- title: "Thing List" slug: "thing-list-widget" updated: 2026-04-17T07:45:12Z published: 2026-04-17T07:45:12Z canonical: "learn.servitly.com/thing-list-widget" --- > ## Documentation Index > Fetch the complete documentation index at: https://learn.servitly.com/llms.txt > Use this file to discover all available pages before exploring further. # Thing List This widget displays the list of things visible to the user and that are relative to the navigation context. The list supports pagination, and items can be searched and sorted based on properties. The list shows one column for each property or composite part defined in the template. Optionally, you can add metrics, but they are computed for the current page only, so it is not possible to sort or search by their values. Each value can be displayed through filters (e.g [Badge](/v1/docs/status-badge-filter) for the Status column). ![Thing List](https://components-manager.servitly.com/components/ThingList_1/IMAGES/_screenshot?owner=AG_Servitly) Below the list, you can interact with the pagination control (default 20 items at a time). This is automatically hidden if there are fewer items than the number of items to be loaded per page (configurable with the “*Page Size*” option). Entering the page, the list is sorted by the first column ascending, but optionally, you can refine it through the “*Initial Sorting*“ widget property. This widget requires the `READ_THING` user’s [permission](/v1/docs/user-permissions). ## Search for Things On the top right part of the widget, a search control bar allows filtering things by a text key. ![](https://cdn.document360.io/6759e9c9-3ce3-49df-965a-7231d2d9a10a/Images/Documentation/image(900).png) Optionally, by pressing the *Advanced Search* icon, a dedicated panel allows the DPS user to specify multiple conditions based on properties. ![](https://cdn.document360.io/6759e9c9-3ce3-49df-965a-7231d2d9a10a/Images/Documentation/image(901).png) The provided inputs are preserved during navigation, also across pages in case the same widget “*Id*” is used. Optionally, by using the “*Query*“ property, a set of conditions for pre-filtering items can be defined in the template. In the template, you can specify the “*Search Fields*“ used to filter things by text key. In case the “*Query Variable*“ property has been defined (the list is filtered from a [Search Field](/v1/docs/search-field) placed in the page), the search control bar is automatically hidden and thus not visible to the user. ## Bulk Operations By enabling the widget property "*Bulk Controls*", the widget allows selecting multiple things and performing bulk operations, including: - *Manage Tags*: The DPS user can select/deselect and edit tags to be associated with the selected things. - *Execute Command*: The DPS user can select a command ([with bulk support](/v1/docs/commands#general)) and execute it on the selected things. In case the selection includes several models, for each of them, the DPS user can select a specific command. - *Update Firmware*: The DPS user can select a firmware ([with bulk update](/v1/docs/firmware#editing-a-firmware)) and apply it to the selected things. - *Apply Recipe*: The DPS user can select a recipe and apply it to the selected things. - *Delete*: The DPS can delete the selected things upon a string confirmation (Write DELETE to delete). ![](https://cdn.document360.io/6759e9c9-3ce3-49df-965a-7231d2d9a10a/Images/Documentation/image(899).png) The selection is retained even when changing to a different list page. The number of selected items and the button to select all things, if necessary, will be displayed at the top of the widget when at least one thing is selected. In the case of a remote update (e.g. command execution, firmware update), it is also possible to select whether to execute the update immediately or schedule it for a specific time. ![](https://cdn.document360.io/6759e9c9-3ce3-49df-965a-7231d2d9a10a/Images/Documentation/image(898).png) ## Create a new Thing If the widget is placed in the Location details page and the widget option “*Actions Enabled*“ is selected, by pressing the “*Add Thing*“ button, the DPS user can manually create a new thing under the current location. This requires the `WRITE_THING` user’s [permission](/v1/docs/user-permissions). ![](https://cdn.document360.io/6759e9c9-3ce3-49df-965a-7231d2d9a10a/Images/Documentation/image(905).png) ## Template Syntax Below you can find some examples of how to use the component within a template. **Example 1** Thing list displaying simple properties. ```xml                                                                                 ``` **Example 2** List of things with complex properties and initial sorting. ```xml                                                                                                         ``` ## Component Reference Here is a comprehensive list of all the elements and properties that can be used to configure the component. #### Thing List `<thing-list-widget-v2>` | *Actions Enabled* | The boolean flag indicating whether actions (e.g. Add button) are enabled on the widget. **Name**: enableActions **Type**: BOOLEAN \| Optional **Default Value**: *true* `[enableActions]="false"` | | --- | --- | | *Advanced Search Always Open* | If selected the advanced search is always open when entering the page, an cannot be closed. **Name**: advancedSearchAlwaysOpen **Type**: BOOLEAN \| Optional **Default Value**: *false* `[advancedSearchAlwaysOpen]="true"` | | *Block Column Span* | The number of columns on which to span the properties displayed in each list block (default 1). **Name**: blockColumns **Type**: INTEGER \| Optional **Default Value**: *1* `blockColumns="2"` | | *Bulk Controls Enabled* | The boolean flag indicating whether bulk selection and buttons (e.g. Tagging, Firmware Update) are enabled on the widget. **Name**: bulkControlsEnabled **Type**: BOOLEAN \| Optional **Default Value**: *false* `[bulkControlsEnabled]="true"` | | *Controls Enabled* | The boolean flag indicating whether controls (e.g. Search, Export) are enabled on the widget. **Name**: controlsEnabled **Type**: BOOLEAN \| Optional **Default Value**: *true* `[controlsEnabled]="false"` | | *Details Path* | The optional path that identifies the details page to be opened when a row is clicked. **Name**: detailsPath **Type**: STRING \| Optional `detailsPath="abc"` | | *Empty Message* | The blank message to be displayed in the widget in case no item was found. To manage translations, you can define a label and use the key as the value of the property. **Name**: emptyMessage **Type**: STRING \| Optional `emptyMessage="No customer found"` | | *Title* | The title displayed on the top part of the widget box. **Name**: title **Type**: STRING \| Optional `[title]="'Things'"` | | **Data** | | *Include Assigned* | The boolean flag (true, false) indicating whether the list must include also ASSIGNED things. **Name**: includeAssigned **Type**: BOOLEAN \| Optional **Default Value**: *true* `[includeAssigned]="false"` | | *Include Unassigned* | The boolean flag indicating whether the list must include also UNASSIGNED things. **Name**: includeUnassigned **Type**: BOOLEAN \| Optional **Default Value**: *false* `[includeUnassigned]="true"` | | *Initial Sorting* | The array of property names and criteria to use for sorting (e.g. ['name','asc','serialNumber','desc']). **Name**: sort **Type**: SORT_PROPERTIES \| Optional `[sort]="['name','asc','serialNumber','desc']"` | | *Page Size* | The number of items to load on each page. **Name**: pageSize **Type**: INTEGER \| Optional **Default Value**: *50* `pageSize="100"` | | *Query* | The array of conditions filtering out items. For instance: [query]='[{'property': 'connectionStatus', 'predicate': 'eq', 'value': '1'}]' Predicates: eq, beginsWith, like, notLike, isEmpty, isNotEmpty, gt, gte, lt, lte. **Name**: query **Type**: QUERY \| Optional **Predicates**: *beginsWith*, *eq*, *neq*, *gt*, *gte*, *isEmpty*, *isNotEmpty*, *lt*, *lte*, *like*, *notLike* `[query]="[{property:'prop1', predicate: 'eq', value: 'foo'}, {property:'prop2', predicate: 'in', value: ['bar', 'baz']}]"` | | *Query Variable* | The id of the page's used for searching. **Name**: queryFieldRef **Type**: STRING \| Optional `queryFieldRef="query-1"` | | **Advanced** | | *Details Mode* | The way the thing details is opened if in a dedicated PAGE or NONE to disable details. **Name**: detailsMode **Type**: ENUM \| Optional **Values**: *PAGE*, *NONE* **Default Value**: *PAGE* `detailsMode="PAGE"` | | *Expandable Composite Things* | Enable expandable accordion for sub things. **Name**: expandableCompositeThings **Type**: BOOLEAN \| Optional **Default Value**: *false* `[expandableCompositeThings]="true"` | | *Id* | The id of the widget. **Name**: id **Type**: STRING \| Optional `id="abc"` | | *Search Fields* | The array of fields used to filter out the objects when searching by a generic key. For instance: [searchFields]='['name', 'serialNumber', 'customer.name', 'customer.code']' **Name**: searchFields **Type**: PROPERTY (multiple) \| Optional `[searchFields]="['prop1', 'prop2']"` | | *Show Root Things Only* | Forces loading of root things only. **Name**: showRootThings **Type**: BOOLEAN \| Optional **Default Value**: *false* `[showRootThings]="true"` | | **Rendering** | | *Availability* | Configure availability based on active features on Digital Plan on Add-ons **Name**: hasFeature **Type**: FEATURE (multiple) \| Optional `[hasFeature]="['feature_a', 'feature_b']"` | | *CSS Class* | The name(s) of the CSS class used to customize the widget layout. **Name**: class **Type**: STRING \| Optional `class="abc"` | | *Visibility Condition* | The expression that allows you to reduce the visibility of the element. **Name**: *ngIf **Type**: STRING \| Optional `*ngIf="getUser().organizationId != null"` | | **Sub Elements** | | [*Metric*](/docs/thing-list-widget/#metric) | The metric whose label and current value must be rendered as a widget row. | | [*Property*](/docs/thing-list-widget/#property) | The property whose label and current value must be rendered as a widget row. | | [*Composite Part*](/docs/thing-list-widget/#composite-part) | The widget part combining multiple properties and metrics. | #### Metric `<metric>` | *Filter* | The name of the filter used to transform and display values. **Name**: filter **Type**: FILTER \| Optional `filter="fooBarFilter"` | | --- | --- | | *Label* | The metric alternative label. **Name**: label **Type**: STRING \| Optional `label="Temperature"` | | *Name* | The metric whose value(s) must be loaded by the widget. **Name**: name **Type**: METRIC \| Required `name="Temperature"` | | *Unit* | The unit of measurement to be displayed along the value. **Name**: unit **Type**: STRING \| Optional `unit="&deg;C"` | | **Advanced** | | *Column CSS Class* | The name(s) of the column CSS class used to customize the table column. **Name**: columnClass **Type**: COLUMN_CSS \| Optional `columnClass="my-column-custom-class"` | | *Display Mode* | The way the column is displayed. **Name**: displayMode **Type**: ENUM \| Optional **Values**: *VISIBLE*, *INITIALLY_HIDDEN*, *ALWAYS_HIDDEN* **Default Value**: *VISIBLE* `displayMode="VISIBLE"` | | *Show Header* | The flag indicated whether the header is visible. **Name**: showHeader **Type**: BOOLEAN \| Optional **Default Value**: *true* `[showHeader]="false"` | | *Visibility Condition* | The expression that allows you to reduce the visibility of the element. **Name**: *ngIf **Type**: STRING \| Optional `*ngIf="getUser().organizationId != null"` | #### Property `<property>` | *Description* | The property description. **Name**: description **Type**: STRING \| Optional `description="abc"` | | --- | --- | | *Filter* | The name of the filter used to transform and display values. **Name**: filter **Type**: FILTER \| Optional `filter="fooBarFilter"` | | *Label* | The property alternative label. **Name**: label **Type**: STRING \| Optional `label="Temperature"` | | *Name* | The property whose value must be loaded by the widget. **Name**: name **Type**: PROPERTY \| Required `name="serialNumber"` | | **Advanced** | | *Column CSS Class* | The name(s) of the column CSS class used to customize the table column. **Name**: columnClass **Type**: COLUMN_CSS \| Optional `columnClass="my-column-custom-class"` | | *Details Page Path* | The optional path that identifies the details page to be opened when a column value is clicked. **Name**: detailsPath **Type**: STRING \| Optional `detailsPath="abc"` | | *Display Mode* | The way the column is displayed. **Name**: displayMode **Type**: ENUM \| Optional **Values**: *VISIBLE*, *INITIALLY_HIDDEN*, *ALWAYS_HIDDEN* **Default Value**: *VISIBLE* `displayMode="VISIBLE"` | | *Include in Export* | The boolean flag indicating whether the property value should be included in the export even when not visible within the page. **Name**: includeInExport **Type**: BOOLEAN \| Optional **Default Value**: *false* `[includeInExport]="true"` | | *Show Header* | The flag indicated whether the header is visible. **Name**: showHeader **Type**: BOOLEAN \| Optional **Default Value**: *true* `[showHeader]="false"` | | *Visibility Condition* | The expression that allows you to reduce the visibility of the element. **Name**: *ngIf **Type**: STRING \| Optional `*ngIf="getUser().organizationId != null"` | #### Composite Part `<composite-part>` | *Description* | The composite-part description. **Name**: description **Type**: STRING \| Optional `description="abc"` | | --- | --- | | *Filter* | The filter applied on the composite-part to transform or display its value. **Name**: filter **Type**: FILTER \| Optional `filter="fooBarFilter"` | | *Label* | The label displayed by the widget. **Name**: label **Type**: STRING \| Optional `label="abc"` | | *Name* | The composite-part name. **Name**: name **Type**: STRING \| Optional `name="abc"` | | *Sorting Criteria* | The comma seprated list of property names and criteria to use for sorting the list column associated to this composite-part (e.g. properties.p1,ASC,properties.p2,DESC). **Name**: sortingCriteria **Type**: STRING \| Optional `sortingCriteria="properties.p1,ASC,properties.p2,DESC"` | | **Advanced** | | *Column CSS Class* | The name(s) of the column CSS class used to customize the table column. **Name**: columnClass **Type**: COLUMN_CSS \| Optional `columnClass="my-column-custom-class"` | | *Details Page Path* | The optional path that identifies the details page to be opened when a column value is clicked. **Name**: detailsPath **Type**: STRING \| Optional `detailsPath="abc"` | | *Display Mode* | The way the column is displayed. **Name**: displayMode **Type**: ENUM \| Optional **Values**: *VISIBLE*, *INITIALLY_HIDDEN*, *ALWAYS_HIDDEN* **Default Value**: *VISIBLE* `displayMode="VISIBLE"` | | *Show Header* | The flag indicated whether the header is visible. **Name**: showHeader **Type**: BOOLEAN \| Optional **Default Value**: *true* `[showHeader]="false"` | | *Visibility Condition* | The expression that allows you to reduce the visibility of the element. **Name**: *ngIf **Type**: STRING \| Optional `*ngIf="getUser().organizationId != null"` | | **Sub Elements** | | [*Metric*](/docs/thing-list-widget/#metric) | The metric whose value must be loaded within the composite-part. | | [*Property*](/docs/thing-list-widget/#property) | The property whose value must be loaded within the composite-part. | #### Metric `<metric>` | *Name* | The metric whose value(s) must be loaded by the widget. **Name**: name **Type**: METRIC \| Required `name="Temperature"` | | --- | --- | #### Property `<property>` | *Name* | The property whose value must be loaded by the widget. **Name**: name **Type**: PROPERTY \| Required `name="serialNumber"` | | --- | --- | ## Full Syntax Example ```xml                                         ```