mirror of
https://github.com/grafana/grafana.git
synced 2025-02-20 11:48:34 -06:00
* first pass * return list * types and cleanup * add to plugin page and add styles * update comment * update comment * fix component path * simplify error component * simplify error struct * fix tests * don't export and fix string() * update naming * remove frontend * introduce phantom loader * track single error * remove error from base * remove unused struct * remove unnecessary filter * add errors endpoint * Update set log to use id field Co-authored-by: Arve Knudsen <arve.knudsen@gmail.com> * skip adding BE plugins * remove errs from plugin + ds list * remove unnecessary fields * add signature state to panels * Fetch plugins errors * grafana/ui component tweaks * DS Picker - add unsigned badge * VizPicker - add unsigned badge * PluginSignatureBadge tweaks * Plugins list - add signatures info box * New datasource page - add signatures info box * Plugin page - add signatures info box * Fix test * Do not show Core label in viz picker * Update public/app/features/plugins/PluginsErrorsInfo.tsx Co-authored-by: Torkel Ödegaard <torkel@grafana.org> * Update public/app/features/plugins/PluginListPage.test.tsx Co-authored-by: Alex Khomenko <Clarity-89@users.noreply.github.com> * Update public/app/features/plugins/PluginListPage.tsx Co-authored-by: Alex Khomenko <Clarity-89@users.noreply.github.com> * Update public/app/features/datasources/NewDataSourcePage.tsx Co-authored-by: Alex Khomenko <Clarity-89@users.noreply.github.com> * Review comments 1 * Review comments 2 * Update public/app/features/plugins/PluginsErrorsInfo.tsx * Update public/app/features/plugins/PluginPage.tsx * Prettier fix * remove stale backend code * Docs issues fix Co-authored-by: Will Browne <will.browne@grafana.com> Co-authored-by: Will Browne <wbrowne@users.noreply.github.com> Co-authored-by: Arve Knudsen <arve.knudsen@gmail.com> Co-authored-by: Torkel Ödegaard <torkel@grafana.org> Co-authored-by: Alex Khomenko <Clarity-89@users.noreply.github.com>
108 lines
2.8 KiB
TypeScript
108 lines
2.8 KiB
TypeScript
// Libraries
|
|
import React, { PureComponent } from 'react';
|
|
|
|
// Components
|
|
import { HorizontalGroup, Select } from '@grafana/ui';
|
|
import { SelectableValue, DataSourceSelectItem } from '@grafana/data';
|
|
import { selectors } from '@grafana/e2e-selectors';
|
|
import { isUnsignedPluginSignature, PluginSignatureBadge } from '../../../features/plugins/PluginSignatureBadge';
|
|
|
|
export interface Props {
|
|
onChange: (ds: DataSourceSelectItem) => void;
|
|
datasources: DataSourceSelectItem[];
|
|
current?: DataSourceSelectItem | null;
|
|
hideTextValue?: boolean;
|
|
onBlur?: () => void;
|
|
autoFocus?: boolean;
|
|
openMenuOnFocus?: boolean;
|
|
showLoading?: boolean;
|
|
placeholder?: string;
|
|
invalid?: boolean;
|
|
}
|
|
|
|
export class DataSourcePicker extends PureComponent<Props> {
|
|
static defaultProps: Partial<Props> = {
|
|
autoFocus: false,
|
|
openMenuOnFocus: false,
|
|
placeholder: 'Select datasource',
|
|
};
|
|
|
|
searchInput: HTMLElement;
|
|
|
|
constructor(props: Props) {
|
|
super(props);
|
|
}
|
|
|
|
onChange = (item: SelectableValue<string>) => {
|
|
const ds = this.props.datasources.find(ds => ds.name === item.value);
|
|
|
|
if (ds) {
|
|
this.props.onChange(ds);
|
|
}
|
|
};
|
|
|
|
render() {
|
|
const {
|
|
datasources,
|
|
current,
|
|
autoFocus,
|
|
hideTextValue,
|
|
onBlur,
|
|
openMenuOnFocus,
|
|
showLoading,
|
|
placeholder,
|
|
invalid,
|
|
} = this.props;
|
|
|
|
const options = datasources.map(ds => ({
|
|
value: ds.name,
|
|
label: ds.name,
|
|
imgUrl: ds.meta.info.logos.small,
|
|
meta: ds.meta,
|
|
}));
|
|
|
|
const value = current && {
|
|
label: current.name.substr(0, 37),
|
|
value: current.name,
|
|
imgUrl: current.meta.info.logos.small,
|
|
loading: showLoading,
|
|
hideText: hideTextValue,
|
|
meta: current.meta,
|
|
};
|
|
|
|
return (
|
|
<div aria-label={selectors.components.DataSourcePicker.container}>
|
|
<Select
|
|
className="ds-picker select-container"
|
|
isMulti={false}
|
|
isClearable={false}
|
|
backspaceRemovesValue={false}
|
|
onChange={this.onChange}
|
|
options={options}
|
|
autoFocus={autoFocus}
|
|
onBlur={onBlur}
|
|
openMenuOnFocus={openMenuOnFocus}
|
|
maxMenuHeight={500}
|
|
menuPlacement="bottom"
|
|
placeholder={placeholder}
|
|
noOptionsMessage="No datasources found"
|
|
value={value}
|
|
invalid={invalid}
|
|
getOptionLabel={o => {
|
|
if (isUnsignedPluginSignature(o.meta.signature) && o !== value) {
|
|
return (
|
|
<HorizontalGroup align="center" justify="space-between">
|
|
<span>{o.label}</span> <PluginSignatureBadge status={o.meta.signature} />
|
|
</HorizontalGroup>
|
|
);
|
|
}
|
|
return o.label || '';
|
|
}}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|
|
}
|
|
|
|
export default DataSourcePicker;
|