UNPKG

@grafana/ui

Version:
1 lines • 19.6 kB
{"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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"}