UNPKG

@grafana/ui

Version:
1 lines • 23.8 kB
{"version":3,"file":"Table.mjs","sources":["../../../../../src/components/Table/TableRT/Table.tsx"],"sourcesContent":["import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n useAbsoluteLayout,\n useExpanded,\n useFilters,\n usePagination,\n useResizeColumns,\n useSortBy,\n useTable,\n} from 'react-table';\nimport { VariableSizeList } from 'react-window';\n\nimport { FieldType, ReducerID, getRowUniqueId, getFieldMatcher } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Trans } from '@grafana/i18n';\nimport { TableCellHeight } from '@grafana/schema';\n\nimport { useTheme2 } from '../../../themes/ThemeContext';\nimport { CustomScrollbar } from '../../CustomScrollbar/CustomScrollbar';\nimport { Pagination } from '../../Pagination/Pagination';\nimport { TableCellInspector } from '../TableCellInspector';\nimport { useFixScrollbarContainer, useResetVariableListSizeCache } from '../hooks';\nimport { getInitialState, useTableStateReducer } from '../reducer';\nimport { FooterItem, GrafanaTableState, InspectCell, TableRTProps as Props } from '../types';\nimport {\n getColumns,\n sortCaseInsensitive,\n sortNumber,\n getFooterItems,\n createFooterCalculationValues,\n guessLongestField,\n} from '../utils';\n\nimport { FooterRow } from './FooterRow';\nimport { HeaderRow } from './HeaderRow';\nimport { RowsList } from './RowsList';\nimport { useTableStyles } from './styles';\n\nconst COLUMN_MIN_WIDTH = 150;\nconst FOOTER_ROW_HEIGHT = 36;\nconst NO_DATA_TEXT = 'No data';\n\n/**\n * Used for displaying tabular data\n *\n * https://developers.grafana.com/ui/latest/index.html?path=/docs/plugins-table--docs\n */\nexport const Table = memo((props: Props) => {\n const {\n ariaLabel,\n data,\n height,\n onCellFilterAdded,\n onColumnResize,\n width,\n columnMinWidth = COLUMN_MIN_WIDTH,\n noHeader,\n resizable = true,\n initialSortBy,\n footerOptions,\n showTypeIcons,\n footerValues,\n enablePagination,\n cellHeight = TableCellHeight.Sm,\n timeRange,\n enableSharedCrosshair = false,\n initialRowIndex = undefined,\n fieldConfig,\n getActions,\n replaceVariables,\n } = props;\n\n const listRef = useRef<VariableSizeList>(null);\n const tableDivRef = useRef<HTMLDivElement>(null);\n const variableSizeListScrollbarRef = useRef<HTMLDivElement>(null);\n const theme = useTheme2();\n const tableStyles = useTableStyles(theme, cellHeight);\n const headerHeight = noHeader ? 0 : tableStyles.rowHeight;\n const [footerItems, setFooterItems] = useState<FooterItem[] | undefined>(footerValues);\n const noValuesDisplayText = fieldConfig?.defaults?.noValue ?? NO_DATA_TEXT;\n const [inspectCell, setInspectCell] = useState<InspectCell | null>(null);\n\n const footerHeight = useMemo(() => {\n const EXTENDED_ROW_HEIGHT = FOOTER_ROW_HEIGHT;\n let length = 0;\n\n if (!footerItems) {\n return 0;\n }\n\n for (const fv of footerItems) {\n if (Array.isArray(fv) && fv.length > length) {\n length = fv.length;\n }\n }\n\n if (length > 1) {\n return EXTENDED_ROW_HEIGHT * length;\n }\n\n return EXTENDED_ROW_HEIGHT;\n }, [footerItems]);\n\n // React table data array. This data acts just like a dummy array to let react-table know how many rows exist.\n // The cells use the field to look up values, therefore this is simply a length/size placeholder.\n const memoizedData = useMemo(() => {\n if (!data.fields.length) {\n return [];\n }\n // As we only use this to fake the length of our data set for react-table we need to make sure we always return an array\n // filled with values at each index otherwise we'll end up trying to call accessRow for null|undefined value in\n // https://github.com/tannerlinsley/react-table/blob/7be2fc9d8b5e223fc998af88865ae86a88792fdb/src/hooks/useTable.js#L585\n return Array(data.length).fill(0);\n }, [data]);\n\n // This checks whether `Show table footer` is toggled on, the `Calculation` is set to `Count`, and finally, whether `Count rows` is toggled on.\n const isCountRowsSet = Boolean(\n footerOptions?.countRows &&\n footerOptions.reducer &&\n footerOptions.reducer.length &&\n footerOptions.reducer[0] === ReducerID.count\n );\n\n const nestedDataField = data.fields.find((f) => f.type === FieldType.nestedFrames);\n const hasNestedData = nestedDataField !== undefined;\n\n // React-table column definitions\n const memoizedColumns = useMemo(\n () => getColumns(data, width, columnMinWidth, hasNestedData, footerItems, isCountRowsSet),\n [data, width, columnMinWidth, hasNestedData, footerItems, isCountRowsSet]\n );\n\n // we need a ref to later store the `toggleAllRowsExpanded` function, returned by `useTable`.\n // We cannot simply use a variable because we need to use such function in the initialization of\n // `useTableStateReducer`, which is needed to construct options for `useTable` (the hook that returns\n // `toggleAllRowsExpanded`), and if we used a variable, that variable would be undefined at the time\n // we initialize `useTableStateReducer`.\n const toggleAllRowsExpandedRef = useRef<(value?: boolean) => void>();\n\n // Internal react table state reducer\n const stateReducer = useTableStateReducer({\n onColumnResize,\n onSortByChange: (state) => {\n // Collapse all rows. This prevents a known bug that causes the size of the rows to be incorrect due to\n // using `VariableSizeList` and `useExpanded` together.\n toggleAllRowsExpandedRef.current!(false);\n\n if (props.onSortByChange) {\n props.onSortByChange(state);\n }\n },\n data,\n });\n\n const hasUniqueId = !!data.meta?.uniqueRowIdFields?.length;\n\n const options: any = useMemo(() => {\n // This is a bit hard to type with the react-table types here, the reducer does not actually match with the\n // TableOptions.\n const options: any = {\n columns: memoizedColumns,\n data: memoizedData,\n disableResizing: !resizable,\n stateReducer: stateReducer,\n autoResetPage: false,\n initialState: getInitialState(initialSortBy, memoizedColumns),\n autoResetFilters: false,\n sortTypes: {\n // the builtin number type on react-table does not handle NaN values\n number: sortNumber,\n // should be replaced with the builtin string when react-table is upgraded,\n // see https://github.com/tannerlinsley/react-table/pull/3235\n 'alphanumeric-insensitive': sortCaseInsensitive,\n },\n };\n if (hasUniqueId) {\n // row here is just always 0 because here we don't use real data but just a dummy array filled with 0.\n // See memoizedData variable above.\n options.getRowId = (row: Record<string, unknown>, relativeIndex: number) => getRowUniqueId(data, relativeIndex);\n\n // If we have unique field we assume we can count on it as being globally unique, and we don't need to reset when\n // data changes.\n options.autoResetExpanded = false;\n }\n return options;\n }, [initialSortBy, memoizedColumns, memoizedData, resizable, stateReducer, hasUniqueId, data]);\n\n const {\n getTableProps,\n headerGroups,\n footerGroups,\n rows,\n prepareRow,\n totalColumnsWidth,\n page,\n state,\n gotoPage,\n setPageSize,\n pageOptions,\n toggleAllRowsExpanded,\n } = useTable(options, useFilters, useSortBy, useAbsoluteLayout, useResizeColumns, useExpanded, usePagination);\n\n const extendedState = state as GrafanaTableState;\n toggleAllRowsExpandedRef.current = toggleAllRowsExpanded;\n\n /*\n Footer value calculation is being moved in the Table component and the footerValues prop will be deprecated.\n The footerValues prop is still used in the Table component for backwards compatibility. Adding the\n footerOptions prop will switch the Table component to use the new footer calculation. Using both props will\n result in the footerValues prop being ignored.\n */\n useEffect(() => {\n if (!footerOptions) {\n setFooterItems(footerValues);\n }\n }, [footerValues, footerOptions]);\n\n useEffect(() => {\n if (!footerOptions) {\n return;\n }\n\n if (!footerOptions.show) {\n setFooterItems(undefined);\n return;\n }\n\n if (isCountRowsSet) {\n const footerItemsCountRows: FooterItem[] = [];\n footerItemsCountRows[0] = rows.length.toString() ?? data.length.toString();\n setFooterItems(footerItemsCountRows);\n return;\n }\n\n const footerItems = getFooterItems(\n headerGroups[0].headers,\n createFooterCalculationValues(rows),\n footerOptions,\n theme\n );\n\n setFooterItems(footerItems);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [footerOptions, theme, state.filters, data]);\n\n let listHeight = height - (headerHeight + footerHeight);\n\n if (enablePagination) {\n listHeight -= tableStyles.cellHeight;\n }\n\n const pageSize = Math.round(listHeight / tableStyles.rowHeight) - 1;\n\n useEffect(() => {\n // Don't update the page size if it is less than 1\n if (pageSize <= 0) {\n return;\n }\n setPageSize(pageSize);\n }, [pageSize, setPageSize]);\n\n useEffect(() => {\n // Reset page index when data changes\n // This is needed because react-table does not do this automatically\n // autoResetPage is set to false because setting it to true causes the issue described in\n // https://github.com/grafana/grafana/pull/67477\n if (data.length / pageSize < state.pageIndex) {\n gotoPage(0);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [data]);\n\n useResetVariableListSizeCache(extendedState, listRef, data, hasUniqueId);\n useFixScrollbarContainer(variableSizeListScrollbarRef, tableDivRef);\n\n const onNavigate = useCallback(\n (toPage: number) => {\n gotoPage(toPage - 1);\n },\n [gotoPage]\n );\n\n const itemCount = enablePagination ? page.length : rows.length;\n let paginationEl = null;\n if (enablePagination) {\n const itemsRangeStart = state.pageIndex * state.pageSize + 1;\n let itemsRangeEnd = itemsRangeStart + state.pageSize - 1;\n const isSmall = width < 550;\n if (itemsRangeEnd > data.length) {\n itemsRangeEnd = data.length;\n }\n const numRows = rows.length;\n const displayedEnd = itemsRangeEnd < rows.length ? itemsRangeEnd : rows.length;\n paginationEl = (\n <div className={tableStyles.paginationWrapper}>\n <Pagination\n currentPage={state.pageIndex + 1}\n numberOfPages={pageOptions.length}\n showSmallVersion={isSmall}\n onNavigate={onNavigate}\n />\n {isSmall ? null : (\n <div className={tableStyles.paginationSummary}>\n <Trans i18nKey=\"grafana-ui.table.pagination-summary\">\n {{ itemsRangeStart }} - {{ displayedEnd }} of {{ numRows }} rows\n </Trans>\n </div>\n )}\n </div>\n );\n }\n\n // Try to determine the longest field\n // TODO: do we wrap only one field?\n // What if there are multiple fields with long text?\n const longestField = fieldConfig ? guessLongestField(fieldConfig, data) : undefined;\n let textWrapField = undefined;\n if (fieldConfig !== undefined) {\n data.fields.forEach((field) => {\n fieldConfig.overrides.forEach((override) => {\n const matcher = getFieldMatcher(override.matcher);\n if (matcher(field, data, [data])) {\n for (const property of override.properties) {\n if (property.id === 'custom.cellOptions' && property.value.wrapText) {\n textWrapField = field;\n }\n }\n }\n });\n });\n }\n\n return (\n <>\n <div\n {...getTableProps()}\n className={tableStyles.table}\n aria-label={ariaLabel}\n role=\"table\"\n ref={tableDivRef}\n style={{ width, height }}\n >\n <CustomScrollbar hideVerticalTrack={true}>\n <div className={tableStyles.tableContentWrapper(totalColumnsWidth)}>\n {!noHeader && (\n <HeaderRow headerGroups={headerGroups} showTypeIcons={showTypeIcons} tableStyles={tableStyles} />\n )}\n {itemCount > 0 ? (\n <div\n data-testid={selectors.components.Panels.Visualization.Table.body}\n ref={variableSizeListScrollbarRef}\n >\n <RowsList\n headerGroups={headerGroups}\n data={data}\n rows={rows}\n width={width}\n cellHeight={cellHeight}\n headerHeight={headerHeight}\n rowHeight={tableStyles.rowHeight}\n itemCount={itemCount}\n pageIndex={state.pageIndex}\n listHeight={listHeight}\n listRef={listRef}\n tableState={state}\n prepareRow={prepareRow}\n timeRange={timeRange}\n onCellFilterAdded={onCellFilterAdded}\n nestedDataField={nestedDataField}\n tableStyles={tableStyles}\n footerPaginationEnabled={Boolean(enablePagination)}\n enableSharedCrosshair={enableSharedCrosshair}\n initialRowIndex={initialRowIndex}\n longestField={longestField}\n textWrapField={textWrapField}\n getActions={getActions}\n replaceVariables={replaceVariables}\n setInspectCell={setInspectCell}\n />\n </div>\n ) : (\n <div style={{ height: height - headerHeight, width }} className={tableStyles.noData}>\n {noValuesDisplayText}\n </div>\n )}\n {footerItems && (\n <FooterRow\n isPaginationVisible={Boolean(enablePagination)}\n footerValues={footerItems}\n footerGroups={footerGroups}\n totalColumnsWidth={totalColumnsWidth}\n tableStyles={tableStyles}\n />\n )}\n </div>\n </CustomScrollbar>\n {paginationEl}\n </div>\n\n {inspectCell !== null && (\n <TableCellInspector\n mode={inspectCell.mode}\n value={inspectCell.value}\n onDismiss={() => {\n setInspectCell(null);\n }}\n />\n )}\n </>\n );\n});\n\nTable.displayName = 'Table';\n"],"names":["state","options","_a","footerItems"],"mappings":"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"}