@grafana/ui
Version:
Grafana Components Library
1 lines • 24.6 kB
Source Map (JSON)
{"version":3,"file":"RowsList.mjs","sources":["../../../../../src/components/Table/TableRT/RowsList.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { CSSProperties, UIEventHandler, useCallback, useEffect, useMemo, useState } from 'react';\nimport * as React from 'react';\nimport { Cell, Row, TableState, HeaderGroup } from 'react-table';\nimport { VariableSizeList } from 'react-window';\nimport { Subscription, debounceTime } from 'rxjs';\n\nimport {\n DataFrame,\n DataHoverClearEvent,\n DataHoverEvent,\n Field,\n FieldType,\n TimeRange,\n hasTimeField,\n InterpolateFunction,\n} from '@grafana/data';\nimport { TableCellDisplayMode, TableCellHeight } from '@grafana/schema';\n\nimport { useTheme2 } from '../../../themes/ThemeContext';\nimport CustomScrollbar from '../../CustomScrollbar/CustomScrollbar';\nimport { usePanelContext } from '../../PanelChrome';\nimport { TableCell } from '../Cells/TableCell';\nimport {\n CellColors,\n GetActionsFunction,\n TableFieldOptions,\n TableFilterActionCallback,\n TableInspectCellCallback,\n} from '../types';\nimport {\n calculateAroundPointThreshold,\n getCellColors,\n isPointTimeValAroundTableTimeVal,\n guessTextBoundingBox,\n} from '../utils';\n\nimport { ExpandedRow, getExpandedRowHeight } from './ExpandedRow';\nimport { TableStyles } from './styles';\n\ninterface RowsListProps {\n data: DataFrame;\n rows: Row[];\n enableSharedCrosshair: boolean;\n headerHeight: number;\n rowHeight: number;\n itemCount: number;\n pageIndex: number;\n listHeight: number;\n width: number;\n cellHeight?: TableCellHeight;\n listRef: React.RefObject<VariableSizeList>;\n tableState: TableState;\n tableStyles: TableStyles;\n nestedDataField?: Field;\n prepareRow: (row: Row) => void;\n onCellFilterAdded?: TableFilterActionCallback;\n timeRange?: TimeRange;\n footerPaginationEnabled: boolean;\n initialRowIndex?: number;\n headerGroups: HeaderGroup[];\n longestField?: Field;\n textWrapField?: Field;\n getActions?: GetActionsFunction;\n replaceVariables?: InterpolateFunction;\n setInspectCell?: TableInspectCellCallback;\n}\n\nexport const RowsList = (props: RowsListProps) => {\n const {\n data,\n rows,\n headerHeight,\n footerPaginationEnabled,\n rowHeight,\n itemCount,\n pageIndex,\n tableState,\n prepareRow,\n onCellFilterAdded,\n width,\n cellHeight = TableCellHeight.Sm,\n timeRange,\n tableStyles,\n nestedDataField,\n listHeight,\n listRef,\n enableSharedCrosshair = false,\n initialRowIndex = undefined,\n headerGroups,\n longestField,\n textWrapField,\n getActions,\n replaceVariables,\n setInspectCell,\n } = props;\n\n const [rowHighlightIndex, setRowHighlightIndex] = useState<number | undefined>(initialRowIndex);\n if (initialRowIndex === undefined && rowHighlightIndex !== undefined) {\n setRowHighlightIndex(undefined);\n }\n\n const theme = useTheme2();\n const panelContext = usePanelContext();\n\n // Create off-screen canvas for measuring rows for virtualized rendering\n // This line is like this because Jest doesn't have OffscreenCanvas mocked\n // nor is it a part of the jest-canvas-mock package\n let osContext = null;\n if (window.OffscreenCanvas !== undefined) {\n // The canvas size is defined arbitrarily\n // As we never actually visualize rendered content\n // from the offscreen canvas, only perform text measurements\n osContext = new OffscreenCanvas(256, 1024).getContext('2d');\n }\n\n // Set font property using theme info\n // This will make text measurement accurate\n if (osContext !== undefined && osContext !== null) {\n osContext.font = `${theme.typography.fontSize}px ${theme.typography.body.fontFamily}`;\n }\n\n const threshold = useMemo(() => {\n const timeField = data.fields.find((f) => f.type === FieldType.time);\n\n if (!timeField) {\n return 0;\n }\n\n return calculateAroundPointThreshold(timeField);\n }, [data]);\n\n const onRowHover = useCallback(\n (idx: number, frame: DataFrame) => {\n if (!panelContext || !enableSharedCrosshair) {\n return;\n }\n\n const timeField: Field = frame!.fields.find((f) => f.type === FieldType.time)!;\n\n if (!timeField) {\n return;\n }\n\n panelContext.eventBus.publish(\n new DataHoverEvent({\n point: {\n time: timeField.values[idx],\n },\n })\n );\n },\n [enableSharedCrosshair, panelContext]\n );\n\n const onRowLeave = useCallback(() => {\n if (!panelContext || !enableSharedCrosshair) {\n return;\n }\n\n panelContext.eventBus.publish(new DataHoverClearEvent());\n }, [enableSharedCrosshair, panelContext]);\n\n const onDataHoverEvent = useCallback(\n (evt: DataHoverEvent) => {\n if (evt.payload.point?.time && evt.payload.rowIndex !== undefined) {\n const timeField = data.fields.find((f) => f.type === FieldType.time);\n const time = timeField!.values[evt.payload.rowIndex];\n const pointTime = evt.payload.point.time;\n\n // If the time value of the hovered point is around the time value of the\n // row with same index, highlight the row\n if (isPointTimeValAroundTableTimeVal(pointTime, time, threshold)) {\n setRowHighlightIndex(evt.payload.rowIndex);\n return;\n }\n\n // If the time value of the hovered point is not around the time value of the\n // row with same index, try to find a row with same time value\n const matchedRowIndex = timeField!.values.findIndex((t) =>\n isPointTimeValAroundTableTimeVal(pointTime, t, threshold)\n );\n\n if (matchedRowIndex !== -1) {\n setRowHighlightIndex(matchedRowIndex);\n return;\n }\n\n setRowHighlightIndex(undefined);\n }\n },\n [data.fields, threshold]\n );\n\n useEffect(() => {\n if (!panelContext || !enableSharedCrosshair || !hasTimeField(data) || footerPaginationEnabled) {\n return;\n }\n\n const subs = new Subscription();\n\n subs.add(\n panelContext.eventBus\n .getStream(DataHoverEvent)\n .pipe(debounceTime(250))\n .subscribe({\n next: (evt) => {\n if (panelContext.eventBus === evt.origin) {\n return;\n }\n\n onDataHoverEvent(evt);\n },\n })\n );\n\n subs.add(\n panelContext.eventBus\n .getStream(DataHoverClearEvent)\n .pipe(debounceTime(250))\n .subscribe({\n next: (evt) => {\n if (panelContext.eventBus === evt.origin) {\n return;\n }\n\n setRowHighlightIndex(undefined);\n },\n })\n );\n\n return () => {\n subs.unsubscribe();\n };\n }, [data, enableSharedCrosshair, footerPaginationEnabled, onDataHoverEvent, panelContext]);\n\n let scrollTop: number | undefined = undefined;\n if (rowHighlightIndex !== undefined) {\n const firstMatchedRowIndex = rows.findIndex((row) => row.index === rowHighlightIndex);\n\n if (firstMatchedRowIndex !== -1) {\n scrollTop = headerHeight + (firstMatchedRowIndex - 1) * rowHeight;\n }\n }\n\n const rowIndexForPagination = useCallback(\n (index: number) => {\n return tableState.pageIndex * tableState.pageSize + index;\n },\n [tableState.pageIndex, tableState.pageSize]\n );\n\n let rowBg: Function | undefined = undefined;\n let textWrapFinal: Field | undefined;\n for (const field of data.fields) {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const fieldOptions = field.config.custom as TableFieldOptions;\n const cellOptionsExist = fieldOptions !== undefined && fieldOptions.cellOptions !== undefined;\n\n if (\n cellOptionsExist &&\n fieldOptions.cellOptions.type === TableCellDisplayMode.ColorBackground &&\n fieldOptions.cellOptions.applyToRow\n ) {\n rowBg = (rowIndex: number): CellColors => {\n const display = field.display!(field.values.get(rowIndex));\n const colors = getCellColors(tableStyles.theme, fieldOptions.cellOptions, display);\n return colors;\n };\n }\n\n if (textWrapField !== undefined) {\n textWrapFinal = textWrapField;\n } else if (longestField !== undefined) {\n textWrapFinal = longestField;\n }\n }\n\n const RenderRow = useCallback(\n ({ index, style, rowHighlightIndex }: { index: number; style: CSSProperties; rowHighlightIndex?: number }) => {\n const indexForPagination = rowIndexForPagination(index);\n const row = rows[indexForPagination];\n let additionalProps: React.HTMLAttributes<HTMLDivElement> = {};\n prepareRow(row);\n\n const expandedRowStyle = tableState.expanded[row.id] ? css({ '&:hover': { background: 'inherit' } }) : {};\n const rowExpanded = nestedDataField && tableState.expanded[row.id];\n\n if (rowHighlightIndex !== undefined && row.index === rowHighlightIndex) {\n style = { ...style, backgroundColor: theme.components.table.rowSelected };\n additionalProps = {\n 'aria-selected': 'true',\n };\n }\n\n // Color rows if enabled\n if (rowBg) {\n const { bgColor, textColor } = rowBg(row.index);\n style.background = bgColor;\n style.color = textColor;\n style.borderLeft = `2px solid ${bgColor}`;\n }\n\n // If there's a text wrapping field we set the height of it here\n if (textWrapFinal) {\n const visibleFields = data.fields.filter((field) => !Boolean(field.config.custom?.hidden));\n const seriesIndex = visibleFields.findIndex((field) => field.name === textWrapFinal.name);\n const pxLineHeight = theme.typography.body.lineHeight * theme.typography.fontSize;\n const bbox = guessTextBoundingBox(\n textWrapFinal.values[row.index],\n headerGroups[0].headers[seriesIndex],\n osContext,\n pxLineHeight,\n tableStyles.rowHeight,\n tableStyles.cellPadding\n );\n style.height = bbox.height;\n }\n const { key, ...rowProps } = row.getRowProps({ style, ...additionalProps });\n\n return (\n <div\n key={key}\n {...rowProps}\n className={cx(tableStyles.row, expandedRowStyle)}\n onMouseEnter={() => onRowHover(row.index, data)}\n onMouseLeave={onRowLeave}\n >\n {/*add the nested data to the DOM first to prevent a 1px border CSS issue on the last cell of the row*/}\n {rowExpanded && (\n <ExpandedRow\n nestedData={nestedDataField}\n tableStyles={tableStyles}\n // Using `row.index` ensures that we pick the correct row from the original data frame even when rows in\n // the table are sorted, since `row.index` does not change when sorting.\n rowIndex={row.index}\n width={width}\n cellHeight={cellHeight}\n />\n )}\n {row.cells.map((cell: Cell, index: number) => (\n <TableCell\n key={index}\n tableStyles={tableStyles}\n cell={cell}\n onCellFilterAdded={onCellFilterAdded}\n columnIndex={index}\n columnCount={row.cells.length}\n timeRange={timeRange}\n frame={data}\n rowStyled={rowBg !== undefined}\n rowExpanded={rowExpanded}\n textWrapped={textWrapFinal !== undefined}\n // VariableSizeList overrides calculated in buildCellContainerStyle height of the cell,\n // so we need to subtract 1 to respect the row border\n height={Number(style.height) - 1}\n getActions={getActions}\n replaceVariables={replaceVariables}\n setInspectCell={setInspectCell}\n />\n ))}\n </div>\n );\n },\n [\n rowIndexForPagination,\n rows,\n prepareRow,\n tableState.expanded,\n nestedDataField,\n rowBg,\n textWrapFinal,\n tableStyles,\n onRowLeave,\n width,\n cellHeight,\n theme.components.table.rowSelected,\n theme.typography.body.lineHeight,\n theme.typography.fontSize,\n data,\n headerGroups,\n osContext,\n onRowHover,\n onCellFilterAdded,\n timeRange,\n getActions,\n replaceVariables,\n setInspectCell,\n ]\n );\n\n const getItemSize = (index: number): number => {\n const indexForPagination = rowIndexForPagination(index);\n const row = rows[indexForPagination];\n\n if (tableState.expanded[row.id] && nestedDataField) {\n return getExpandedRowHeight(nestedDataField, row.index, tableStyles);\n }\n\n if (textWrapFinal) {\n const visibleFields = data.fields.filter((field) => !Boolean(field.config.custom?.hidden));\n const seriesIndex = visibleFields.findIndex((field) => field.name === textWrapFinal.name);\n const pxLineHeight = theme.typography.fontSize * theme.typography.body.lineHeight;\n return guessTextBoundingBox(\n textWrapFinal.values[row.index],\n headerGroups[0].headers[seriesIndex],\n osContext,\n pxLineHeight,\n tableStyles.rowHeight,\n tableStyles.cellPadding\n ).height;\n }\n\n return tableStyles.rowHeight;\n };\n\n const handleScroll: UIEventHandler = (event) => {\n const { scrollTop } = event.currentTarget;\n\n if (listRef.current !== null) {\n listRef.current.scrollTo(scrollTop);\n }\n };\n\n // It's a hack for text wrapping.\n // VariableSizeList component didn't know that we manually set row height.\n // So we need to reset the list when the rows high changes.\n useEffect(() => {\n if (listRef.current) {\n listRef.current.resetAfterIndex(0);\n }\n }, [rows, listRef]);\n\n return (\n <CustomScrollbar onScroll={handleScroll} hideHorizontalTrack={true} scrollTop={scrollTop}>\n <VariableSizeList\n key={`${rowHeight}${pageIndex}`}\n height={listHeight}\n itemCount={itemCount}\n itemSize={getItemSize}\n width={'100%'}\n ref={listRef}\n style={{ overflow: undefined }}\n >\n {({ index, style }) => RenderRow({ index, style, rowHighlightIndex })}\n </VariableSizeList>\n </CustomScrollbar>\n );\n};\n"],"names":["rowHighlightIndex","index","scrollTop"],"mappings":"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"}