Submit
Path:
~
/
/
usr
/
share
/
grafana
/
public
/
app
/
plugins
/
panel
/
geomap
/
components
/
File Content:
MarkersLegend.tsx
import { css, cx } from '@emotion/css'; import BaseLayer from 'ol/layer/Base'; import React, { useMemo } from 'react'; import { useObservable } from 'react-use'; import { of } from 'rxjs'; import { DataFrame, formattedValueToString, getFieldColorModeForField, GrafanaTheme2 } from '@grafana/data'; import { getMinMaxAndDelta } from '@grafana/data/src/field/scale'; import { useStyles2, VizLegendItem } from '@grafana/ui'; import { ColorScale } from 'app/core/components/ColorScale/ColorScale'; import { SanitizedSVG } from 'app/core/components/SVG/SanitizedSVG'; import { getThresholdItems } from 'app/core/components/TimelineChart/utils'; import { config } from 'app/core/config'; import { DimensionSupplier } from 'app/features/dimensions'; import { StyleConfigState } from '../style/types'; import { MapLayerState } from '../types'; export interface MarkersLegendProps { size?: DimensionSupplier<number>; layerName?: string; styleConfig?: StyleConfigState; layer?: BaseLayer; } export function MarkersLegend(props: MarkersLegendProps) { const { layerName, styleConfig, layer } = props; const style = useStyles2(getStyles); const hoverEvent = useObservable(((layer as any)?.__state as MapLayerState)?.mouseEvents ?? of(undefined)); const colorField = styleConfig?.dims?.color?.field; const hoverValue = useMemo(() => { if (!colorField || !hoverEvent) { return undefined; } const props = hoverEvent.getProperties(); const frame: DataFrame = props.frame; if (!frame) { return undefined; } const rowIndex: number = props.rowIndex; return colorField.values[rowIndex]; }, [hoverEvent, colorField]); if (!styleConfig) { return <></>; } const { color, opacity } = styleConfig?.base ?? {}; const symbol = styleConfig?.config.symbol?.fixed; if (color && symbol && !colorField) { return ( <div className={style.infoWrap}> <div className={style.layerName}>{layerName}</div> <div className={cx(style.layerBody, style.fixedColorContainer)}> <SanitizedSVG src={`public/${symbol}`} className={style.legendSymbol} title={'Symbol'} style={{ fill: color, opacity: opacity }} /> </div> </div> ); } if (!colorField) { return <></>; } const colorMode = getFieldColorModeForField(colorField); if (colorMode.isContinuous && colorMode.getColors) { const colors = colorMode.getColors(config.theme2); const colorRange = getMinMaxAndDelta(colorField); // TODO: explore showing mean on the gradiant scale // const stats = reduceField({ // field: color.field!, // reducers: [ // ReducerID.min, // ReducerID.max, // ReducerID.mean, // // std dev? // ] // }) const display = colorField.display ? (v: number) => formattedValueToString(colorField.display!(v)) : (v: number) => `${v}`; return ( <div className={style.infoWrap}> <div className={style.layerName}>{layerName}</div> <div className={cx(style.layerBody, style.colorScaleWrapper)}> <ColorScale hoverValue={hoverValue} colorPalette={colors} min={colorRange.min ?? 0} max={colorRange.max ?? 100} display={display} useStopsPercentage={false} /> </div> </div> ); } const thresholds = colorField?.config?.thresholds; if (!thresholds || thresholds.steps.length < 2) { return <div></div>; // don't show anything in the legend } const items = getThresholdItems(colorField!.config, config.theme2); return ( <div className={style.infoWrap}> <div className={style.layerName}>{layerName}</div> <div className={cx(style.layerBody, style.legend)}> {items.map((item: VizLegendItem, idx: number) => ( <div key={`${idx}/${item.label}`} className={style.legendItem}> <i style={{ background: item.color }}></i> {item.label} </div> ))} </div> </div> ); } const getStyles = (theme: GrafanaTheme2) => ({ infoWrap: css({ display: 'flex', flexDirection: 'column', background: theme.colors.background.secondary, // eslint-disable-next-line @grafana/no-border-radius-literal borderRadius: '1px', padding: theme.spacing(1), borderBottom: `2px solid ${theme.colors.border.strong}`, minWidth: '150px', }), layerName: css({ fontSize: theme.typography.body.fontSize, }), layerBody: css({ paddingLeft: '10px', }), legend: css({ lineHeight: '18px', display: 'flex', flexDirection: 'column', fontSize: theme.typography.bodySmall.fontSize, padding: '5px 10px 0', i: { width: '15px', height: '15px', float: 'left', marginRight: '8px', opacity: 0.7, borderRadius: theme.shape.radius.circle, }, }), legendItem: css({ whiteSpace: 'nowrap', }), fixedColorContainer: css({ minWidth: '80px', fontSize: theme.typography.bodySmall.fontSize, paddingTop: '5px', }), legendSymbol: css({ height: '18px', width: '18px', margin: 'auto', }), colorScaleWrapper: css({ minWidth: '200px', fontSize: theme.typography.bodySmall.fontSize, paddingTop: '10px', }), });
Edit
Rename
Chmod
Delete
FILE
FOLDER
INFO
Name
Size
Permission
Action
DebugOverlay.tsx
1811 bytes
0644
MarkersLegend.tsx
5364 bytes
0644
MeasureOverlay.tsx
4541 bytes
0644
MeasureVectorLayer.ts
7111 bytes
0644
ObservablePropsWrapper.tsx
873 bytes
0644
N4ST4R_ID | Naxtarrr