UNPKG

@grafana/ui

Version:
1 lines • 33.5 kB
{"version":3,"file":"hooks.mjs","sources":["../../../../../src/components/Table/TableNG/hooks.ts"],"sourcesContent":["import { useState, useMemo, useEffect, useCallback, useRef, useLayoutEffect } from 'react';\nimport { Column, DataGridProps, SortColumn } from 'react-data-grid';\nimport { varPreLine } from 'uwrap';\n\nimport { Field, fieldReducers, FieldType, formattedValueToString, LinkModel, reduceField } from '@grafana/data';\n\nimport { useTheme2 } from '../../../themes/ThemeContext';\nimport { TableCellDisplayMode, TableColumnResizeActionCallback } from '../types';\n\nimport { TABLE } from './constants';\nimport { FilterType, TableFooterCalc, TableRow, TableSortByFieldState, TableSummaryRow } from './types';\nimport {\n getDisplayName,\n processNestedTableRows,\n applySort,\n getCellOptions,\n getColumnTypes,\n GetMaxWrapCellOptions,\n getMaxWrapCell,\n getCellLinks,\n} from './utils';\n\n// Helper function to get displayed value\nconst getDisplayedValue = (row: TableRow, key: string, fields: Field[]) => {\n const field = fields.find((field) => getDisplayName(field) === key);\n if (!field || !field.display) {\n return '';\n }\n const displayedValue = formattedValueToString(field.display(row[key]));\n return displayedValue;\n};\n\nexport interface FilteredRowsResult {\n rows: TableRow[];\n filter: FilterType;\n setFilter: React.Dispatch<React.SetStateAction<FilterType>>;\n crossFilterOrder: string[];\n crossFilterRows: Record<string, TableRow[]>;\n}\n\nexport interface FilteredRowsOptions {\n hasNestedFrames: boolean;\n}\n\nexport function useFilteredRows(\n rows: TableRow[],\n fields: Field[],\n { hasNestedFrames }: FilteredRowsOptions\n): FilteredRowsResult {\n // TODO: allow persisted filter selection via url\n const [filter, setFilter] = useState<FilterType>({});\n const filterValues = useMemo(() => Object.entries(filter), [filter]);\n\n const crossFilterOrder: FilteredRowsResult['crossFilterOrder'] = useMemo(\n () => Array.from(new Set(filterValues.map(([key]) => key))),\n [filterValues]\n );\n\n const [filteredRows, crossFilterRows] = useMemo(() => {\n const crossFilterRows: FilteredRowsResult['crossFilterRows'] = {};\n\n const filterRows = (row: TableRow): boolean => {\n for (const [key, value] of filterValues) {\n const displayedValue = getDisplayedValue(row, key, fields);\n if (!value.filteredSet.has(displayedValue)) {\n return false;\n }\n // collect rows for crossFilter\n crossFilterRows[key] = crossFilterRows[key] ?? [];\n crossFilterRows[key].push(row);\n }\n return true;\n };\n\n const filteredRows = hasNestedFrames\n ? processNestedTableRows(rows, (parents) => parents.filter(filterRows))\n : rows.filter(filterRows);\n\n return [filteredRows, crossFilterRows];\n }, [filterValues, rows, fields, hasNestedFrames]);\n\n return {\n rows: filteredRows,\n filter,\n setFilter,\n crossFilterOrder,\n crossFilterRows,\n };\n}\n\nexport interface SortedRowsOptions {\n hasNestedFrames: boolean;\n initialSortBy?: TableSortByFieldState[];\n}\n\nexport interface SortedRowsResult {\n rows: TableRow[];\n sortColumns: SortColumn[];\n setSortColumns: React.Dispatch<React.SetStateAction<SortColumn[]>>;\n}\n\nexport function useSortedRows(\n rows: TableRow[],\n fields: Field[],\n { initialSortBy, hasNestedFrames }: SortedRowsOptions\n): SortedRowsResult {\n const initialSortColumns = useMemo<SortColumn[]>(\n () =>\n initialSortBy?.flatMap(({ displayName, desc }) => {\n if (!fields.some((f) => getDisplayName(f) === displayName)) {\n return [];\n }\n return [\n {\n columnKey: displayName,\n direction: desc ? ('DESC' as const) : ('ASC' as const),\n },\n ];\n }) ?? [],\n [] // eslint-disable-line react-hooks/exhaustive-deps\n );\n const [sortColumns, setSortColumns] = useState<SortColumn[]>(initialSortColumns);\n const columnTypes = useMemo(() => getColumnTypes(fields), [fields]);\n\n const sortedRows = useMemo(\n () => applySort(rows, fields, sortColumns, columnTypes, hasNestedFrames),\n [rows, fields, sortColumns, hasNestedFrames, columnTypes]\n );\n\n return {\n rows: sortedRows,\n sortColumns,\n setSortColumns,\n };\n}\n\nexport interface PaginatedRowsOptions {\n height: number;\n width: number;\n rowHeight: number | ((row: TableRow) => number);\n headerHeight: number;\n footerHeight: number;\n paginationHeight?: number;\n enabled: boolean;\n}\n\nexport interface PaginatedRowsResult {\n rows: TableRow[];\n page: number;\n setPage: React.Dispatch<React.SetStateAction<number>>;\n numPages: number;\n rowsPerPage: number;\n pageRangeStart: number;\n pageRangeEnd: number;\n smallPagination: boolean;\n}\n\n// hand-measured. pagination height is 30px, plus 8px top margin\nconst PAGINATION_HEIGHT = 38;\n\nexport function usePaginatedRows(\n rows: TableRow[],\n { height, width, headerHeight, footerHeight, rowHeight, enabled }: PaginatedRowsOptions\n): PaginatedRowsResult {\n // TODO: allow persisted page selection via url\n const [page, setPage] = useState(0);\n const numRows = rows.length;\n\n // calculate average row height if row height is variable.\n const avgRowHeight = useMemo(() => {\n if (!enabled) {\n return 0;\n }\n\n if (typeof rowHeight === 'number') {\n return rowHeight;\n }\n\n // we'll just measure 100 rows to estimate\n return rows.slice(0, 100).reduce((avg, row, _, { length }) => avg + rowHeight(row) / length, 0);\n }, [rows, rowHeight, enabled]);\n\n // using dimensions of the panel, calculate pagination parameters\n const { numPages, rowsPerPage, pageRangeStart, pageRangeEnd, smallPagination } = useMemo((): {\n numPages: number;\n rowsPerPage: number;\n pageRangeStart: number;\n pageRangeEnd: number;\n smallPagination: boolean;\n } => {\n if (!enabled) {\n return { numPages: 0, rowsPerPage: 0, pageRangeStart: 1, pageRangeEnd: numRows, smallPagination: false };\n }\n\n // calculate number of rowsPerPage based on height stack\n const rowAreaHeight = height - headerHeight - footerHeight - PAGINATION_HEIGHT;\n const heightPerRow = Math.floor(rowAreaHeight / (avgRowHeight || 1));\n // ensure at least one row per page is displayed\n let rowsPerPage = heightPerRow > 1 ? heightPerRow : 1;\n\n // calculate row range for pagination summary display\n const pageRangeStart = page * rowsPerPage + 1;\n let pageRangeEnd = pageRangeStart + rowsPerPage - 1;\n if (pageRangeEnd > numRows) {\n pageRangeEnd = numRows;\n }\n const smallPagination = width < TABLE.PAGINATION_LIMIT;\n const numPages = Math.ceil(numRows / rowsPerPage);\n return {\n numPages,\n rowsPerPage,\n pageRangeStart,\n pageRangeEnd,\n smallPagination,\n };\n }, [width, height, headerHeight, footerHeight, avgRowHeight, enabled, numRows, page]);\n\n // safeguard against page overflow on panel resize or other factors\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n if (page > numPages) {\n // resets pagination to end\n setPage(numPages - 1);\n }\n }, [numPages, enabled, page, setPage]);\n\n // apply pagination to the sorted rows\n const paginatedRows = useMemo(() => {\n if (!enabled) {\n return rows;\n }\n const pageOffset = page * rowsPerPage;\n return rows.slice(pageOffset, pageOffset + rowsPerPage);\n }, [page, rowsPerPage, rows, enabled]);\n\n return {\n rows: paginatedRows,\n page: enabled ? page : -1,\n setPage,\n numPages,\n rowsPerPage,\n pageRangeStart,\n pageRangeEnd,\n smallPagination,\n };\n}\n\nexport interface FooterCalcsOptions {\n enabled?: boolean;\n isCountRowsSet?: boolean;\n footerOptions?: TableFooterCalc;\n}\n\nexport function useFooterCalcs(\n rows: TableRow[],\n fields: Field[],\n { enabled, footerOptions, isCountRowsSet }: FooterCalcsOptions\n): string[] {\n return useMemo(() => {\n const footerReducers = footerOptions?.reducer;\n\n if (!enabled || !footerOptions || !Array.isArray(footerReducers) || !footerReducers.length) {\n return [];\n }\n\n return fields.map((field, index) => {\n if (field.state?.calcs) {\n delete field.state?.calcs;\n }\n\n if (isCountRowsSet) {\n return index === 0 ? `${rows.length}` : '';\n }\n\n if (index === 0) {\n const footerCalcReducer = footerReducers[0];\n return footerCalcReducer ? fieldReducers.get(footerCalcReducer).name : '';\n }\n\n if (field.type !== FieldType.number) {\n return '';\n }\n\n // if field.display is undefined, don't throw\n const displayFn = field.display;\n if (!displayFn) {\n return '';\n }\n\n // If fields array is specified, only show footer for fields included in that array\n if (footerOptions.fields?.length && !footerOptions.fields?.includes(getDisplayName(field))) {\n return '';\n }\n\n const calc = footerReducers[0];\n const value = reduceField({\n field: {\n ...field,\n values: rows.map((row) => row[getDisplayName(field)]),\n },\n reducers: footerReducers,\n })[calc];\n\n return formattedValueToString(displayFn(value));\n });\n }, [fields, enabled, footerOptions, isCountRowsSet, rows]);\n}\n\ninterface TypographyCtx {\n ctx: CanvasRenderingContext2D;\n font: string;\n avgCharWidth: number;\n calcRowHeight: (text: string, cellWidth: number, defaultHeight: number) => number;\n}\n\nexport function useTypographyCtx(): TypographyCtx {\n const theme = useTheme2();\n const typographyCtx = useMemo((): TypographyCtx => {\n const font = `${theme.typography.fontSize}px ${theme.typography.fontFamily}`;\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n // set in grafana/data in createTypography.ts\n const letterSpacing = 0.15;\n\n ctx.letterSpacing = `${letterSpacing}px`;\n ctx.font = font;\n const txt =\n \"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s\";\n const txtWidth = ctx.measureText(txt).width;\n const avgCharWidth = txtWidth / txt.length + letterSpacing;\n const { count } = varPreLine(ctx);\n\n const calcRowHeight = (text: string, cellWidth: number, defaultHeight: number) => {\n if (text === '') {\n return defaultHeight;\n }\n const numLines = count(text, cellWidth);\n const totalHeight = numLines * TABLE.LINE_HEIGHT + 2 * TABLE.CELL_PADDING;\n return Math.max(totalHeight, defaultHeight);\n };\n\n return {\n calcRowHeight,\n ctx,\n font,\n avgCharWidth,\n };\n }, [theme.typography.fontSize, theme.typography.fontFamily]);\n return typographyCtx;\n}\n\nconst ICON_WIDTH = 16;\nconst ICON_GAP = 4;\n\ninterface UseHeaderHeightOptions {\n enabled: boolean;\n fields: Field[];\n columnWidths: number[];\n defaultHeight: number;\n sortColumns: SortColumn[];\n typographyCtx: TypographyCtx;\n showTypeIcons?: boolean;\n}\n\nexport function useHeaderHeight({\n fields,\n enabled,\n columnWidths,\n defaultHeight,\n sortColumns,\n typographyCtx: { calcRowHeight, avgCharWidth },\n showTypeIcons = false,\n}: UseHeaderHeightOptions): number {\n const perIconSpace = ICON_WIDTH + ICON_GAP;\n const columnAvailableWidths = useMemo(\n () =>\n columnWidths.map((c, idx) => {\n let width = c - 2 * TABLE.CELL_PADDING - TABLE.BORDER_RIGHT;\n // filtering icon\n if (fields[idx]?.config?.custom?.filterable) {\n width -= perIconSpace;\n }\n // sorting icon\n if (sortColumns.some((col) => col.columnKey === getDisplayName(fields[idx]))) {\n width -= perIconSpace;\n }\n // type icon\n if (showTypeIcons) {\n width -= perIconSpace;\n }\n return Math.floor(width);\n }),\n [fields, columnWidths, sortColumns, showTypeIcons, perIconSpace]\n );\n\n const [wrappedColHeaderIdxs, hasWrappedColHeaders] = useMemo(() => {\n let hasWrappedColHeaders = false;\n return [\n fields.map((field) => {\n const wrapText = field.config?.custom?.wrapHeaderText ?? false;\n if (wrapText) {\n hasWrappedColHeaders = true;\n }\n return wrapText;\n }),\n hasWrappedColHeaders,\n ];\n }, [fields]);\n\n const maxWrapCellOptions = useMemo<GetMaxWrapCellOptions>(\n () => ({\n colWidths: columnAvailableWidths,\n avgCharWidth,\n wrappedColIdxs: wrappedColHeaderIdxs,\n }),\n [columnAvailableWidths, avgCharWidth, wrappedColHeaderIdxs]\n );\n\n // TODO: is there a less clunky way to subtract the top padding value?\n const headerHeight = useMemo(() => {\n if (!enabled) {\n return 0;\n }\n if (!hasWrappedColHeaders) {\n return defaultHeight - TABLE.CELL_PADDING;\n }\n\n const { text: maxLinesText, idx: maxLinesIdx } = getMaxWrapCell(fields, -1, maxWrapCellOptions);\n return calcRowHeight(maxLinesText, columnAvailableWidths[maxLinesIdx], defaultHeight) - TABLE.CELL_PADDING;\n }, [fields, enabled, hasWrappedColHeaders, maxWrapCellOptions, calcRowHeight, columnAvailableWidths, defaultHeight]);\n\n return headerHeight;\n}\n\ninterface UseRowHeightOptions {\n columnWidths: number[];\n fields: Field[];\n hasNestedFrames: boolean;\n defaultHeight: number;\n headerHeight: number;\n expandedRows: Record<string, boolean>;\n typographyCtx: TypographyCtx;\n}\n\nexport function useRowHeight({\n columnWidths,\n fields,\n hasNestedFrames,\n defaultHeight,\n headerHeight,\n expandedRows,\n typographyCtx: { calcRowHeight, avgCharWidth },\n}: UseRowHeightOptions): number | ((row: TableRow) => number) {\n const [wrappedColIdxs, hasWrappedCols] = useMemo(() => {\n let hasWrappedCols = false;\n return [\n fields.map((field) => {\n if (field.type !== FieldType.string) {\n return false;\n }\n\n const cellOptions = getCellOptions(field);\n const wrapText = 'wrapText' in cellOptions && cellOptions.wrapText;\n const type = cellOptions.type;\n const result = !!wrapText && type !== TableCellDisplayMode.Image;\n if (result === true) {\n hasWrappedCols = true;\n }\n return result;\n }),\n hasWrappedCols,\n ];\n }, [fields]);\n\n const colWidths = useMemo(\n () => columnWidths.map((c) => c - 2 * TABLE.CELL_PADDING - TABLE.BORDER_RIGHT),\n [columnWidths]\n );\n\n const maxWrapCellOptions = useMemo<GetMaxWrapCellOptions>(\n () => ({\n colWidths,\n avgCharWidth,\n wrappedColIdxs,\n }),\n [colWidths, avgCharWidth, wrappedColIdxs]\n );\n\n const rowHeight = useMemo(() => {\n // row height is only complicated when there are nested frames or wrapped columns.\n if (!hasNestedFrames && !hasWrappedCols) {\n return defaultHeight;\n }\n\n return (row: TableRow) => {\n // nested rows\n if (Number(row.__depth) > 0) {\n // if unexpanded, height === 0\n if (!expandedRows[row.__index]) {\n return 0;\n }\n\n // Ensure we have a minimum height (defaultHeight) for the nested table even if data is empty\n const rowCount = row.data?.length ?? 0;\n return Math.max(defaultHeight, defaultHeight * rowCount + headerHeight);\n }\n\n // regular rows\n const { text: maxLinesText, idx: maxLinesIdx } = getMaxWrapCell(fields, row.__index, maxWrapCellOptions);\n return calcRowHeight(maxLinesText, colWidths[maxLinesIdx], defaultHeight);\n };\n }, [\n calcRowHeight,\n defaultHeight,\n expandedRows,\n fields,\n hasNestedFrames,\n hasWrappedCols,\n headerHeight,\n maxWrapCellOptions,\n colWidths,\n ]);\n\n return rowHeight;\n}\n\n/**\n * react-data-grid is a little unwieldy when it comes to column resize events.\n * we want to detect a few different column resize signals:\n * - dragging the handle (only want to dispatch when handle is released)\n * - double-clicking the handle (sets the column to the minimum width to fit content)\n * `onColumnResize` dispatches events throughout a dragged resize, and `onColumnWidthsChanged` doesn't\n * emit an event when double-click resizing occurs, so we have to build something custom on top of these\n * behaviors in order to get everything working.\n */\ninterface UseColumnResizeState {\n columnKey: string | undefined;\n width: number;\n}\n\nconst INITIAL_COL_RESIZE_STATE = Object.freeze({ columnKey: undefined, width: 0 }) satisfies UseColumnResizeState;\n\nexport function useColumnResize(\n onColumnResize: TableColumnResizeActionCallback = () => {}\n): DataGridProps<TableRow, TableSummaryRow>['onColumnResize'] {\n // these must be refs. if we used setState, we would run into race conditions with these event listeners\n const colResizeState = useRef<UseColumnResizeState>({ ...INITIAL_COL_RESIZE_STATE });\n const pointerIsDown = useRef(false);\n\n // to detect whether we got a double-click resize, we track whether the pointer is currently down\n useLayoutEffect(() => {\n function pointerDown(_event: PointerEvent) {\n pointerIsDown.current = true;\n }\n\n function pointerUp(_event: PointerEvent) {\n pointerIsDown.current = false;\n }\n\n window.addEventListener('pointerdown', pointerDown);\n window.addEventListener('pointerup', pointerUp);\n\n return () => {\n window.removeEventListener('pointerdown', pointerDown);\n window.removeEventListener('pointerup', pointerUp);\n };\n });\n\n const dispatchEvent = useCallback(() => {\n if (colResizeState.current.columnKey) {\n onColumnResize(colResizeState.current.columnKey, Math.floor(colResizeState.current.width));\n colResizeState.current = { ...INITIAL_COL_RESIZE_STATE };\n }\n window.removeEventListener('click', dispatchEvent, { capture: true });\n }, [onColumnResize]);\n\n // this is the callback that gets passed to react-data-grid\n const dataGridResizeHandler = useCallback(\n (column: Column<TableRow, TableSummaryRow>, width: number) => {\n if (!colResizeState.current.columnKey) {\n window.addEventListener('click', dispatchEvent, { capture: true });\n }\n\n colResizeState.current.columnKey = column.key;\n colResizeState.current.width = width;\n\n // when double clicking to resize, this handler will fire, but the pointer will not be down,\n // meaning that we should immediately flush the new width\n if (!pointerIsDown.current) {\n dispatchEvent();\n }\n },\n [dispatchEvent]\n );\n\n return dataGridResizeHandler;\n}\n\nexport function useSingleLink(field: Field, rowIdx: number): LinkModel | undefined {\n const linksCount = field.config.links?.length ?? 0;\n const actionsCount = field.config.actions?.length ?? 0;\n const shouldShowLink = linksCount === 1 && actionsCount === 0;\n return useMemo(() => (shouldShowLink ? (getCellLinks(field, rowIdx) ?? []) : [])[0], [field, shouldShowLink, rowIdx]);\n}\n"],"names":["field","crossFilterRows","filteredRows","rowsPerPage","pageRangeStart","pageRangeEnd","smallPagination","numPages","hasWrappedColHeaders","hasWrappedCols","_a"],"mappings":"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"}