@grafana/ui
Version:
Grafana Components Library
1 lines • 19.6 kB
Source Map (JSON)
{"version":3,"file":"InteractiveTable.mjs","sources":["../../../../src/components/InteractiveTable/InteractiveTable.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { uniqueId } from 'lodash';\nimport { Fragment, ReactNode, useCallback, useEffect, useMemo } from 'react';\nimport {\n HeaderGroup,\n PluginHook,\n Row,\n SortingRule,\n TableOptions,\n useExpanded,\n usePagination,\n useSortBy,\n useTable,\n} from 'react-table';\n\nimport { GrafanaTheme2, IconName, isTruthy } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { Icon } from '../Icon/Icon';\nimport { Pagination } from '../Pagination/Pagination';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { PopoverContent } from '../Tooltip/types';\n\nimport { Column } from './types';\nimport { EXPANDER_CELL_ID, getColumns } from './utils';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const rowHoverBg = theme.colors.emphasize(theme.colors.background.primary, 0.03);\n\n return {\n container: css({\n display: 'flex',\n gap: theme.spacing(2),\n flexDirection: 'column',\n width: '100%',\n overflowX: 'auto',\n }),\n cell: css({\n padding: theme.spacing(1),\n minWidth: theme.spacing(3),\n }),\n table: css({\n borderRadius: theme.shape.radius.default,\n width: '100%',\n }),\n disableGrow: css({\n width: 0,\n }),\n header: css({\n borderBottom: `1px solid ${theme.colors.border.weak}`,\n minWidth: theme.spacing(3),\n '&, & > button': {\n position: 'relative',\n whiteSpace: 'nowrap',\n padding: theme.spacing(1),\n },\n '& > button': {\n '&:after': {\n content: '\"\\\\00a0\"',\n },\n width: '100%',\n height: '100%',\n background: 'none',\n border: 'none',\n paddingRight: theme.spacing(2.5),\n textAlign: 'left',\n fontWeight: theme.typography.fontWeightMedium,\n },\n }),\n row: css({\n label: 'row',\n borderBottom: `1px solid ${theme.colors.border.weak}`,\n\n '&:hover': {\n backgroundColor: rowHoverBg,\n },\n\n '&:last-child': {\n borderBottom: 0,\n },\n }),\n expandedRow: css({\n label: 'expanded-row-content',\n borderBottom: 'none',\n }),\n expandedContentCell: css({\n borderBottom: `1px solid ${theme.colors.border.weak}`,\n position: 'relative',\n padding: theme.spacing(2, 2, 2, 5),\n\n '&:before': {\n content: '\"\"',\n position: 'absolute',\n width: '1px',\n top: 0,\n left: '16px',\n bottom: theme.spacing(2),\n background: theme.colors.border.medium,\n },\n }),\n expandedContentRow: css({\n label: 'expanded-row-content',\n }),\n sortableHeader: css({\n /* increases selector's specificity so that it always takes precedence over default styles */\n '&&': {\n padding: 0,\n },\n }),\n };\n};\n\nexport type InteractiveTableHeaderTooltip = {\n content: PopoverContent;\n iconName?: IconName;\n};\n\nexport type FetchDataArgs<Data> = { sortBy: Array<SortingRule<Data>> };\nexport type FetchDataFunc<Data> = ({ sortBy }: FetchDataArgs<Data>) => void;\n\ninterface BaseProps<TableData extends object> {\n className?: string;\n /**\n * Table's columns definition. Must be memoized.\n */\n columns: Array<Column<TableData>>;\n /**\n * The data to display in the table. Must be memoized.\n */\n data: TableData[];\n /**\n * Must return a unique id for each row\n */\n getRowId: TableOptions<TableData>['getRowId'];\n /**\n * Optional tooltips for the table headers. The key must match the column id.\n */\n headerTooltips?: Record<string, InteractiveTableHeaderTooltip>;\n /**\n * Number of rows per page. A value of zero disables pagination. Defaults to 0.\n * A React hooks error will be thrown if pageSize goes from greater than 0 to 0 or vice versa. If enabling pagination,\n * make sure pageSize remains a non-zero value.\n */\n pageSize?: number;\n /**\n * A custom function to fetch data when the table is sorted. If not provided, the table will be sorted client-side.\n * It's important for this function to have a stable identity, e.g. being wrapped into useCallback to prevent unnecessary\n * re-renders of the table.\n */\n fetchData?: FetchDataFunc<TableData>;\n /**\n * Optional way to set how the table is sorted from the beginning. Must be memoized.\n */\n initialSortBy?: Array<SortingRule<TableData>>;\n}\n\ninterface WithExpandableRow<TableData extends object> extends BaseProps<TableData> {\n /**\n * Render function for the expanded row. if not provided, the tables rows will not be expandable.\n */\n renderExpandedRow: (row: TableData) => ReactNode;\n /**\n * Whether to show the \"Expand all\" button. Depends on renderExpandedRow to be provided. Defaults to false.\n */\n showExpandAll?: boolean;\n}\n\ninterface WithoutExpandableRow<TableData extends object> extends BaseProps<TableData> {\n renderExpandedRow?: never;\n showExpandAll?: never;\n}\n\ntype Props<TableData extends object> = WithExpandableRow<TableData> | WithoutExpandableRow<TableData>;\n\n/** @alpha */\nexport function InteractiveTable<TableData extends object>({\n className,\n columns,\n data,\n getRowId,\n headerTooltips,\n pageSize = 0,\n renderExpandedRow,\n showExpandAll = false,\n fetchData,\n initialSortBy = [],\n}: Props<TableData>) {\n const styles = useStyles2(getStyles);\n const tableColumns = useMemo(() => {\n return getColumns<TableData>(columns, showExpandAll);\n }, [columns, showExpandAll]);\n const id = useUniqueId();\n const getRowHTMLID = useCallback(\n (row: Row<TableData>) => {\n return `${id}-${row.id}`.replace(/\\s/g, '');\n },\n [id]\n );\n\n const tableHooks: Array<PluginHook<TableData>> = [useSortBy, useExpanded];\n\n const multiplePages = data.length > pageSize;\n const paginationEnabled = pageSize > 0;\n\n if (paginationEnabled) {\n tableHooks.push(usePagination);\n }\n\n const tableInstance = useTable<TableData>(\n {\n columns: tableColumns,\n data,\n autoResetExpanded: false,\n autoResetSortBy: false,\n disableMultiSort: true,\n // If fetchData is provided, we disable client-side sorting\n manualSortBy: Boolean(fetchData),\n getRowId,\n initialState: {\n hiddenColumns: [\n !renderExpandedRow && EXPANDER_CELL_ID,\n ...tableColumns\n .filter((col) => !(col.visible ? col.visible(data) : true))\n .map((c) => c.id)\n .filter(isTruthy),\n ].filter(isTruthy),\n sortBy: initialSortBy,\n },\n },\n ...tableHooks\n );\n\n const { getTableProps, getTableBodyProps, headerGroups, prepareRow } = tableInstance;\n\n const { sortBy } = tableInstance.state;\n useEffect(() => {\n if (fetchData) {\n fetchData({ sortBy });\n }\n }, [sortBy, fetchData]);\n\n useEffect(() => {\n if (paginationEnabled) {\n tableInstance.setPageSize(pageSize);\n }\n }, [paginationEnabled, pageSize, tableInstance.setPageSize, tableInstance]);\n\n return (\n <div className={styles.container}>\n <table {...getTableProps()} className={cx(styles.table, className)}>\n <thead>\n {headerGroups.map((headerGroup) => {\n const { key, ...headerRowProps } = headerGroup.getHeaderGroupProps();\n\n return (\n <tr key={key} {...headerRowProps}>\n {headerGroup.headers.map((column) => {\n const { key, ...headerCellProps } = column.getHeaderProps();\n\n const headerTooltip = headerTooltips?.[column.id];\n\n return (\n <th\n key={key}\n className={cx(styles.header, {\n [styles.disableGrow]: column.width === 0,\n [styles.sortableHeader]: column.canSort,\n })}\n {...headerCellProps}\n {...(column.isSorted && { 'aria-sort': column.isSortedDesc ? 'descending' : 'ascending' })}\n >\n <ColumnHeader column={column} headerTooltip={headerTooltip} />\n </th>\n );\n })}\n </tr>\n );\n })}\n </thead>\n\n <tbody {...getTableBodyProps()}>\n {(paginationEnabled ? tableInstance.page : tableInstance.rows).map((row) => {\n prepareRow(row);\n\n const { key, ...otherRowProps } = row.getRowProps();\n const rowId = getRowHTMLID(row);\n // @ts-expect-error react-table doesn't ship with useExpanded types, and we can't use declaration merging without affecting the table viz\n const isExpanded = row.isExpanded;\n\n return (\n <Fragment key={key}>\n <tr {...otherRowProps} className={cx(styles.row, isExpanded && styles.expandedRow)}>\n {row.cells.map((cell) => {\n const { key, ...otherCellProps } = cell.getCellProps();\n return (\n <td className={styles.cell} key={key} {...otherCellProps}>\n {cell.render('Cell', { __rowID: rowId })}\n </td>\n );\n })}\n </tr>\n {isExpanded && renderExpandedRow && (\n <tr {...otherRowProps} id={rowId} className={styles.expandedContentRow}>\n <td className={styles.expandedContentCell} colSpan={row.cells.length}>\n {renderExpandedRow(row.original)}\n </td>\n </tr>\n )}\n </Fragment>\n );\n })}\n </tbody>\n </table>\n {paginationEnabled && multiplePages && (\n <span>\n <Pagination\n currentPage={tableInstance.state.pageIndex + 1}\n numberOfPages={tableInstance.pageOptions.length}\n onNavigate={(toPage) => tableInstance.gotoPage(toPage - 1)}\n />\n </span>\n )}\n </div>\n );\n}\n\nconst useUniqueId = () => {\n return useMemo(() => uniqueId('InteractiveTable'), []);\n};\n\nconst getColumnHeaderStyles = (theme: GrafanaTheme2) => ({\n sortIcon: css({\n position: 'absolute',\n top: theme.spacing(1),\n }),\n headerTooltipIcon: css({\n marginLeft: theme.spacing(0.5),\n }),\n});\n\nfunction ColumnHeader<T extends object>({\n column: { canSort, render, isSorted, isSortedDesc, getSortByToggleProps },\n headerTooltip,\n}: {\n column: HeaderGroup<T>;\n headerTooltip?: InteractiveTableHeaderTooltip;\n}) {\n const styles = useStyles2(getColumnHeaderStyles);\n const { onClick } = getSortByToggleProps();\n\n const children = (\n <>\n {render('Header')}\n {headerTooltip && (\n <Tooltip theme=\"info-alt\" content={headerTooltip.content} placement=\"top-end\">\n <Icon\n className={styles.headerTooltipIcon}\n name={headerTooltip.iconName || 'info-circle'}\n data-testid={'header-tooltip-icon'}\n />\n </Tooltip>\n )}\n {isSorted && (\n <span aria-hidden=\"true\" className={styles.sortIcon}>\n <Icon name={isSortedDesc ? 'angle-down' : 'angle-up'} />\n </span>\n )}\n </>\n );\n\n if (canSort) {\n return (\n <button type=\"button\" onClick={onClick}>\n {children}\n </button>\n );\n }\n\n return children;\n}\n"],"names":["key","Fragment"],"mappings":"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"}