@grafana/ui
Version:
Grafana Components Library
1 lines • 8.14 kB
Source Map (JSON)
{"version":3,"file":"VizLegendTable.mjs","sources":["../../../../src/components/VizLegend/VizLegendTable.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { Icon } from '../Icon/Icon';\n\nimport { LegendTableItem } from './VizLegendTableItem';\nimport { VizLegendItem, VizLegendTableProps } from './types';\n\nconst nameSortKey = 'Name';\nconst naturalCompare = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' }).compare;\n\n/**\n * @internal\n */\nexport const VizLegendTable = <T extends unknown>({\n items,\n sortBy: sortKey,\n sortDesc,\n itemRenderer,\n className,\n onToggleSort,\n onLabelClick,\n onLabelMouseOver,\n onLabelMouseOut,\n readonly,\n isSortable,\n}: VizLegendTableProps<T>): JSX.Element => {\n const styles = useStyles2(getStyles);\n const header: Record<string, string> = {};\n\n if (isSortable) {\n header[nameSortKey] = '';\n }\n\n for (const item of items) {\n if (item.getDisplayValues) {\n for (const displayValue of item.getDisplayValues()) {\n header[displayValue.title ?? '?'] = displayValue.description ?? '';\n }\n }\n }\n\n if (sortKey != null) {\n let itemVals = new Map<VizLegendItem, number>();\n\n items.forEach((item) => {\n if (sortKey !== nameSortKey && item.getDisplayValues) {\n const stat = item.getDisplayValues().find((stat) => stat.title === sortKey);\n const val = stat == null || Number.isNaN(stat.numeric) ? -Infinity : stat.numeric;\n itemVals.set(item, val);\n }\n });\n\n let sortMult = sortDesc ? -1 : 1;\n\n if (sortKey === nameSortKey) {\n // string sort\n items.sort((a, b) => {\n return sortMult * naturalCompare(a.label, b.label);\n });\n } else {\n // numeric sort\n items.sort((a, b) => {\n const aVal = itemVals.get(a) ?? 0;\n const bVal = itemVals.get(b) ?? 0;\n\n return sortMult * (aVal - bVal);\n });\n }\n }\n\n if (!itemRenderer) {\n /* eslint-disable-next-line react/display-name */\n itemRenderer = (item, index) => (\n <LegendTableItem\n key={`${item.label}-${index}`}\n item={item}\n onLabelClick={onLabelClick}\n onLabelMouseOver={onLabelMouseOver}\n onLabelMouseOut={onLabelMouseOut}\n readonly={readonly}\n />\n );\n }\n\n return (\n <table className={cx(styles.table, className)}>\n <thead>\n <tr>\n {!isSortable && <th></th>}\n {Object.keys(header).map((columnTitle) => (\n <th\n title={header[columnTitle]}\n key={columnTitle}\n className={cx(styles.header, onToggleSort && styles.headerSortable, isSortable && styles.nameHeader, {\n [styles.withIcon]: sortKey === columnTitle,\n })}\n onClick={() => {\n if (onToggleSort) {\n onToggleSort(columnTitle);\n }\n }}\n >\n {columnTitle}\n {sortKey === columnTitle && <Icon size=\"xs\" name={sortDesc ? 'angle-down' : 'angle-up'} />}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>{items.map(itemRenderer!)}</tbody>\n </table>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n table: css({\n width: '100%',\n 'th:first-child': {\n width: '100%',\n borderBottom: `1px solid ${theme.colors.border.weak}`,\n },\n }),\n header: css({\n color: theme.colors.primary.text,\n fontWeight: theme.typography.fontWeightMedium,\n borderBottom: `1px solid ${theme.colors.border.weak}`,\n padding: theme.spacing(0.25, 1, 0.25, 1),\n fontSize: theme.typography.bodySmall.fontSize,\n textAlign: 'right',\n whiteSpace: 'nowrap',\n }),\n nameHeader: css({\n textAlign: 'left',\n paddingLeft: '30px',\n }),\n // This needs to be padding-right - icon size(xs==12) to avoid jumping\n withIcon: css({\n paddingRight: '4px',\n }),\n headerSortable: css({\n cursor: 'pointer',\n }),\n});\n"],"names":["stat","_a","_b"],"mappings":"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"}