{"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';\nimport { Icon } from '../Icon/Icon';\nimport { Pagination } from '../Pagination/Pagination';\nimport { PopoverContent, Tooltip } from '../Tooltip';\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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"}