grafana/public/app/features/datasources/components/picker/utils.ts
Ivan Ortega Alba 3bf8dc1397
DS Picker: Add missing props and improve autoheight logic (#70393)
* DS Picker: Add `inputId` and `noDefault` options

* DS Picker: Add `disabled` state

* Add tests for `disabled`

* Select default DS if `current` is not provided

* Remove `width` from style

* Move types next to components

* Only calculate height when opening
2023-06-23 10:26:18 +02:00

101 lines
2.9 KiB
TypeScript

import { DataSourceInstanceSettings, DataSourceJsonData, DataSourceRef } from '@grafana/data';
export function isDataSourceMatch(
ds: DataSourceInstanceSettings | undefined,
current: string | DataSourceInstanceSettings | DataSourceRef | null | undefined
): boolean {
if (!ds) {
return false;
}
if (!current) {
return false;
}
if (typeof current === 'string') {
return ds.uid === current;
}
return ds.uid === current.uid;
}
export function dataSourceLabel(
dataSource: DataSourceInstanceSettings<DataSourceJsonData> | string | DataSourceRef | null | undefined
) {
if (!dataSource) {
return 'Select a data source';
}
if (typeof dataSource === 'string') {
return `${dataSource} - not found`;
}
if ('name' in dataSource) {
return dataSource.name;
}
if (dataSource.uid) {
return `${dataSource.uid} - not found`;
}
return 'Select a data source';
}
export function getDataSourceCompareFn(
current: DataSourceRef | DataSourceInstanceSettings | string | null | undefined,
recentlyUsedDataSources: string[],
dataSourceVariablesIDs: string[]
) {
const cmpDataSources = (a: DataSourceInstanceSettings, b: DataSourceInstanceSettings) => {
// Sort the current ds before everything else.
if (current && isDataSourceMatch(a, current)) {
return -1;
} else if (current && isDataSourceMatch(b, current)) {
return 1;
}
// Sort recently used data sources by latest used, but after current.
const aIndex = recentlyUsedDataSources.indexOf(a.uid);
const bIndex = recentlyUsedDataSources.indexOf(b.uid);
if (aIndex > -1 && aIndex > bIndex) {
return -1;
}
if (bIndex > -1 && bIndex > aIndex) {
return 1;
}
// Sort variables before the rest. Variables sorted alphabetically by name.
const aIsVariable = dataSourceVariablesIDs.includes(a.uid);
const bIsVariable = dataSourceVariablesIDs.includes(b.uid);
if (aIsVariable && !bIsVariable) {
return -1;
} else if (bIsVariable && !aIsVariable) {
return 1;
} else if (bIsVariable && aIsVariable) {
return a.name < b.name ? -1 : 1;
}
// Sort built in DataSources to the bottom and alphabetically by name.
if (a.meta.builtIn && !b.meta.builtIn) {
return 1;
} else if (b.meta.builtIn && !a.meta.builtIn) {
return -1;
} else if (a.meta.builtIn && b.meta.builtIn) {
return a.name < b.name ? -1 : 1;
}
// Sort the rest alphabetically by name.
return a.name < b.name ? -1 : 1;
};
return cmpDataSources;
}
/**
* Given a data source and a search term, returns true if the data source matches the search term.
* Useful to filter data sources by name containing an string.
* @param ds
* @param searchTerm
* @returns
*/
export function matchDataSourceWithSearch(ds: DataSourceInstanceSettings, searchTerm = '') {
return ds.name.toLowerCase().includes(searchTerm.toLowerCase());
}