Angular Master Detail Grid


Example online

https://av-components.scapp.io

Source code

https://github.com/marco76/av-components

Autoconfigurable Data Grid with detail

In one project I had the opportunity to develop a Data Grid with expandable rows. We used the standard Angular Material as base for the development.

The original DataTable don't support expandable rows, with a bit of research and many trial and error we succeeded to build a pretty good component.

With a very ambitious approach we decided to automatically generate the forms of the grid (dates, booleans, selects, texts) using an optional JSON configuration object.

The component don't seem to attract a lot of interest outside of the project. I think that not many projects are based on Angular Material.
Material is not easy to implement compared to other frameworks/guidelines/libraries and don't give a lot of freedom to the developer.

I personally enjoy using it for company solutions but I'm not sure I would choose Material for a public website.

If somebody is blocked trying to solve the same problem here he can find some code fragments.

Call on the cell that open the template:

onDetailGrid(row: any, data: string, column: AvTableColumnConfig) { 
    
       row.selectedTemplate = this.gridTemplate; 
       if (typeof row.isExpanded === 'undefined') { 
         row.isExpanded = false; 
       } 
    
       row.isExpanded = !row.isExpanded; 
       row.selectedColumn = data; 
} 

Definition of the template in the html:

<ng-template #panelTemplate let-element> 
  <div class="mat-row mat-row-detail" [@detailExpand] style="overflow: hidden"> 
    <av-table-detail-panel [data]="dataColumns" [item]="element" *ngIf="detailData"> 
    </av-table-detail-panel> 
  </div> 
</ng-template> 
<ng-template #gridTemplate let-element> 
  <div class="mat-row detail-table-container" [@detailExpand] style="overflow: hidden"> 
    <av-table-detail-table [data]="element[element.selectedColumn]" 
                           [configuration]="getDetailConfiguration(element.selectedColumn)" 
                           *ngIf="detailData"> 
    </av-table-detail-table> 
  </div> 
</ng-template>