Tree view¶
The tree component is used to display hierarchical data and supports a wide range of configurable options and features.
Usage¶
When to use¶
- Data in hierarchical form can be represented in a tree structure. Examples include directory, organization and location structures.
- Apply a tree view to large data sets that can be categorized into two or more levels.
Best practices¶
- A tree view should not have more than four sub-levels (not including the root node).
- The most commonly accessed objects should appear in the first two levels.
- Use a natural hierarchical structure that is familiar to most users. Balance discoverability with a predictable user model that minimizes confusion.
- A tree view should be supported by a breadcrumb within the content area.
- Use nodes with icons only if you have meaningful icons available.
- Don't mix nodes with icons and nodes with just a label within the same hierarchy.
Design¶
Elements¶
A tree view consists of the following elements:
- Expand/collapse icon
- Node icon (optional)
- Label
- Badge (optional)
- Indicator (optional)
- Node: Hover state
- Node: Selected state
- Checkbox and/or option box per node (optional)
- Options menu (e.g. additional commands) (optional)
Item representation¶
The standard tree view component supports 2 different node representations:
- Node with main-label
- Node with main-label and sub-label
Features¶
The tree view component has the following features:
- Showing multiple trees in a list.
- Showing the trees in a flat mode with navigation/breadcrumb on top.
- Children of parent nodes are lazy loaded upon request (in case they are not yet available in the model).
- Menu support via command pattern; the commands can be set via input properties.
- Multi selection and focus support.
- Checkbox and/or option box per node.
- Virtualization support: Input properties allow to set the page size and the number of pages to be virtualized. Current limitation is roughly half a million of tree items. This is due to some strange behavior with flex containers.
- Grouped list support.
- Support of templating, if templates are present.
- Support of expand and collapse of all child elements.
Expand / collapse all¶
The tree view component supports expanding and collapsing of all child elements:
- Expand all
- Collapse all
Position of tree view¶
If the tree view is the main navigation of a page, then it's placed to the left.
If the tree view is part of a page then it will be represented as a card.
Note: This pattern is still work in progress and might therefore be subject to change.
Responsive behavior¶
The tree view has a default width 300px
to give enough space for the labels. If the height is not enough to show all the navigation items, a scrollbar will be available.
Menu labels¶
Menu labels have to be short and concise with a maximum of two words. They share the same space with all items, like labels, icons, badges, etc. The label will be truncated at the end with 3 ...
, if there is no sufficient space.
Variant¶
Showing the tree in flat mode with back-navigation on top:
In flat mode, a node also offers a third node representation format with (1) item with main-label, sub-label and value.
Code¶
Usage¶
Within a module
import { SiTreeViewModule } from '@siemens/element-ng/tree-view';
@NgModule({
imports: [SiTreeViewModule, ...]
})
or as a standalone component
import {
SiTreeViewComponent,
SiTreeViewItemComponent,
SiTreeViewItemDirective,
SiTreeViewItemTemplateDirective
} from '@siemens/element-ng/tree-view';
@Component({
imports: [
SiTreeViewComponent,
SiTreeViewItemComponent,
SiTreeViewItemDirective,
SiTreeViewItemTemplateDirective
]
})
The items
property is the most important property of the si-tree-view
component. It is used to provide an array of TreeItem
objects to be displayed.
Note that all properties of the TreeItem
interface are optional. This allows you to directly feed a JSON structure (e.g. from an API) to the tree view.
Defines the data for a tree item. All properties are optional. | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Expand/Collapse¶
Expand and collapsing of all nodes can be enabled via the expandCollapseAll
property.
Dynamic Context Menu¶
The context menu can be dynamically constructed using the MenuItemsProvider
.
Custom Templates¶
The tree also supports custom templates for tree items. The TreeItem
object model supports the property templateName
to apply a custom template.
As you can see in the example below, you can create a ng-template structured as follows where the templateName
of the model has to match the siTreeViewItemTemplate
value:
<ng-template let-item siTreeViewItemTemplate="yourTemplateName">
<!-- your template -->
</ng-template>
The following example demonstrates the use of two templates to render the root and child nodes differently.
Adding, removing, updating tree items¶
Due to the way change detection works, mutations on the tree item structure assigned to the items
property might not be detected by the tree view. Thus, the UI will not reflect the changes in the model.
Depending on the use case, there are different ways to trigger the change detection mechanism of the tree view:
- Create and assign a new reference, e.g.
this.items = [...this.items];
- Call
refresh()
function on the tree component - Use
addChildItems()
function on the tree component
Note: If items should be lazy-loaded when expanding a parent, consider using the loadChildren
event which allows to append children while properly handling change detection.
The following example shows how to use addChildItems()
to dynamically add tree items as root elements or as children of an existing tree item:
@Component({
selector: "app-sample",
template: `
<button type="button" class="btn btn-primary" (click)="addItemToRoot()">
Add item to Root
</button>
<button type="button" class="btn btn-primary" (click)="addItemToCompany1()">
Add item to Company1
</button>
<si-tree-view class="vh-100" [items]="items"></si-tree-view>
`,
imports: [SiTreeViewModule],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true
})
export class SampleComponent {
@ViewChild(SiTreeViewComponent, { static: true })
private treeViewComponent!: SiTreeViewComponent;
private count = 0;
protected items: TreeItem[] = [{ label: "Company1" }];
protected addItemToRoot() {
this.treeViewComponent.addChildItems([
{ label: `new root item ${++this.count}`, state: "leaf" }
]);
}
protected addItemToCompany1() {
this.treeViewComponent.addChildItems(
[{ label: `new root item ${++this.count}`, state: "leaf" }],
this.items[0]
);
}
}
Playground with various options¶
SiTreeViewComponent API Documentation¶
si-tree-view
Implements a tree view with the following main capabilities:
Showing multiple trees. The data of the trees is set via the input property 'items'.
Showing the trees in a flat mode with navigation/breadcrumb on top.
A tree/list item is composed of a 'folder' icon, any item icon, the label, two additional datafields and a context menu button.
Children of parent nodes are lazy loaded upon request (in case they are not yet available in model.)
Context menu support via context menu item: the context menu items can be set via input properties.
Multi selection and focus support.
Checkboxes and / or option boxes per tree node.
Virtualization support: Input properties allow to set the page size and the number of pages to be virtualized.
Current limitation is roughly half a million of nodes. This is due to some 'strange' behavior with flex containers.
Set the input properties 'pageSize' and 'pagesVirtualized' to a reasonable amount of virtualized items.
The number of virtualized items is the product of the pageSize and the pagesVirtualized (number of pages virtualized).
Choose a value in the area of 50 virtualized items, dependent on the screen size. Check at runtime if appropriate!
Grouped List support: The component does also support grouped lists.
See the test client implementation of this package for all functionality.
Input Properties¶
Name | Type | Default | Description |
---|---|---|---|
ariaLabel ¶ | TranslatableString | Aria label for the tree view. Needed for a11y, alternatively use ariaLabelledBy . | |
ariaLabelledBy ¶ | string | Aria labelled by for the tree view. Needed for a11y, alternatively use ariaLabel . | |
childrenIndentation ¶ | number | DEFAULT_CHILDREN_INDENTATION | The indentation in pixel for the children in respect to its parent. |
collapseAllTooltip ¶ | TranslatableString | $localize`:@@SI_TREE_VIEW.COLLAPSE_ALL:Collapse all` | Tooltip text shown for the collapse all icon. |
compactMode ¶ | boolean | false | Enable the compact mode, making it more vertically compact. |
contextMenuItems ¶ | ((MenuItem | MenuItem )[] | MenuItemsProvider ) | [] | The context menu items which are bound to the context menu of all tree items, or a menu item provider function that is invoked for each tree item once. |
deleteChildrenOnCollapse ¶ | boolean | false | Sets if children are deleted upon collapsing tree items. This feature might be used, if children shall be lazy loaded always upon expanding a tree item. |
enableCheckbox ¶ | boolean | false | Sets if the tree items shall show a checkbox. |
enableContextMenuButton ¶ | boolean | true | Shows or hides context menu button and also controls context menu visibility on right click. |
enableDataField1 ¶ | boolean | false | Shows or hides additional information below the label. |
enableDataField2 ¶ | boolean | false | Shows or hides additional information below the label. |
enableIcon ¶ | boolean | true | Shows or hides icon |
enableOptionbox ¶ | boolean | false | Sets if the tree items shall show an optionbox. |
enableSelection ¶ | boolean | false | Allows / disabled selecting of tree items by clicking on them. |
enableStateIndicator ¶ | boolean | true | Shows or hides state pipe. |
expandAllTooltip ¶ | TranslatableString | $localize`:@@SI_TREE_VIEW.EXPAND_ALL:Expand all` | Tooltip text shown for the expand all icon. |
expandCollapseAll ¶ | boolean | false | Enable buttons for collapse and expand all. Does not work when flatTree is enabled. |
expandOnClick ¶ | boolean | false | Sets if the tree items should expand/collapse when clicking on them. Does not work when flatTree is enabled or the tree item is not selectable. |
flatTree ¶ | boolean | false | Sets if the tree view shall be displayed as flat tree list with a breadcrumb. A flat tree only shows the one level at the time and lists the tree items of the current level as a list. |
folderStateStart ¶ | boolean | true | Sets if the folder state icon shall be shown on the left (in LTR) or on the right (in LTR) side of the tree item. Per default the icon will be shown on the left (in LTR). Has no effect if flatTree is enabled. |
groupedList ¶ | boolean | false | Sets if the tree view is displayed as a grouped list. Important: In this mode, only the first two hierarchies of the tree model are considered! |
horizontalScrolling ¶ | boolean | false | Enable horizontal scrolling. When disabled (the default), an ellipsis is used for overflowing text |
icons ¶ | TreeViewIconSet | Customize icons for treeview. | |
inheritChecked ¶ | boolean | true | Sets if the checkbox state of a tree item is inherited to its children/parent. |
isVirtualized ¶ | boolean | true | Sets if the tree list shall virtualize the tree items. This input field must be set at startup and shall not be changed afterwards. |
items ¶ | TreeItem <any >[] | ... | Sets the root tree items of all the trees (Required). |
noActionsString ¶ | string | 'No actions available' | String to be shown when there are no content actions. |
pageSize ¶ | number | 10 | Number of rows per page. Used for the virtualization of rows (number of rows per page). |
pagesVirtualized ¶ | number | 6 | Number of pages which are virtualized. |
selectedItem ¶ | (TreeItem <any > | TreeItem <any >[]) | Sets the tree item to be selected. | |
singleSelectMode ¶ | boolean | false | Sets if the tree shall force single tree item selection. |
Output Properties¶
Name | Type | Description |
---|---|---|
itemsVirtualizedChanged ¶ | ItemsVirtualizedArgs | Triggered upon virtualization (or unvirtualization) of a tree item. |
loadChildren ¶ | LoadChildrenEventArgs | Triggered upon the request of loading the children of a tree item. |
treeItemCheckboxClicked ¶ | CheckboxClickEventArgs | Triggered upon clicking the checkbox of a tree item. |
treeItemClicked ¶ | TreeItem <any > | Triggered upon clicking the label of a tree item. |
treeItemFolderClicked ¶ | FolderStateEventArgs | Triggered upon clicking the folder of a tree item. |
treeItemFolderStateChanged ¶ | FolderStateEventArgs | Triggered upon a state change of the folder of a tree item. |
treeItemsSelected ¶ | TreeItem <any >[] | Triggered upon the selection of a tree item (multi selection supported). |
Attributes and Methods¶
Name | Type | Default | Description |
---|---|---|---|
addChildItems(...) ¶ | (children: TreeItem <any >[], parent: TreeItem <any >, position: number ) => void | Add tree items as root elements or as children of an existing tree item. Parameters | |
collapseAll(...) ¶ | (items: TreeItem <any >[]) => void | Collapses all tree items. Parameters | |
collapseTreeItem(...) ¶ | (item: TreeItem ) => void | Collapses the provided tree item. Parameters
| |
(readonly) dropListItems ¶ | TreeItem <any >[] | Can be used for [cdkDropListData] when using cdk drag and drop. | |
expandAll(...) ¶ | (items: TreeItem <any >[]) => void | Expands all tree items. Parameters | |
expandTreeItem(...) ¶ | (item: TreeItem ) => void | Expands the provided tree item. Parameters
| |
refresh() ¶ | () => void | Forces a refresh of the view considering the current tree item model. Needs to be called when tree items have been added, removed, or updated via model in ways that do not trigger an automatic update of the view. | |
scrollItemIntoView(...) ¶ | (treeItem: TreeItem ) => void | Scrolls the specified tree item into view. Tree items will be expanded if required. Parameters
| |
showTreeItem(...) ¶ | (item: TreeItem ) => void | Updates the tree to visualize the provided tree item by expanding all its parent items, collapsing all other first level tree items and scroll to the provided item. Parameters
| |
(readonly) templates ¶ | Signal <readonly SiTreeViewItemTemplateDirective []> | ... | The injected content with included SiTreeViewItemTemplateDirective. |
Types Documentation¶
Represents a translatable string. This can either be a translation key, e.g. ACTIONS.EDIT that will be automatically translated when displayed on the UI or a pre-translated string, e.g. Edit . Equivalent to a normal string in usage and functionality. |
---|
Variable |
---|
| |||||||
|
| |||||||
|
| ||||||||
|
| ||||||||
|
Translatable import imported from @siemens/element-translate-ng |
---|
|
|
Represents a menu item that navigates using the Angular Router. Requires a configured Angular Router. | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
The check box state of a tree item. |
---|
The folder state of a tree item. |
---|
|
Implement and provide this to an SiMenuFactoryComponent to receive trigger events. | |||||||
---|---|---|---|---|---|---|---|
| |||||||
|
| |||||||
|
Used in events emitted from SiLinkActionService | |||
---|---|---|---|
|
|
| |||||||
| |||||||
|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
A service wrapping ResizeObserver . This is a service for those reasons: - only one ResizeObserver should be used for performance reason. - For Angular change detection to work, explicit ngZone calls are necessary - Observable stream | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
A directive that turns its host element into a trigger for a popup menu. It can be combined with cdkMenuItem to create sub-menus. If the element is in a top level MenuBar it will open the menu on click, or if a sibling is already opened it will open on hover. If it is inside of a Menu it will open the attached Submenu on hover regardless of its sibling state. | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||
|
| |||||||||||||||||||||
| |||||||||||||||||||||
|
| |||||||
| |||||||
|
Except where otherwise noted, content on this site is licensed under MIT License.