UNPKG

@grafana/ui

Version:
1 lines • 17.8 kB
{"version":3,"file":"PlotLegend.cjs","sources":["../../../../src/components/uPlot/PlotLegend.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { memo, useCallback, useMemo, useState } from 'react';\n\nimport {\n type DataFrame,\n type GrafanaTheme2,\n extractFacetedLabels,\n getFieldDisplayName,\n getFieldSeriesColor,\n resolveFacetedFilterNames,\n} from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { type VizLegendOptions, AxisPlacement } from '@grafana/schema';\n\nimport { SeriesVisibilityChangeMode } from '../../components/PanelChrome/types';\nimport { useStyles2, useTheme2 } from '../../themes/ThemeContext';\nimport { Button } from '../Button/Button';\nimport { IconButton } from '../IconButton/IconButton';\nimport { usePanelContext } from '../PanelChrome';\nimport { Toggletip } from '../Toggletip/Toggletip';\nimport { VizLayout, type VizLayoutLegendProps } from '../VizLayout/VizLayout';\nimport { FacetedLabelsFilter } from '../VizLegend/FacetedLabelsFilter';\nimport { VizLegend } from '../VizLegend/VizLegend';\nimport { type VizLegendItem } from '../VizLegend/types';\n\nimport { type UPlotConfigBuilder } from './config/UPlotConfigBuilder';\nimport { getDisplayValuesForCalcs } from './utils';\n\ninterface PlotLegendProps extends VizLegendOptions, Omit<VizLayoutLegendProps, 'children'> {\n data: DataFrame[];\n config: UPlotConfigBuilder;\n enableFacetedFilter?: boolean;\n facetedFilterPinned?: boolean;\n onPinnedToSidebarChange?: (pinned: boolean) => void;\n}\n\n/**\n * mostly duplicates logic in PlotLegend below :(\n *\n * @internal\n */\nexport function hasVisibleLegendSeries(config: UPlotConfigBuilder, data: DataFrame[]) {\n return config.getSeries().some((s) => {\n const fieldIndex = s.props.dataFrameFieldIndex;\n\n if (!fieldIndex) {\n return false;\n }\n\n const field = data[fieldIndex.frameIndex]?.fields[fieldIndex.fieldIndex];\n\n if (!field || field.config.custom?.hideFrom?.legend) {\n return false;\n }\n\n return true;\n });\n}\n\nexport const PlotLegend = memo(function PlotLegend({\n data,\n config,\n placement,\n calcs,\n displayMode,\n limit,\n enableFacetedFilter = false,\n facetedFilterPinned = false,\n onPinnedToSidebarChange,\n ...vizLayoutLegendProps\n}: PlotLegendProps) {\n const theme = useTheme2();\n const styles = useStyles2(getPlotLegendStyles);\n const { onToggleSeriesVisibility } = usePanelContext();\n\n const [selectedLabels, setSelectedLabels] = useState<Record<string, string[]>>({});\n\n const facetedLabels = useMemo(\n () => (enableFacetedFilter && onToggleSeriesVisibility ? extractFacetedLabels(data) : {}),\n [enableFacetedFilter, onToggleSeriesVisibility, data]\n );\n const hasFacetedLabels = Object.keys(facetedLabels).length > 0;\n const hasActiveFilters = Object.values(selectedLabels).some((v) => v.length > 0);\n\n const legendItems = config\n .getSeries()\n .map<VizLegendItem | undefined>((s) => {\n const seriesConfig = s.props;\n const fieldIndex = seriesConfig.dataFrameFieldIndex;\n const axisPlacement = config.getAxisPlacement(s.props.scaleKey);\n\n if (!fieldIndex) {\n return undefined;\n }\n\n const field = data[fieldIndex.frameIndex]?.fields[fieldIndex.fieldIndex];\n\n if (!field || field.config.custom?.hideFrom?.legend) {\n return undefined;\n }\n\n const label = getFieldDisplayName(field, data[fieldIndex.frameIndex]!, data);\n const scaleColor = getFieldSeriesColor(field, theme);\n const seriesColor = scaleColor.color;\n\n return {\n disabled: !(seriesConfig.show ?? true),\n fieldIndex,\n color: seriesColor,\n label,\n yAxis: axisPlacement === AxisPlacement.Left || axisPlacement === AxisPlacement.Bottom ? 1 : 2,\n getDisplayValues: () => getDisplayValuesForCalcs(calcs, field, theme),\n getItemKey: () => `${label}-${fieldIndex.frameIndex}-${fieldIndex.fieldIndex}`,\n lineStyle: seriesConfig.lineStyle,\n };\n })\n .filter((i): i is VizLegendItem => i !== undefined);\n\n const legendHasPrecedence = useMemo(() => {\n if (!hasActiveFilters) {\n return false;\n }\n\n const expectedVisible = resolveFacetedFilterNames(data, selectedLabels, getFieldDisplayName);\n if (!expectedVisible) {\n return false;\n }\n\n const expectedSet = new Set(expectedVisible);\n const actuallyVisible = new Set(legendItems.filter((item) => !item.disabled).map((item) => item.label));\n\n if (expectedSet.size !== actuallyVisible.size) {\n return true;\n }\n\n return !Array.from(expectedSet).every((name) => actuallyVisible.has(name));\n }, [hasActiveFilters, data, selectedLabels, legendItems]);\n\n const handleLabelsChange = useCallback(\n (selected: Record<string, string[]>) => {\n setSelectedLabels(selected);\n const visibleNames = resolveFacetedFilterNames(data, selected, getFieldDisplayName);\n onToggleSeriesVisibility?.(visibleNames, SeriesVisibilityChangeMode.SetExactly);\n },\n [data, onToggleSeriesVisibility]\n );\n\n const handleClearFilters = useCallback(() => {\n setSelectedLabels({});\n onToggleSeriesVisibility?.(null, SeriesVisibilityChangeMode.SetExactly);\n }, [onToggleSeriesVisibility]);\n\n const handleToggleFilterDock = useCallback(() => {\n onPinnedToSidebarChange?.(!facetedFilterPinned);\n }, [onPinnedToSidebarChange, facetedFilterPinned]);\n\n const facetedFilter = hasFacetedLabels ? (\n <FacetedLabelsFilter\n labels={facetedLabels}\n selected={selectedLabels}\n onChange={handleLabelsChange}\n dimmed={legendHasPrecedence}\n />\n ) : null;\n\n const filterToggle = facetedFilter ? (\n <Toggletip\n content={\n <div className={styles.filterPopoverContent}>\n {facetedFilter}\n <div className={styles.filterPopoverFooter}>\n <Button variant=\"secondary\" size=\"sm\" icon=\"gf-pin\" onClick={handleToggleFilterDock}>\n {t('grafana-ui.viz-legend.pin-filter', 'Pin to sidebar')}\n </Button>\n {hasActiveFilters && (\n <Button variant=\"secondary\" size=\"sm\" icon=\"times\" onClick={handleClearFilters}>\n {t('grafana-ui.viz-legend.clear-filters', 'Clear all')}\n </Button>\n )}\n </div>\n </div>\n }\n placement=\"bottom-start\"\n fitContent\n dismissOnScroll\n >\n <IconButton\n name=\"eye\"\n size=\"md\"\n tooltip={t('grafana-ui.viz-legend.series-visibility', 'Series visibility')}\n variant={hasActiveFilters ? 'primary' : undefined}\n data-testid=\"faceted-labels-filter-toggle\"\n />\n </Toggletip>\n ) : null;\n\n const legend = (\n <VizLegend\n placement={placement}\n items={legendItems}\n displayMode={displayMode}\n sortBy={vizLayoutLegendProps.sortBy}\n sortDesc={vizLayoutLegendProps.sortDesc}\n isSortable={true}\n limit={limit}\n filterAction={!facetedFilterPinned ? filterToggle : undefined}\n overflow={vizLayoutLegendProps.overflow}\n />\n );\n\n if (facetedFilterPinned && facetedFilter) {\n return (\n <VizLayout.Legend placement={placement} {...vizLayoutLegendProps}>\n <div className={styles.legendWithFilter}>\n <div className={styles.filterContent}>\n <div className={styles.filterDockedActions}>\n {hasActiveFilters && (\n <IconButton\n name=\"filter-minus\"\n size=\"sm\"\n tooltip={t('grafana-ui.viz-legend.clear-filters', 'Clear all')}\n onClick={handleClearFilters}\n />\n )}\n <IconButton\n name=\"times\"\n size=\"sm\"\n tooltip={t('grafana-ui.viz-legend.unpin-sidebar', 'Unpin')}\n onClick={handleToggleFilterDock}\n />\n </div>\n {facetedFilter}\n </div>\n <div className={styles.legendContent}>{legend}</div>\n </div>\n </VizLayout.Legend>\n );\n }\n\n return (\n <VizLayout.Legend placement={placement} {...vizLayoutLegendProps}>\n {legend}\n </VizLayout.Legend>\n );\n});\n\nPlotLegend.displayName = 'PlotLegend';\n\nconst getPlotLegendStyles = (theme: GrafanaTheme2) => ({\n legendWithFilter: css({\n display: 'flex',\n width: '100%',\n height: '100%',\n gap: theme.spacing(1),\n overflow: 'hidden',\n }),\n legendContent: css({\n flex: 1,\n minWidth: 0,\n overflow: 'auto',\n }),\n filterContent: css({\n position: 'relative',\n maxWidth: '50%',\n overflow: 'auto',\n borderRight: `1px solid ${theme.colors.border.weak}`,\n paddingRight: theme.spacing(1),\n }),\n filterDockedActions: css({\n position: 'absolute',\n zIndex: 1,\n right: theme.spacing(0.5),\n top: theme.spacing(0.5),\n display: 'flex',\n gap: theme.spacing(0.25),\n color: theme.colors.text.secondary,\n }),\n filterPopoverContent: css({\n margin: theme.spacing(-3, -2),\n maxHeight: 400,\n overflow: 'auto',\n }),\n filterPopoverFooter: css({\n display: 'flex',\n gap: theme.spacing(1),\n borderTop: `1px solid ${theme.colors.border.medium}`,\n padding: theme.spacing(1),\n }),\n});\n"],"names":["memo","PlotLegend","data","useTheme2","useStyles2","usePanelContext","useState","useMemo","extractFacetedLabels","getFieldDisplayName","getFieldSeriesColor","AxisPlacement","getDisplayValuesForCalcs","resolveFacetedFilterNames","useCallback","SeriesVisibilityChangeMode","jsx","FacetedLabelsFilter","Toggletip","jsxs","Button","t","IconButton","VizLegend","VizLayout","css"],"mappings":"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"}