Files
grafana-zabbix/src/components/MetricPicker/MetricPicker.tsx
Jocelyn Collado-Kuri 127367464e Standardization across Zabbix UI components (#2141)
## Summary

Throughout Zabbix we did not have a uniform UI - some drop-down were
using `Select` others `Combobox` others a custom one that we created.
Some had placeholders and others did not. This PR aims to standardize
our Zabbix UI across our query, variable and config editors

## Detailed summary 

- Migrate from `Select` to `Combobox` -> `Select` component is
deprecated
- Migrate from `HorizontalGroup` to `Stack` -> `HorizontalGroup` is also
deprecated
- Remove use of "custom" dropdown `MetricPickerMenu` in favor of
`Combobox` ensuring uniformity across our drop-down and removing
maintenance overhead for us down the line
- Standardize placeholders across all inputs

<img width="630" height="243" alt="Screenshot 2025-12-17 at 1 13 45 PM"
src="https://github.com/user-attachments/assets/9382057e-b443-4474-a9c8-850086d7f3d4"
/>

<img width="691" height="256" alt="Screenshot 2025-12-17 at 1 14 05 PM"
src="https://github.com/user-attachments/assets/a05ff2af-8603-4752-8d12-337dc381c0fd"
/>

## Why
To have a clean and standard UI and remove use of UI deprecated
packages.

## How to test
- Query Editor:
- By creating a new query in a dashboard or Explore and interacting with
all the different query types and drop-downs
     - All drop-downs should be searchable and have placeholders
- Config Editor:
- By going to a datasource and ensuring that the dropdown for Datasource
(when DB connection is enabled) and Auth type are responsive and working
as expected)


Fixes:
https://github.com/orgs/grafana/projects/457/views/40?pane=issue&itemId=3740545830&issue=grafana%7Coss-big-tent-squad%7C139
2025-12-18 14:28:29 +00:00

51 lines
1.2 KiB
TypeScript

import { css } from '@emotion/css';
import React, { useRef } from 'react';
import { Combobox, ComboboxOption } from '@grafana/ui';
import { GrafanaTheme2, SelectableValue } from '@grafana/data';
export interface Props {
value: string;
placeholder: string;
isLoading?: boolean;
options: Array<ComboboxOption<string>>;
width?: number;
onChange: (value: string) => void;
}
export const MetricPicker = ({ value, placeholder, options, isLoading, width, onChange }: Props) => {
const ref = useRef<HTMLDivElement>(null);
const onMenuOptionSelect = (option: SelectableValue<string>) => {
const newValue = option?.value || '';
onChange(newValue);
};
return (
<div data-testid="role-picker" style={{ position: 'relative' }} ref={ref}>
<Combobox<string>
width={width}
value={value}
options={options ?? []}
onChange={onMenuOptionSelect}
loading={isLoading}
placeholder={placeholder}
/>
</div>
);
};
export const getStyles = (theme: GrafanaTheme2) => {
return {
inputRegexp: css`
input {
color: ${theme.colors.warning.main};
}
`,
inputVariable: css`
input {
color: ${theme.colors.primary.text};
}
`,
};
};