{"version":3,"file":"VizLegendTable.cjs","sources":["../../../../src/components/VizLegend/VizLegendTable.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport type { JSX } from 'react';\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    [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          {Object.keys(header).map((columnTitle) => (\n            <th\n              title={header[columnTitle]}\n              key={columnTitle}\n              className={cx(styles.header, {\n                [styles.headerSortable]: Boolean(onToggleSort),\n                [styles.nameHeader]: isSortable,\n                [styles.withIcon]: sortKey === columnTitle,\n                'sr-only': !isSortable,\n              })}\n              onClick={() => {\n                if (onToggleSort && isSortable) {\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":["useStyles2","stat","_a","_b","jsx","LegendTableItem","cx","jsxs","Icon","css"],"mappings":"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"}