## 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
51 lines
1.2 KiB
TypeScript
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};
|
|
}
|
|
`,
|
|
};
|
|
};
|