import * as React from 'react'; import * as ReactDOM from 'react-dom'; import JqxGrid, { IGridProps, jqx } from 'jqwidgets-scripts/jqwidgets-react-tsx/jqxgrid'; class App extends React.PureComponent<{}, IGridProps> { private myGrid = React.createRef(); constructor(props: {}) { super(props); const source: any = { async: false, datafields: [ { name: 'FirstName' }, { name: 'LastName' }, { name: 'Title' }, { name: 'Address' }, { name: 'City' } ], datatype: 'xml', id: 'EmployeeID', record: 'Employee', root: 'Employees', url: 'employees.xml' }; const ordersDetailsSource: any = { async: false, datafields: [ { name: 'EmployeeID', type: 'string' }, { name: 'ShipName', type: 'string' }, { name: 'ShipAddress', type: 'string' }, { name: 'ShipCity', type: 'string' }, { name: 'ShipCountry', type: 'string' }, { name: 'ShippedDate', type: 'date' } ], datatype: 'xml', record: 'Order', root: 'Orders', url: 'orderdetails.xml' }; const ordersDataAdapter = new jqx.dataAdapter(ordersDetailsSource, { autoBind: true }); const photoRenderer = (row: number, column: any, value: string, defaultHTML: string, columnData: any, rowData: any): string => { const name = rowData.FirstName; const imgurl = 'https://www.jqwidgets.com/react/images/' + name.toLowerCase() + '.png'; const img = '
'; return img; } const renderer = (row: number, column: any, value: string): string => { return '' + value + ''; } const nestedGrids: any[] = []; const initrowdetails = (index: number, parentElement: any, gridElement: any, record: any): void => { const id = record.uid.toString(); const nestedGridContainer = parentElement.children[0]; nestedGrids[index] = nestedGridContainer; const filtergroup = new jqx.filter(); const filtervalue = id; const filtercondition = 'equal'; const filter = filtergroup.createfilter('stringfilter', filtervalue, filtercondition); // fill the orders depending on the id. const orders = ordersDataAdapter.records; const ordersbyid = []; for (const order of orders) { const result = filter.evaluate(order.EmployeeID); if (result) { ordersbyid.push(order); } } const ordersSource = { datafields: [ { name: 'EmployeeID', type: 'string' }, { name: 'ShipName', type: 'string' }, { name: 'ShipAddress', type: 'string' }, { name: 'ShipCity', type: 'string' }, { name: 'ShipCountry', type: 'string' }, { name: 'ShippedDate', type: 'date' } ], id: 'OrderID', localdata: ordersbyid } const nestedGridAdapter = new jqx.dataAdapter(ordersSource); if (nestedGridContainer != null) { const columns: IGridProps['columns'] = [ { text: 'Ship Name', datafield: 'ShipName', width: 200 }, { text: 'Ship Address', datafield: 'ShipAddress', width: 200 }, { text: 'Ship City', datafield: 'ShipCity', width: 150 }, { text: 'Ship Country', datafield: 'ShipCountry', width: 150 }, { text: 'Shipped Date', datafield: 'ShippedDate', width: 200 } ]; ReactDOM.render( , document.getElementById(nestedGridContainer.id) ); } }; this.state = { columns: [ { text: 'Photo', width: 50, cellsrenderer: photoRenderer }, { text: 'First Name', datafield: 'FirstName', width: 100, cellsrenderer: renderer }, { text: 'Last Name', datafield: 'LastName', width: 100, cellsrenderer: renderer }, { text: 'Title', datafield: 'Title', width: 180, cellsrenderer: renderer }, { text: 'Address', datafield: 'Address', width: 300, cellsrenderer: renderer }, { text: 'City', datafield: 'City', width: 170, cellsrenderer: renderer } ], initrowdetails, ready: (): void => { setTimeout(() => { this.myGrid.current!.showrowdetails(1); }); }, rowdetailstemplate: { rowdetails: '
', rowdetailsheight: 220, rowdetailshidden: true }, source: new jqx.dataAdapter(source) } } public render() { return ( ); } } export default App;