@grafana/ui
Version:
Grafana Components Library
1 lines • 24.4 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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"}