Wijmo FlexGrid: Displaying Group Headers and Locale-Specific Attribute Arrays

Posted by: nilesh_nichal on 7 July 2025, 9:54 am EST

  • Posted 7 July 2025, 9:54 am EST - Updated 7 July 2025, 10:01 am EST

    Hi team,

    I’m working with Wijmo FlexGrid in an Angular application and trying to dynamically bind a nested JSON structure with grouping to the FlexGrid. My JSON data represents a catalog of attributes, where some of the nodes are grouping nodes (isGrouping: true) and others are leaf attributes.

    Here’s a simplified structure of my data:

    service data

     let data = {
            "attributes" : [ 
                {
                    "nodeId" : 737819,
                    "attributeName" : "About",
                    "attributeType" : "STRING",
                    "attributePath" : "KTCatalogSpec/About",
                    "isGrouping": false,
                    "en_US" : [{
                        "nodeId" : 737818,
                        "isEditable": true,
                        "attributeName" : "en_US",
                        "localeIdentifier": "en_US",
                        "attributeType" : "STRING",
                        "attributePath" : "KTCatalogSpec/About/en_US",
                        "value" : "Eye Comfort HUAWEI FullView Display1   |   Super Device2   |   HUAWEI Metaline Antenna",
                        "approvalStatus": false
                    }],
                    "en_CA": [{
                        "nodeId" : 740613,
                        "isEditable": true,
                        "attributeName" : "en_CA",
                        "localeIdentifier": "en_CA",
                        "attributeType" : "STRING",
                        "attributePath" : "KTCatalogSpec/About/en_CA",
                        "value" : null,
                        "approvalStatus": false
                    }]
                },
                {
                    "nodeId" : 737821,
                    "attributeName" : "About_Prod",
                    "attributeType" : "STRING",
                    "attributePath" : "KTCatalogSpec/About_Prod",
                    "isGrouping": false,
                    "en_US" : [{
                        "nodeId" : 737816,
                        "isEditable": true,
                        "attributeName" : "en_US",
                        "localeIdentifier": "en_US",
                        "attributeType" : "STRING",
                        "attributePath" : "KTCatalogSpec/About_Prod/en_US#0",
                        "value" : "HUAWEI MateBook D 14 comes with 11.1% larger view,8 thanks to its  16:10 golden aspect ratio3 to serve as the perfect companion for your work, leisure, and studies.",
                        "approvalStatus": false
                    },
                    {
                        "nodeId" : 737816,
                        "isEditable": true,
                        "attributeName" : "en_US",
                        "localeIdentifier": "en_US",
                        "attributeType" : "STRING",
                        "attributePath" : "KTCatalogSpec/About_Prod/en_US#1",
                        "value" : "90% screen-to-body ratio4 3.5 mm bezels9 allow each glimpse to reward you with a tapestry of colour, texture, and intrigue.",
                        "approvalStatus": false
                    }],
                    "en_CA": []
                },
                {
                    "nodeId" : 737822,
                    "attributeName" : "Description",
                    "attributeType" : "STRING",
                    "attributePath" : "KTCatalogSpec/Description",
                    "isGrouping": false,
                    "en_US" : [ {
                        "nodeId" : 737817,
                        "isEditable": true,
                        "attributeName" : "en_US",
                        "localeIdentifier": "en_US",
                        "attributeType" : "STRING",
                        "attributePath" : "KTCatalogSpec/Description/en_US",
                        "value" : "This laptop comes with an all-new sleek design, with its metallic body12 being applied with a sandblasting and anodized process, to deliver fine textures while becoming resistant to wear and tear, taking your on-the-go life to exciting new places.",
                        "approvalStatus": false
                    }],
                    "en_CA": [{
                        "nodeId" : 740612,
                        "isEditable": true,
                        "attributeName" : "en_CA",
                        "localeIdentifier": "en_CA",
                        "attributeType" : "STRING",
                        "attributePath" : "KTCatalogSpec/Description/en_CA",
                        "value" : null,
                        "approvalStatus": false
                    }]
                },
                {
                    "nodeId" : 737821,
                    "attributeName" : "Localized grp",
                    "attributeType" : "STRING",
                    "attributePath" : "KTCatalogSpec/Localized grp",
                    "isGrouping": true,
                    "childList": [
                    {
                        "nodeId" : 737811,
                        "attributeName" : "Prod_desc",
                        "attributeType" : "STRING",
                        "attributePath" : "KTCatalogSpec/Localized grp/Prod_desc",
                        "isGrouping": false,
                        "en_US" : [{
                            "nodeId" : 737810,
                            "isEditable": true,
                            "attributeName" : "en_US",
                            "localeIdentifier": "en_US",
                            "attributeType" : "STRING",
                            "attributePath" : "KTCatalogSpec/Localized grp/Prod_desc/en_US",
                            "value" : "HUAWEI MateBook D 14 has passed more than 10 thousand times of durability tests, which means that key parts such as the screen and keyboard are durable enough to resist drops and shocks.13",
                            "approvalStatus": false
                        }],
                        "en_CA": [{
                            "nodeId" : 740610,
                            "isEditable": true,
                            "attributeName" : "en_CA",
                            "localeIdentifier": "en_CA",
                            "attributeType" : "STRING",
                            "attributePath" : "KTCatalogSpec/Localized grp/Prod_desc/en_CA",
                            "value" : null,
                            "approvalStatus": false
                        }]
                    },
                    {
                            "nodeId" : 737813,
                            "attributeName" : "Multi_Prod_desc",
                            "attributeType" : "STRING",
                            "attributePath" : "KTCatalogSpec/Localized grp/Multi_Prod_desc",
                            "isGrouping": false,
                            "en_US" : [{
                                "nodeId" : 737807,
                                "isEditable": true,
                                "attributeName" : "en_US",
                                "localeIdentifier": "en_US",
                                "attributeType" : "STRING",
                                "attributePath" : "KTCatalogSpec/Localized grp/Multi_Prod_desc/en_US#0",
                                "value" : "The 13th Gen Intel® Core™ processor gives you more power to play with, and features like Super Turbo16 and maximum 30 W TDP6 allow you to decompress a 1 GB compressed file in an unbelievable 5.4 seconds.17",
                                "approvalStatus": false
                            },
                            {
                                "nodeId" : 737807,
                                "isEditable": true,
                                "attributeName" : "en_US",
                                "localeIdentifier": "en_US",
                                "attributeType" : "STRING",
                                "attributePath" : "KTCatalogSpec/Localized grp/Multi_Prod_desc/en_US#1",
                                "value" : "HUAWEI MateBook D 14 packs a special antenna that expands the connection range, increases file download speed by 43%,18 and boosts anti-interference and wall penetration performance, so that you can stay online, wherever life takes you.",
                                "approvalStatus": false
                            }
                        ],
                        "en_CA": [{
                                "nodeId" : 740610,
                                "isEditable": true,
                                "attributeName" : "en_CA",
                                "localeIdentifier": "en_CA",
                                "attributeType" : "STRING",
                                "attributePath" : "KTCatalogSpec/Localized grp/Prod_desc/en_CA#0",
                                "value" : null,
                                "approvalStatus": false
                            },
                            {
                                "nodeId" : 740610,
                                "isEditable": true,
                                "attributeName" : "en_CA",
                                "localeIdentifier": "en_CA",
                                "attributeType" : "STRING",
                                "attributePath" : "KTCatalogSpec/Localized grp/Prod_desc/en_CA#1",
                                "value" : null,
                                "approvalStatus": false
                            }
                        ]
                    }
                    ]
                }
            ]
        }
    


    I am trying to bind this to wj-flex-grid with grouping based on isGrouping, and display source and target locale fields dynamically (en_US and en_CA) along with approval status, etc.

    Here’s what I have so far in TypeScript:

     public selectedTargetLocale: string = "en_CA";
        public selsectedSourceLocale = "en_US"
    	this.data = new wjcCore.CollectionView(this.dataService.getData(),  {
                groupDescriptions: ['isGrouping']
        });
    

    HTML

    [code]<div #gridContainer

    class=“static-mdm-grid-ex version-grid-wrapper grid-without-border”>

    <div class="row translation-head">
        <div class="col-lg-12">
            <div class="col-md-4">
                Search
            </div>
            <div class="col-md-8 pdr-0">
                <div class="col-md-4 pdl-0">
                    <div class="set-box">
                        <label class="text-ellipsis-single-line"
                               [title]="'Source Language'"
                               for="specsPerPage"> {{'Source Language'}}
                        </label>
                    </div>
                    <wj-combo-box #pageSize
                                  class="filter-dropdown page-size"
                                  [isEditable]="false"
                                  [itemsSource]="options"
                                  [displayMemberPath]="'text'"
                                  [selectedValuePath]="'value'"
                                  id="srcLanguage"
                                  aria-label="Source Language">
                        <ng-template wjItemTemplate
                                     let-item="item"
                                     let-itemIndex="itemIndex">
                            <div class="item"
                                 [title]="item.text">
                                {{item.text}}
                            </div>
                        </ng-template>
                    </wj-combo-box>
    
                </div>
                <div class="col-md-4 pdl-0 pdr-0">
                    <div class="set-box">
                        <label class="text-ellipsis-single-line"
                               [title]="'Target Language'"
                               for="specsPerPage"> {{'Target Language'}}
                        </label>
                    </div>
                    <wj-combo-box #pageSize
                                  class="filter-dropdown page-size"
                                  [isEditable]="false"
                                  [itemsSource]="options"
                                  [displayMemberPath]="'text'"
                                  [selectedValuePath]="'value'"
                                  id="srcLanguage"
                                  aria-label="Target Language">
                        <ng-template wjItemTemplate
                                     let-item="item"
                                     let-itemIndex="itemIndex">
                            <div class="item"
                                 [title]="item.text">
                                {{item.text}}
                            </div>
                        </ng-template>
                    </wj-combo-box>
                </div>
                <div class="col-md-4 button-align">
                    <button class="btn btn-primary btn-text btn-search text-ellipsis-single-line"
                            (click)="clickApply()"> Translate</button>
                    <!-- </div>
            <div class="col-md-2 button-align"> -->
                    <button class="btn btn-primary  approve-btn btn-text btn-search text-ellipsis-single-line"
                            (click)="clickApply()"> Approve & Apply</button>
                </div>
            </div>
        </div>
    </div>
    
    
    
    <wj-flex-grid #grid
                  [itemsSource]="data"
                  [groupHeaderFormat]="'&lt;b&gt;{value}&lt;/b&gt;'"
                  (initialized)="initGrid(grid)"
                  [anchorCursor]="true"
                  selectionMode="ListBox"
                  [headersVisibility]="'Column'"
                  [allowResizing]="1"
                  [allowDragging]="'None'">
    
        <wj-flex-grid-filter [filterColumns]="['attributeName', 'value', 'value', 'approvalStatus']">
        </wj-flex-grid-filter>
    
        <wj-flex-grid-column [binding]="'isGrouping'"
                             [allowDragging]="false"
                             [isReadOnly]="true"
                             [width]="'*'"
                             [header]="'Attribute'"
                             [visible]="false">
            <ng-template wjFlexGridCellTemplate
                         [cellType]="'GroupHeader'"
                         let-cell="cell">
    
                <button class="wj-btn wj-btn-glyph wj-elem-collapse"
                        type="button"
                        tabindex="-1"
                        aria-label="Toggle Group"
                        aria-expanded="true">
    
                    <span class="wj-glyph-down-right"></span>
                    <!-- <span *ngIf="cell.row.isCollapsed"
                                class="wj-glyph-right"></span> -->
                </button>
    
                <span [title]="cell.item.items[0].grpPath"> {{cell.item.items[0].grpPath}} </span>
            </ng-template>
        </wj-flex-grid-column>
    
        <wj-flex-grid-column [binding]="'attributeName'"
                             [minWidth]="180"
                             [width]="'6*'"
                             [isReadOnly]="true"
                             [allowSorting]="true">
            <ng-template wjFlexGridCellTemplate
                         [cellType]="'ColumnHeader'"
                         let-cell="cell">
                <div [title]="'Attribute'"> {{'Attribute'}}
                </div>
            </ng-template>
    
            <ng-template wjFlexGridCellTemplate
                         [cellType]="'Cell'"
                         let-cell="cell">
                <div class="read-mode"
                     [title]="cell.item.attributeName"> {{cell.item.attributeName}}
                </div>
            </ng-template>
    
        </wj-flex-grid-column>
    
    
        <!--  Start of Source Language Column  -->
        {cell.item}
        <wj-flex-grid-column [binding]="value"
                             [minWidth]="180"
                             [width]="'9*'"
                             [isReadOnly]="true"
                             [title]="'Type'"
                             [allowSorting]="false">
            <ng-template wjFlexGridCellTemplate
                         [cellType]="'ColumnHeader'"
                         let-cell="cell">
                <div [title]="'Source language value'"> {{'Source language value'}}
                </div>
    
            </ng-template>
            <ng-template wjFlexGridCellTemplate
                         [cellType]="'Cell'"
                         let-cell="cell">
                <div class="read-mode"
                     [title]="cell.item[selsectedSourceLocale].value">
                    {{cell.item[selsectedSourceLocale].value}}
                </div>
            </ng-template>
        </wj-flex-grid-column>
    
        <!--  End of Source Language Column-->
    
    
        <wj-flex-grid-column [binding]="value"
                             [minWidth]="180"
                             [width]="'9*'"
                             [isReadOnly]="true"
                             [title]="'Type'"
                             [allowSorting]="false">
            <ng-template wjFlexGridCellTemplate
                         [cellType]="'ColumnHeader'"
                         let-cell="cell">
                <div [title]="'Target language value'"> {{'Target language value'}}
                </div>
    
            </ng-template>
            <ng-template wjFlexGridCellTemplate
                         [cellType]="'Cell'"
                         let-cell="cell">
                <div class="read-mode"
                     [title]="cell.item[selectedTargetLocale].value">
                    {{cell.item[selectedTargetLocale].value}}
                </div>
            </ng-template>
        </wj-flex-grid-column>
    
        <wj-flex-grid-column [binding]="'approvalStatus'"
                             [minWidth]="180"
                             [width]="'4*'"
                             [isReadOnly]="true"
                             [title]="'Approve/Reject'"
                             [allowSorting]="false">
            <ng-template wjFlexGridCellTemplate
                         [cellType]="'ColumnHeader'"
                         let-cell="cell">
                <div [title]="'Approve/Reject'"> {{'Approve/Reject'}}
                </div>
    
            </ng-template>
            <ng-template wjFlexGridCellTemplate
                         [cellType]="'Cell'"
                         let-cell="cell">
                <div class="read-mode"
                     [title]="cell.item.approvalStatus">
                    {{cell.item.approvalStatus}}
                </div>
            </ng-template>
        </wj-flex-grid-column>
    
    </wj-flex-grid>
    
    [/code]

    Issues I’m Facing:

    1. The grid doesn’t automatically handle childList under grouped nodes.
    2. Source/target locale values (en_US, en_CA) are dynamic and stored as arrays inside each attribute, which makes binding tricky.
    3. Grouping by isGrouping alone does not create expandable/collapsible group headers for childList items.

    What I’m Looking For:

    1. How can I bind dynamic locales (e.g., en_US, en_CA) that are arrays in a way that grid can render them per row?

    2. Ideally want to show group headers (e.g., “Localized grp”) and then under it list its child attributes.

    Could you please help us to bind this dynamic data in wijimo grouping grid through stack blitz?

    Attaching the screenshot for the reference and if possible, please try to give answer as soon as possible

  • Posted 8 July 2025, 6:39 am EST

    Hi Nilesh,

    It would not be possible to get the desired results with grouping in the flexgrid along with the current data structure that you shared. But you can modify the data structure before assigning it to the grid and use the ‘childItemsPath’ property of the flexgrid to show hierarchical data, and then adjust the grid to the data in your desired layout.

    Please refer to the following sample for the same - https://stackblitz.com/edit/angular-ivy-9oal2kpj?file=src%2Fapp%2Fapp.component.ts

    Please note that it is a custom implementation for demonstrating how you can proceed to show the data in your desired form with FlexGrid. We prepared the sample according to the data you shared. You may need to modify the code to properly integrate with your current implementation

    Regards

  • Posted 9 July 2025, 1:29 am EST - Updated 9 July 2025, 1:35 am EST

    Hi Team,

    Thank you for your previous response and the sample implementation using childItemsPath. It helped clarify the approach for hierarchical data in FlexGrid.

    I have a follow-up question regarding dynamically handling locale-specific fields. In our current implementation, we use static checks like

    const hasEnUS = Array.isArray(node.en_US);
    const hasEnCA = Array.isArray(node.en_CA);
    

    However, we want to make this dynamic to support any number of locales (e.g., en_US, en_CA, fr_FR, etc.) without hardcoding each one. Additionally, based on the attached screenshot, we want attributes like Prod_desc and Multi_Prod_desc to be direct parts of the main group (KTcatalogSpec/Localized) and not nested under a grouping attribute.

    Could you please guide us on:

    1.How to dynamically handle multiple locale keys in the data structure?

    2.How to structure the data so that non-grouping attributes like Prod_desc and Multi_Prod_desc appear directly under the main group in FlexGrid?

    3. If possible, could you provide a sample implementation or update the StackBlitz example to reflect this dynamic handling?

    4. Could you please suggest restructure of this main JSON data which we provided earlier in the query which can easily bind in wijmo flex grid.

    If possible please give us two answers which can cover point 1-3 for first and 4th point for second.

    Looking forward to your guidance.

  • Posted 9 July 2025, 8:27 am EST

    Hi Nilesh,

    We have updated the sample as per your description to handle multiple locales in the data, please refer to the following updated sample for the same - https://stackblitz.com/edit/angular-ivy-guyhd3sd?file=src%2Fapp%2Fapp.component.ts

    Please note that, the grid implementation shown in the sample is based on the source data and custom data structure that we have created from the source data, any change in source data structure could affect the results displayed in the grid, we suggest you to go through all the implementation logic and modify it as per your project needs, if needed.

    For the second issue that you mentioned, we have handled the ‘loadedRows’ event of the FlexGrid to hide the level 1 rows in the above sample. The same result could also be achieved using a completely custom data structure to display this data as you asked in your 4th point. We will try to modify the existing JSON data sample to a new data structure that would be more compatible with flexgrid and easy to implement. We will share a sample with that data soon.

    Regards

  • Posted 10 July 2025, 8:19 am EST

    Hi Nilesh,

    Please refer to the below sample that uses the data with a customized structure that could be easily displayed in the Flexgrid without and complex implementation. You’ll find the data in the ‘getGridData’ function in the ‘data-svc.service.ts’ file in the sample. If you can have or modify your JSON data to this type of data, then it would be much simpler to integrate it with flexgrid.

    Sample link - https://stackblitz.com/edit/angular-ivy-tqdguffp?file=src%2Fapp%2Fdata-svc.service.ts

    Regards

  • Posted 16 July 2025, 5:03 am EST

    Hi Team,

    Grid Issue with Dynamic Locales and Missing Data Handling

    I’m working with dynamic locales in a Wijmo grid. By default, the dropdown selects the first locale option. However, if no instance has been created by the user for that locale, the detail object is not returned.

    In such cases, the grid gets distorted due to the absence of data. I would like to implement a solution that displays a “Data not found” message when there is no data available for the selected SourceLocalealso to load dynamic data on change of sourceLocale chang.Could you please suggest the best way to handle this scenario in Wijmo?

    I have below HTML code

    [code]<wj-flex-grid #grid

    [itemsSource]=“data”

    [groupHeaderFormat]=“‘<b>{value}</b>’”

    (initialized)=“initGrid(grid)”

    [anchorCursor]=“true”

    selectionMode=“ListBox”

    [headersVisibility]=“‘Column’”

    [allowResizing]=“1”

    [allowDragging]=“‘None’”>

        <wj-flex-grid-filter [filterColumns]="['groupPath', 'attributeName', 'value', 'value', 'approvalStatus']">
        </wj-flex-grid-filter>
    
        <wj-flex-grid-column [binding]="'groupPath'"
                             [allowDragging]="false"
                             [isReadOnly]="true"
                             [width]="'*'"
                             [header]="'Attribute'"
                             [visible]="false">
            <ng-template wjFlexGridCellTemplate
                         [cellType]="'GroupHeader'"
                         let-cell="cell">
    
                <button class="wj-btn wj-btn-glyph wj-elem-collapse"
                        type="button"
                        tabindex="-1"
                        aria-label="Toggle Group"
                        aria-expanded="true">
    
                    <span class="wj-glyph-down-right"></span>
                  
                </button>
    
                <span [title]="cell.item.items[0].groupPath"> {{cell.item.items[0].groupPath}} </span>
            </ng-template>
        </wj-flex-grid-column>
    
        <wj-flex-grid-column [binding]="'attributeName'"
                             [minWidth]="180"
                             [width]="'6*'"
                             [isReadOnly]="true"
                             [allowSorting]="true">
            <ng-template wjFlexGridCellTemplate
                         [cellType]="'ColumnHeader'"
                         let-cell="cell">
                <div [title]="'Attribute'"> {{'Attribute'}}
                </div>
            </ng-template>
    
            <ng-template wjFlexGridCellTemplate
                         [cellType]="'Cell'"
                         let-cell="cell">
                <div class="read-mode"
                     *ngFor="let child of cell.item.childItem; let i = index"
                     [title]="(cell.item.childItem.length > 1) ? (cell.item?.attributePath + '#' + i) : cell.item?.attributePath">
                    {{ (cell.item?.childItem?.length > 1) ? (cell.item?.attributeName + '#' + i) :
                    (cell.item?.attributeName || null) }}
                </div>
            </ng-template>
        </wj-flex-grid-column>
    
    
    
        <!--  Start of Source Language Column  -->
    
        <wj-flex-grid-column [binding]="'value'"
                             [minWidth]="180"
                             [width]="'9*'"
                             [isReadOnly]="true"
                             [title]="'Type'"
                             [allowSorting]="false">
            <ng-template wjFlexGridCellTemplate
                         [cellType]="'ColumnHeader'"
                         let-cell="cell">
                <div [title]="'Source language value'"> {{'Source language value'}}
                </div>
    
            </ng-template>
            <ng-template wjFlexGridCellTemplate
                         [cellType]="'Cell'"
                         let-cell="cell">
                <div class="read-mode"
                     *ngFor="let child of cell.item.childItem; let i = index"
                     [title]="cell.item?.childItem?.[i]?.[this.selectedSourceLocale]?.value">
                    {{ cell.item?.childItem?.[i]?.[this.selectedSourceLocale]?.value || null }}
                </div>
            </ng-template>
        </wj-flex-grid-column>
    
        <!--  End of Source Language Column-->
    
    
        <wj-flex-grid-column [binding]="'value'"
                             [minWidth]="180"
                             [width]="'9*'"
                             [isReadOnly]="true"
                             [title]="'Type'"
                             [allowSorting]="false">
            <ng-template wjFlexGridCellTemplate
                         [cellType]="'ColumnHeader'"
                         let-cell="cell">
                <div [title]="'Target language value'"> {{'Target language value'}}
                </div>
    
            </ng-template>
            <ng-template wjFlexGridCellTemplate
                         [cellType]="'Cell'"
                         let-cell="cell">
                <div class="read-mode"
                     *ngFor="let child of cell.item.childItem; let i = index"
                     [title]="cell.item?.childItem?.[i]?.[this.selectedTargetLocale]?.value">
                    {{ cell.item?.childItem?.[i]?.[this.selectedTargetLocale]?.value || null}}
                </div>
            </ng-template>
        </wj-flex-grid-column>
    
        <wj-flex-grid-column [binding]="'approvalStatus'"
                             [minWidth]="180"
                             [width]="'4*'"
                             [isReadOnly]="true"
                             [title]="'Approve/Reject'"
                             [allowSorting]="false">
            <ng-template wjFlexGridCellTemplate
                         [cellType]="'ColumnHeader'"
                         let-cell="cell">
                <div [title]="'Approve/Reject'"> {{'Approve/Reject'}}
                </div>
    
            </ng-template>
            <ng-template wjFlexGridCellTemplate
                         [cellType]="'Cell'"
                         let-cell="cell">
                <div class="read-mode"
                     *ngFor="let child of cell.item.childItem; let i = index"
                     [title]="cell.item?.childItem?.[i]?.[this.selectedTargetLocale]?.approvalStatus ?
                        'Approve' : 'Reject'">
                    <button class="btn btn-primary btn-text btn-search text-ellipsis-single-line"
                            [disabled]="!cell.item?.childItem?.[i]?.[selectedTargetLocale]?.value?.trim()"
                            (click)="approveReject('singleEdit',(cell.item?.childItem[i]))">{{
                        (cell.item?.childItem?.[i]?.[this.selectedTargetLocale]?.approvalStatus) ?
                        'Approve' : 'Reject'}}
                    </button>
                </div>
            </ng-template>
        </wj-flex-grid-column>
    
    </wj-flex-grid>[/code]
    

    TS file

      this.data = new wjcCore.CollectionView(this.data, {
            groupDescriptions: ['groupPath']
          });

    For the above code we are using below data in JSON for the itemSource and the screenshot for the issue we are facing as below in zip file.

    Please provide the solution for the same through stack blitz in angular.

    Response and image zip file.zip

  • Posted 16 July 2025, 9:39 am EST

    Hi Nilesh,

    You can refer to the following updated sample that shows how you can show ‘Data not available’ message in the cells - https://stackblitz.com/edit/angular-ivy-z8d3xpmt?file=src%2Fapp%2Fapp.component.html

    We have added an extra span tag in the column template to show this message when data is not available for the cell. We also observed that you have applied grouping to show the groups and are not using the ‘childItemsPath’ property of the Flexgrid, but you still have ‘childItems’ in the data you shared. It might result in not showing data in cells even when data is available. Please take a look at the data structure in the above sample, which would be required with your current implementation.

    Regards

  • Posted 29 July 2025, 2:14 am EST

    Hi Team,

    we are facing issue while filtering in grid in the source and target value as both has having same binding property

    [code]

    <wj-flex-grid-column [binding]=“‘value’”

            <wj-flex-grid-column [binding]="'value'"
    

    <wj-flex-grid-filter [filterColumns]=“[‘groupPath’, ‘attributeName’, ‘value’, ‘value’, ‘approvalStatus’]”>



    [/code]

    for the data

    [code]{

    "attributeId": 737813,
    
    "groupNodeId": 737820,
    
    "groupName": "Localized grp",
    
    "attributeType": "STRING",
    
    "attributeName": "Multi_Prod_desc",
    
    "isGrouping": false,
    
    "childItems": [
    
        {
    
            "en_CA": {
    
                "attributeId": 740609,
    
                "approvalStatus": false,
    
                "isEditable": true,
    
                "attributeType": "STRING",
    
                "attributeName": "Multi_Prod_desc (en_CA)",
    
                "value": "Localized_grup_0 Multi_Prod_desc US_0",
    
                "localeIdentifier": "en_CA",
    
                "attributePath": "KTCatalogSpec/Localized grp#0/Multi_Prod_desc/en_CA#0"
    
            },
    
            "en_US": {
    
                "attributeId": 737807,
    
                "approvalStatus": false,
    
                "isEditable": true,
    
                "attributeType": "STRING",
    
                "attributeName": "Multi_Prod_desc (en_US)",
    
                "value": "Localized_grup_0 Multi_Prod_desc US_0",
    
                "localeIdentifier": "en_US",
    
                "attributePath": "KTCatalogSpec/Localized grp#0/Multi_Prod_desc/en_US#0"
    
            }
    
        },
    
        {
    
            "en_CA": {
    
                "attributeId": 740609,
    
                "approvalStatus": false,
    
                "isEditable": true,
    
                "attributeType": "STRING",
    
                "attributeName": "Multi_Prod_desc (en_CA)",
    
                "value": "Localized_grup_0 Multi_Prod_desc US_1",
    
                "localeIdentifier": "en_CA",
    
                "attributePath": "KTCatalogSpec/Localized grp#0/Multi_Prod_desc/en_CA#1"
    
            },
    
            "en_US": {
    
                "attributeId": 737807,
    
                "approvalStatus": false,
    
                "isEditable": true,
    
                "attributeType": "STRING",
    
                "attributeName": "Multi_Prod_desc (en_US)",
    
                "value": "Localized_grup_0 Multi_Prod_desc US_1",
    
                "localeIdentifier": "en_US",
    
                "attributePath": "KTCatalogSpec/Localized grp#0/Multi_Prod_desc/en_US#1"
    
            }
    
        }
    
    ],
    
    "groupPath": "KTCatalogSpec/Localized grp#0",
    
    "attributePath": "KTCatalogSpec/Localized grp#0/Multi_Prod_desc"
    

    }

    [/code]

    Let me know if anything required from my end.

  • Posted 29 July 2025, 8:08 am EST

    Hi Nilesh,

    You’ll have to update the binding property of the columns when the selected source and target languages are changed to make sure that the filter dropdown has the updated values. You can refer to the sample we shared in our last comment; we have updated the ‘binding’ property in the sample with any change in source or target columns. Here’s the link for your reference - https://stackblitz.com/edit/angular-ivy-z8d3xpmt?file=src%2Fapp%2Fapp.component.html

    Please note that, if you are still using childItems specified using the ‘childItemsPath’ property of the FlexGrid, then filters may not work as expected because the data will be hierarchical in that case, and filtering in hierarchical data is not yet supported in Wijmo.

    In case, you face any issues, please let us know.

    Regards

Need extra support?

Upgrade your support plan and get personal unlimited phone support with our customer engagement team

Learn More

Forum Channels