Angular Tree Grid Column Hiding

    The Ignite UI for Angular Tree Grid provides an IgxColumnActionsComponent with an IgxColumnHidingDirective which allows users to perform column hiding directly through the user interface or by using the Angular component. The Material UI Grid has a built-in column hiding UI, which can be used through the Tree Grid's toolbar to change the visible state of the columns. In addition, developers can always define the column hiding UI as a separate component and place it anywhere they want on the page.

    Angular Tree Grid Column Hiding Example

    EXAMPLE

    Like this sample? Get access to our complete Ignite UI for Angular toolkit and start building your own apps in minutes. Download it for free.

    Tree Grid Setup

    Let's start by creating our Tree Grid and binding it to our data. We will also enable both filtering and sorting for the columns.

    <!--columnHiding.component.html-->
    
    <igx-tree-grid #treeGrid [data]="data" primaryKey="ID" foreignKey="ParentID" [autoGenerate]="false" width="100%"
        height="560px" columnWidth="200px" [allowFiltering]="true">
        <igx-column [field]="'Name'" dataType="string" [sortable]="true" [disableHiding]="true"></igx-column>
        <igx-column [field]="'ID'" dataType="number" [sortable]="true"></igx-column>
        <igx-column [field]="'Title'" dataType="string" [sortable]="true" [disableHiding]="true"></igx-column>
        <igx-column [field]="'HireDate'" dataType="date" [sortable]="true" [hidden]="true"></igx-column>
        <igx-column [field]="'Age'" dataType="number" [sortable]="true" [hidden]="true"></igx-column>
        <igx-column [field]="'Address'" dataType="string" [sortable]="true"></igx-column>
        <igx-column [field]="'City'" dataType="string" [sortable]="true"></igx-column>
        <igx-column [field]="'Country'" dataType="string" [sortable]="true"></igx-column>
        <igx-column [field]="'Fax'" dataType="string" [sortable]="true"></igx-column>
        <igx-column [field]="'PostalCode'" dataType="string" [sortable]="true"></igx-column>
        <igx-column [field]="'Phone'" dataType="string" [sortable]="true"></igx-column>
    </igx-tree-grid>
    html

    Toolbar's Column Hiding UI

    The built-in Column Hiding UI is placed inside an IgxDropDownComponent in the Tree Grid's toolbar. We can show/hide the Column Hiding UI by using this exact dropdown. For this purpose all we have to do is set both the IgxGridToolbarActionsComponent and the IgxGridToolbarHidingComponent inside of the Tree Grid. We will also add a title to our toolbar by using the IgxGridToolbarTitleComponent and a custom style for our Tree Grid's wrapper.

    <!--columnHiding.component.html-->
    
    <div class="grid__wrapper">
        <igx-tree-grid ...>
            <igx-grid-toolbar>
                <igx-grid-toolbar-title>Employees</igx-grid-toolbar-title>
                <igx-grid-toolbar-actions>
                    <igx-grid-toolbar-hiding></igx-grid-toolbar-hiding>
                </igx-grid-toolbar-actions>
            </igx-grid-toolbar>
            ...
        </igx-tree-grid>
    </div>
    html
    /* columnHiding.component.css */
    
    .grid__wrapper {
        margin: 10px;
    }
    css

    The Tree Grid provides us with some useful properties when it comes to using the toolbar's column hiding UI. By using the igx-grid-toolbar-hiding title property, we will set the title that is displayed inside the dropdown button in the toolbar.

    <!--columnHiding.component.html-->
    
    <div class="grid__wrapper">
        <igx-tree-grid>
            <igx-grid-toolbar>
                <igx-grid-toolbar-title>Employees</igx-grid-toolbar-title>
                <igx-grid-toolbar-actions>
                    <igx-grid-toolbar-hiding #hidingActionRef title="Column Hiding"></igx-grid-toolbar-hiding>
                </igx-grid-toolbar-actions>
            </igx-grid-toolbar>
        </igx-tree-grid>
    </div>
    html

    By using the columnsAreaMaxHeight property of the IgxGridToolbarHidingComponent, we can set the maximum height of the area that contains the column actions. This way if we have a lot of actions and not all of them can fit in the container, a scrollbar will appear, which will allow us to scroll to any action we want.

    // columnHiding.component.ts
    
    public ngAfterViewInit() {        
        this.hidingActionRef.columnsAreaMaxHeight = "200px";
    }
    typescript

    In order to use the expanded set of functionalities for the column hiding UI, we can use the IgxColumnActionsComponent's columnsAreaMaxHeight property. This way we can use it according to our application's requirements.

    You can see the result of the code from above at the beginning of this article in the Angular Column Hiding Example section.

    Custom Column Hiding UI

    Let's say we want to manually define our IgxColumnActionsComponent, add the IgxColumnHidingDirective so that it knows what its purpose would be and put it anywhere on the page. First, however, we need to import the IgxColumnActionsModule.

    // app.module.ts
    
    ...
    import {
        ...
        IgxColumnActionsModule 
    } from 'igniteui-angular';
    // import { ..., IgxColumnActionsModule } from '@infragistics/igniteui-angular'; for licensed package
    
    @NgModule({
        ...
        imports: [..., IgxColumnActionsModule],
    })
    export class AppModule {}
    typescript

    Now let's create our IgxColumnActionsComponent. In our application, we will place it next to the grid (which is not the case with the toolbar's column hiding UI, where the component is inside a dropdown by design). We will also set the columns property of the component to the columns of our Tree Grid and include some custom styles to make our application look even better!

    <!--columnHiding.component.html-->
    
    <div class="columnHidingContainer">
        <igx-column-actions igxColumnHiding #columnHidingUI [columns]="treeGrid.columns">
        </igx-column-actions>
    </div>
    <div class="gridContainer">
        <igx-tree-grid #treeGrid [data]="data" primaryKey="ID" foreignKey="ParentID" [autoGenerate]="false" width="100%" height="500px" columnWidth="200px">
            ...
        </igx-tree-grid>
    </div>
    html
    /* columnHiding.component.css */
    
    .grid__wrapper {
        margin: 15px;
        display: flex;
        flex-direction: row;
    }
    
    .columnHidingContainer {
        min-width: 250px;
        height: 560px;
        display: flex;
        flex-direction: column;
        padding-left: 20px;
        padding-right: 20px;
        border: 1px gray;
        border-radius: 10px;
        box-shadow: 1px 1px 2px 2px rgba(50, 50, 50, 0.25);
        igx-column-actions {
            height: 460px;
        }
    }
    
    .columnsOrderOptionsContainer {
        margin-top: 20px;
        margin-bottom: 20px;
    }
    
    .gridContainer {
        width: 100%;
        min-width: 200px;
        display: flex;
        flex-direction: column;
        margin-left: 30px;    
    }
    css

    Add title and filter prompt

    A couple more things we can do in order to enrich the user experience of our column hiding component is to set the title and the filterColumnsPrompt properties. The title is displayed on the top and the filterColumnsPrompt is the prompt text that is displayed in the filter input of our column hiding UI.

    <!--columnHiding.component.html-->
    
    <div class="columnHidingContainer">
        <igx-column-actions igxColumnHiding #columnHidingUI [columns]="treeGrid.columns"
                           title="Column Hiding" filterColumnsPrompt="Type here to search">
        </igx-column-actions>
    </div>
    html

    Add column display order options

    We can also allow the user to choose the display order of the columns in the column hiding UI. For this purpose we will use the columnDisplayOrder property, which is an enumeration type property and has the following options:

    • Alphabetical (order the columns alphabetically)
    • DisplayOrder (order the columns according to the way they are displayed in the Tree Grid)

    Let's create a couple of nicely designed radio buttons for our options! We just have to go ahead and get the IgxRadio module.

    // app.module.ts
    
    ...
    import {
        ...
        IgxRadioModule    
    } from 'igniteui-angular';
    // import { ..., IgxRadioModule } from '@infragistics/igniteui-angular'; for licensed package
    
    @NgModule({
        ...
        imports: [..., IgxRadioModule],    
    })
    export class AppModule {}
    typescript

    Now all we have to do is bind the checked property of both radio buttons respectively with different conditions and handle their click events.

    <!--columnHiding.component.html-->
    
    <div class="columnHidingContainer">
        ...
        <div class="columnsOrderOptionsContainer">
            <igx-radio [checked]="columnHidingUI.columnDisplayOrder === 'Alphabetical'"
                       (click)="columnHidingUI.columnDisplayOrder = 'Alphabetical'">
                Alphabetical order
            </igx-radio>
            <igx-radio [checked]="columnHidingUI.columnDisplayOrder === 'DisplayOrder'"
                       (click)="columnHidingUI.columnDisplayOrder = 'DisplayOrder'">
                Display order
            </igx-radio>
        </div>
    </div>
    html

    Disable hiding of a column

    We can easily prevent the user from being able to hide columns through the column hiding UI by simply setting their disableHiding property to true.

    <!--columnHiding.component.html-->
    
    <div class="gridContainer">
        <igx-tree-grid ... >
            ...
            <igx-column [field]="'Name'" dataType="string" [sortable]="true" [disableHiding]="true"></igx-column>
            <igx-column [field]="'Title'" dataType="string" [sortable]="true" [disableHiding]="true"></igx-column>
            ...
        </igx-tree-grid>
    </div>
    html

    If all went well, this is how our column hiding UI component should look like:

    EXAMPLE

    App Builder | CTA Banner

    Styling

    To get started with styling the column actions component, 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';
    scss

    By using the simplest approach, we create a new theme that extends the column-actions-theme and accepts the $title-color and the $background-color parameters.

    $custom-column-actions-theme: column-actions-theme(
      $background-color: #292826,
      $title-color: #ffcd0f
    );
    scss

    As seen, the column-actions-theme only controls colors for the column actions container, but does not affect the buttons, checkboxes and the input-group inside of it. Let's say we want to style the buttons as well, so we will create a new button theme:

    $custom-button: button-theme(
      $foreground: #292826, 
      $disabled-foreground: rgba(255, 255, 255, .54)
    );
    scss

    Instead of hardcoding the color values like we just did, we can achieve greater flexibility in terms of colors by using the palette and color functions. Please refer to Palettes topic for detailed guidance on how to use them.

    In this example we only changed the text-color of the flat buttons and the button disabled color, but the button-theme provides way more parameters to control the button style.

    The last step is to include the component mixins, each with its respective theme:

    @include css-vars($custom-column-actions-theme);
    
    .igx-column-actions {
      @include css-vars($custom-button);
    }
    scss

    We include the created button-theme within .igx-column-actions, so that only the column hiding buttons would be styled. Otherwise other buttons in the grid would be affected too.

    If the component is using an Emulated ViewEncapsulation, it is necessary to penetrate this encapsulation using ::ng-deep for the components inside the column action component (buttons, checkboxes ...etc):

    @include css-vars($custom-column-actions-theme);
    
    :host {
      ::ng-deep {
        .igx-column-actions {
          @include css-vars($custom-button);
        }
      }
    }
    scss

    Demo

    EXAMPLE

    API References

    In this article we learned how to use the built-in column hiding UI in the Tree Grid's toolbar and we defined it as a separate component as well. We introduced a UI that allows the user to choose between different column orders and we set our own custom title and filter prompt texts. We also used an additional Ignite UI for Angular component - the IgxRadio button.

    The column hiding UI has a few more APIs to explore, which are listed below.

    Additional components and/or directives with relative APIs that were used:

    IgxTreeGridComponent properties:

    IgxColumnComponent properties:

    IgxGridToolbarComponent properties:

    IgxGridToolbarComponent components:

    IgxGridToolbarComponent methods:

    IgxTreeGridComponent events:

    IgxRadioComponent

    Styles:

    Additional Resources

    Our community is active and always welcoming to new ideas.