Angular Tree Grid Sorting
In Ignite UI for Angular Tree Grid, data sorting is enabled on a per-column level, meaning that the igx-tree-grid can have a mix of sortable and non-sortable columns. Performing angular sort actions enables you to change the display order of the records based on specified criteria.
Note
Up until now, grouping/sorting worked in conjuction with each other. In 13.2 version, a new behavior which decouples gropuing from sorting is introduced. For example - clearing the grouping will not clear sorting expressions in the grid or vice versa. Still, if a column is both sorted and grouped, grouped expressions take precedence.
Angular Tree Grid Sorting Overview Example
Additionally there is a custom contextmenu added for sorting using igx-tree-grid's contextMenu
Output.
This is done via the sortable
input. With the Tree Grid sorting, you can also set the sortingIgnoreCase
property to perform case sensitive sorting:
<igx-column field="Name" header="Order Product" [dataType]="'string'" sortable="true"></igx-column>
Sorting Indicators
Having a certain amount of sorted columns could be really confusing if there is no indication of the sorted order.
The IgxTreeGrid provides a solution for this problem by indicating the index of each sorted column.
Sorting through the API
You can sort any column or a combination of columns through the Tree Grid API using the Tree Grid sort
method:
import { SortingDirection } from 'igniteui-angular';
// import { SortingDirection } from '@infragistics/igniteui-angular'; for licensed package
// Perform a case insensitive ascending sort on the ProductName column.
this.treeGrid.sort({ fieldName: 'Name', dir: SortingDirection.Asc, ignoreCase: true });
// Perform sorting on both the ProductName and Price columns.
this.treeGrid.sort([
{ fieldName: 'Name', dir: SortingDirection.Asc, ignoreCase: true },
{ fieldName: 'UnitPrice', dir: SortingDirection.Desc }
]);
Note
Sorting is performed using our DefaultSortingStrategy
algorithm. Any IgxColumnComponent
or ISortingExpression
can use a custom implementation of the ISortingStrategy
as a substitute algorithm. This is useful when custom sorting needs to be defined for complex template columns, or image columns, for example.
As with the filtering behavior, you can clear the sorting state by using the clearSort
method:
// Removes the sorting state from the ProductName column
this.treeGrid.clearSort('Name');
// Removes the sorting state from every column in the Tree Grid
this.treeGrid.clearSort();
Note
The sortStrategy
of the Tree Grid is of different type compared to the sortStrategy
of the column, since they work in different scopes and expose different parameters.
Note
The sorting operation DOES NOT change the underlying data source of the Tree Grid.
Initial sorting state
It is possible to set the initial sorting state of the Tree Grid by passing an array of sorting expressions to the sortingExpressions
property of the Tree Grid.
public ngAfterViewInit(): void {
this.treeGrid.sortingExpressions = [
{
dir: SortingDirection.Asc, fieldName: 'UnitPrice',
ignoreCase: true, strategy: DefaultSortingStrategy.instance()
}
];
}
Note
If values of type string
are used by a column of dataType
Date
, the Tree Grid won't parse them to Date
objects and using Tree Grid sorting
won't work as expected. If you want to use string
objects, additional logic should be implemented on an application level, in order to parse the values to Date
objects.
Sorting Indicators Templates
The sorting indicator icon in the column header can be customized using a template. The following directives are available for templating the sorting indicator for any sorting state (ascending, descending, none):
IgxSortHeaderIconDirective
– re-templates the sorting icon when no sorting is applied.
<ng-template igxSortHeaderIcon>
<igx-icon>unfold_more</igx-icon>
</ng-template>
IgxSortAscendingHeaderIconDirective
– re-templates the sorting icon when the column is sorted in ascending order.
<ng-template igxSortAscendingHeaderIcon>
<igx-icon>expand_less</igx-icon>
</ng-template>
IgxSortDescendningHeaderIconDirective
– re-templates the sorting icon when the column is sorted in descending order.
<ng-template igxSortDescendingHeaderIcon>
<igx-icon>expand_more</igx-icon>
</ng-template>
Styling
To get started with styling the sorting behavior, we need to import the index
file, where all the theme functions and component mixins live:
@use "igniteui-angular/theming" as *;
// IMPORTANT: Prior to Ignite UI for Angular version 13 use:
// @import '~igniteui-angular/lib/core/styles/themes/index';
Following the simplest approach, we create a new theme that extends the grid-theme
and accepts the $sorted-header-icon-color
and sortable-header-icon-hover-color
parameters.
$custom-theme: grid-theme(
$sorted-header-icon-color: #ffb06a,
$sortable-header-icon-hover-color: black
);
The last step is to include the component mixins:
@include grid($custom-theme);
Note
If the component is using an Emulated
ViewEncapsulation, it is necessary to penetrate
this encapsulation using ::ng-deep
:
:host {
::ng-deep {
@include grid($custom-theme);
}
}
Defining a color palette
Instead of hardcoding the color values like we just did, we can achieve greater flexibility in terms of colors by using the igx-palette
and igx-color
functions.
igx-palette
generates a color palette based on the primary and secondary colors that are passed:
$black-color: black;
$orange-color: #ffb06a;
$custom-palette: palette($primary: $black-color, $secondary: $orange-color);
And then with igx-color
we can easily retrieve color from the palette.
$custom-theme: grid-theme(
$sorted-header-icon-color: color($custom-palette, "secondary", 500),
$sortable-header-icon-hover-color: color($custom-palette, "primary", 500)
);
Note
The igx-color
and igx-palette
are powerful functions for generating and retrieving colors. Please refer to Palettes
topic for detailed guidance on how to use them.
Using Schemas
Going further with the theming engine, you can build a robust and flexible structure that benefits from schemas. A schema is a recipe of a theme.
Extend one of the two predefined schemas, that are provided for every component, in this case - _light-grid
:
// Extending the light grid schema
$custom-grid-schema: extend($_light-grid,
(
sorted-header-icon-color: (igx-color:('secondary', 500)),
sortable-header-icon-hover-color: (igx-color:('primary', 500))
)
);
In order to apply our custom schema we have to extend one of the globals (light
or dark
), which is basically pointing out the components with a custom schema, and after that add it to the respective component themes:
// Extending the global light-schema
$my-custom-schema: extend($light-schema,
(
igx-grid: $custom-grid-schema
)
);
// Defining our custom theme with the custom schema
$custom-theme: grid-theme(
$palette: $custom-palette,
$schema: $my-custom-schema
);
Don't forget to include the themes in the same way as it was demonstrated above.
Demo
Note
The sample will not be affected by the selected global theme from Change Theme
.
API References
Additional Resources
- Tree Grid overview
- Virtualization and Performance
- Paging
- Filtering
- Summaries
- Column Moving
- Column Pinning
- Column Resizing
- Selection