@grafana/ui
Version:
Grafana Components Library
1 lines • 5.74 kB
Source Map (JSON)
{"version":3,"file":"HeaderCell.mjs","sources":["../../../../../../src/components/Table/TableNG/Cells/HeaderCell.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport React, { useEffect } from 'react';\nimport { Column, SortDirection } from 'react-data-grid';\n\nimport { Field, GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../../../themes/ThemeContext';\nimport { getFieldTypeIcon } from '../../../../types/icon';\nimport { Icon } from '../../../Icon/Icon';\nimport { Filter } from '../Filter/Filter';\nimport { FilterType, TableRow, TableSummaryRow } from '../types';\nimport { getDisplayName } from '../utils';\n\ninterface HeaderCellProps {\n column: Column<TableRow, TableSummaryRow>;\n rows: TableRow[];\n field: Field;\n direction?: SortDirection;\n filter: FilterType;\n setFilter: React.Dispatch<React.SetStateAction<FilterType>>;\n crossFilterOrder: string[];\n crossFilterRows: { [key: string]: TableRow[] };\n showTypeIcons?: boolean;\n}\n\nconst HeaderCell: React.FC<HeaderCellProps> = ({\n column,\n rows,\n field,\n direction,\n filter,\n setFilter,\n crossFilterOrder,\n crossFilterRows,\n showTypeIcons,\n}) => {\n const headerCellWrap = field.config.custom?.wrapHeaderText ?? false;\n const styles = useStyles2(getStyles, headerCellWrap);\n const displayName = getDisplayName(field);\n const filterable = field.config.custom?.filterable ?? false;\n\n // we have to remove/reset the filter if the column is not filterable\n useEffect(() => {\n if (!filterable && filter[displayName]) {\n setFilter((filter: FilterType) => {\n const newFilter = { ...filter };\n delete newFilter[displayName];\n return newFilter;\n });\n }\n }, [filterable, displayName, filter, setFilter]);\n\n return (\n <>\n {showTypeIcons && (\n <Icon className={styles.headerCellIcon} name={getFieldTypeIcon(field)} title={field?.type} size=\"sm\" />\n )}\n <span className={styles.headerCellLabel}>{getDisplayName(field)}</span>\n {direction && (\n <Icon\n className={cx(styles.headerCellIcon, styles.headerSortIcon)}\n size=\"lg\"\n name={direction === 'ASC' ? 'arrow-up' : 'arrow-down'}\n />\n )}\n {filterable && (\n <Filter\n name={column.key}\n rows={rows}\n filter={filter}\n setFilter={setFilter}\n field={field}\n crossFilterOrder={crossFilterOrder}\n crossFilterRows={crossFilterRows}\n iconClassName={styles.headerCellIcon}\n />\n )}\n </>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2, headerTextWrap?: boolean) => ({\n headerCellLabel: css({\n cursor: 'pointer',\n fontWeight: theme.typography.fontWeightMedium,\n color: theme.colors.text.secondary,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: headerTextWrap ? 'pre-line' : 'nowrap',\n '&:hover': {\n textDecoration: 'underline',\n color: theme.colors.text.link,\n },\n }),\n headerCellIcon: css({\n marginBottom: theme.spacing(0.5),\n alignSelf: 'flex-end',\n color: theme.colors.text.secondary,\n }),\n headerSortIcon: css({\n marginBottom: theme.spacing(0.25),\n }),\n});\n\nexport { HeaderCell };\n"],"names":["filter"],"mappings":"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"}