import { css } from '@emotion/css'; import { GrafanaTheme2 } from '@grafana/data'; import { SceneComponentProps, SceneObjectBase, SceneObjectState } from '@grafana/scenes'; import { Dropdown, Switch, ToolbarButton, useStyles2 } from '@grafana/ui'; import { Trans } from '@grafana/ui/src/utils/i18n'; import { MetricScene } from './MetricScene'; import { MetricSelectScene } from './MetricSelect/MetricSelectScene'; import { reportExploreMetrics } from './interactions'; import { getTrailFor } from './utils'; export interface DataTrailSettingsState extends SceneObjectState { stickyMainGraph?: boolean; isOpen?: boolean; } export class DataTrailSettings extends SceneObjectBase { constructor(state: Partial) { super({ stickyMainGraph: state.stickyMainGraph ?? true, isOpen: state.isOpen ?? false, }); } public onToggleStickyMainGraph = () => { const stickyMainGraph = !this.state.stickyMainGraph; reportExploreMetrics('settings_changed', { stickyMainGraph }); this.setState({ stickyMainGraph }); }; public onToggleOpen = (isOpen: boolean) => { this.setState({ isOpen }); }; public onTogglePreviews = () => { const trail = getTrailFor(this); trail.setState({ showPreviews: !trail.state.showPreviews }); }; static Component = ({ model }: SceneComponentProps) => { const { stickyMainGraph, isOpen } = model.useState(); const styles = useStyles2(getStyles); const trail = getTrailFor(model); const { showPreviews, topScene } = trail.useState(); const renderPopover = () => { return ( /* eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */
evt.stopPropagation()}>
Settings
{topScene instanceof MetricScene && (
Always keep selected metric graph in-view
)} {topScene instanceof MetricSelectScene && (
Show previews of metric graphs
)}
); }; return ( ); }; } function getStyles(theme: GrafanaTheme2) { return { popover: css({ display: 'flex', padding: theme.spacing(2), flexDirection: 'column', background: theme.colors.background.primary, boxShadow: theme.shadows.z3, borderRadius: theme.shape.borderRadius(), border: `1px solid ${theme.colors.border.weak}`, zIndex: 1, marginRight: theme.spacing(2), }), heading: css({ fontWeight: theme.typography.fontWeightMedium, paddingBottom: theme.spacing(2), }), options: css({ display: 'grid', gridTemplateColumns: '1fr 50px', rowGap: theme.spacing(1), columnGap: theme.spacing(2), }), }; }