import { Telemetry } from '@fluentui/react-bindings'; import * as React from 'react'; import { Cell, HeaderGroup, Row, TableOptions, TableState, useFilters, UseFiltersColumnProps, usePagination, useSortBy, UseSortByColumnProps, UseSortByState, useTable, } from 'react-table'; import * as styles from './styles'; import { useIntervalUpdate } from './useIntervalUpdate'; import { useTelemetryColumns, CellAlign } from './useTelemetryColumns'; import { TelemetryDataTotals, useTelemetryData } from './useTelemetryData'; import { TelemetryState, TelemetryTableExpandNames } from './useTelemetryState'; type TelemetryTableProps = { telemetry: Telemetry; componentFilter: TelemetryState['tableComponentFilter']; expand: TelemetryState['tableExpand']; sort: TelemetryState['tableSort']; onComponentFilterChange: (filter: string) => void; onExpandChange: (name: TelemetryTableExpandNames, show: boolean) => void; onSortChange: (sort: TelemetryState['tableSort'] | undefined) => void; }; type TelemetryHeaderGroup = HeaderGroup & UseSortByColumnProps<{}> & UseFiltersColumnProps<{}> & { isShowDetails?: TelemetryTableExpandNames; subgroup: 'styles' | 'timers'; }; export const TelemetryTable: React.FC = props => { const { expand, componentFilter, sort, onComponentFilterChange, onExpandChange, onSortChange, telemetry } = props; const [interval, setInterval] = React.useState(2000); const tick = useIntervalUpdate(interval); const { data, totals } = useTelemetryData(telemetry, tick); const columns = useTelemetryColumns({ showStylesDetails: expand?.styles, showTotalDetails: expand?.total }); const { getTableProps, getTableBodyProps, footerGroups, headerGroups, // @ts-ignore page, prepareRow, // @ts-ignore setPageSize, // @ts-ignore state: { pageSize }, } = useTable( { columns, data, totals, autoResetFilters: false, autoResetPage: false, autoResetSortBy: false, disableMultiSort: true, initialState: { ...{ pageSize: 20 }, ...(componentFilter && { filters: [{ id: 'componentName', value: componentFilter }] }), ...(sort && { sortBy: [{ id: sort.column, desc: sort.direction === 'desc' }] }), } as Partial, stateReducer: (newState: TableState & UseSortByState<{}>, action) => { if (action.type === 'setFilter' && action.columnId === 'componentName') { onComponentFilterChange(action.filterValue); } if (action.type === 'toggleSortBy') { if (newState.sortBy.length > 0) { onSortChange({ column: action.columnId, direction: newState.sortBy[0].desc ? 'desc' : 'asc', }); } else { onSortChange(undefined); } } return newState; }, } as TableOptions<{}>, useFilters, useSortBy, usePagination, ); return ( <> {headerGroups.map(group => ( {group.headers.map((column: TelemetryHeaderGroup, index) => ( ))} ))} {page.map((row: Row) => { prepareRow(row); return ( {row.cells.map( ( cell: Cell & { column: UseSortByColumnProps<{}> & { showPercentage?: boolean; align?: CellAlign; }; }, ) => ( ), )} ); })} {footerGroups.map(group => ( {group.headers.find((header: HeaderGroup & { Footer: React.ReactElement }) => header.Footer) && group.headers.map((column: HeaderGroup & { align?: CellAlign }) => ( ))} ))}
{column.render('Header')} {column.isSorted ? (column.isSortedDesc ? ' 🔽' : ' 🔼') : ''}
{column.isShowDetails && ( onExpandChange(column.isShowDetails!, e.target.checked)} style={styles.tableCheckbox()} type="checkbox" /> )} {column.canFilter &&
{column.render('Filter')}
}
{cell.render('Cell')}
{column.render('Footer')}
(telemetry.enabled = e.target.checked)} />
Total: {data.length} component(s)
); };