Master-Detail (Enterprise)
Master-detail in apex-grid-enterprise renders a nested grid of related rows beneath each expanded master row. Setting the masterDetail config wires up the grid's row expansion automatically — creating, caching, and populating the child grids — so you don't hand-write a detailTemplate.
Basic setup
import 'apex-grid-enterprise/define';
const grid = document.createElement('apex-grid-enterprise');
grid.columns = orderColumns;
grid.data = orders;
grid.masterDetail = {
columns: [
{ key: 'sku', headerText: 'SKU' },
{ key: 'qty', headerText: 'Qty' },
{ key: 'price', headerText: 'Price' },
],
getDetailData: (order) => order.lineItems,
};
document.body.appendChild(grid);
Each expanded order row now shows a nested grid of its line items.
MasterDetailConfig
| Field | Type | Description |
|---|---|---|
columns | ColumnConfiguration[] or (row) => ColumnConfiguration[] | Detail-grid columns; a function lets each master row have its own columns |
getDetailData | (row) => C[] | Promise<C[]> | Returns the detail rows for a master row; may be async |
detailTag | 'apex-grid' | 'apex-grid-enterprise' | Which element to render the detail grid as (default 'apex-grid') |
detailHeight | number | string | Height of the detail region |
isExpandable | (row) => boolean | Whether a given master row can expand |
configureDetail | (grid, context) => void | Hook to configure each detail grid instance after creation |
Async detail data
getDetailData can return a promise, so detail rows can be fetched on demand when a master row expands:
grid.masterDetail = {
columns: lineItemColumns,
getDetailData: async (order) => {
const res = await fetch(`/api/orders/${order.id}/items`);
return res.json();
},
detailHeight: 240,
};
Per-row expandability
Use isExpandable to hide the expander on rows with no detail:
grid.masterDetail = {
columns: lineItemColumns,
getDetailData: (order) => order.lineItems,
isExpandable: (order) => order.lineItemCount > 0,
};
Enterprise detail grids
Set detailTag: 'apex-grid-enterprise' to make each detail grid itself an enterprise grid (so detail grids can group, aggregate, etc.). Use configureDetail to set up each instance:
grid.masterDetail = {
columns: lineItemColumns,
getDetailData: (order) => order.lineItems,
detailTag: 'apex-grid-enterprise',
configureDetail: (detailGrid, context) => {
detailGrid.aggregations = { price: ['sum'] };
},
};
The configureDetail context provides the master data (the row) and its rowIndex.
Refreshing a detail
When the underlying detail data changes, invalidate a single master row's cached detail:
grid.refreshDetail(order);
Relationship to manual expansion
masterDetail configures the grid's expansion automatically and overrides any manual expansion/detailTemplate you set. For fully custom expansion content without nested grids, use the community row expansion feature instead.
React example
import { useEffect, useRef } from 'react'
import 'apex-grid-enterprise/define'
export default function MasterDetailGrid() {
const ref = useRef<any>(null)
useEffect(() => {
const grid = ref.current
grid.columns = orderColumns
grid.data = orders
grid.masterDetail = {
columns: lineItemColumns,
getDetailData: (order: any) => order.lineItems,
detailHeight: 220,
}
}, [])
return <apex-grid-enterprise ref={ref} style={{ height: 520 }} />
}