mirror of
https://github.com/grafana/grafana.git
synced 2025-02-12 08:35:43 -06:00
* Chore: reduces a lot of variable errors * Chore: reduces variable Editor errors * Chore: reduces variable Picker errors * Chore: reduce error count * Chore: reduces errors for ChangeEvent instead of FormEvent * Chore: reduces errors with CombinedState * Chore: reduces ComponentType errors * Chore: reduce errors in reducers * Chore: reduces misc errors * Chore: reduce AdhocPicker errors * Chore: reduce error limit * Update public/app/features/variables/adhoc/picker/AdHocFilterValue.tsx Co-authored-by: Alex Khomenko <Clarity-89@users.noreply.github.com> * Chore: updates after PR comments * Chore: small refactor Co-authored-by: Alex Khomenko <Clarity-89@users.noreply.github.com>
191 lines
5.9 KiB
TypeScript
191 lines
5.9 KiB
TypeScript
import { ComponentType } from 'react';
|
|
import { Observable } from 'rxjs';
|
|
import {
|
|
CustomVariableSupport,
|
|
DataQuery,
|
|
DataQueryRequest,
|
|
DataQueryResponse,
|
|
DataSourceApi,
|
|
DataSourceJsonData,
|
|
MetricFindValue,
|
|
QueryEditorProps,
|
|
StandardVariableQuery,
|
|
StandardVariableSupport,
|
|
VariableModel,
|
|
VariableSupportType,
|
|
} from '@grafana/data';
|
|
|
|
import {
|
|
AdHocVariableModel,
|
|
ConstantVariableModel,
|
|
QueryVariableModel,
|
|
VariableQueryEditorType,
|
|
VariableWithMultiSupport,
|
|
VariableWithOptions,
|
|
} from './types';
|
|
import { VariableQueryProps } from '../../types';
|
|
import { LEGACY_VARIABLE_QUERY_EDITOR_NAME } from './editor/LegacyVariableQueryEditor';
|
|
|
|
export const isQuery = (model: VariableModel): model is QueryVariableModel => {
|
|
return model.type === 'query';
|
|
};
|
|
|
|
export const isAdHoc = (model: VariableModel): model is AdHocVariableModel => {
|
|
return model.type === 'adhoc';
|
|
};
|
|
|
|
export const isConstant = (model: VariableModel): model is ConstantVariableModel => {
|
|
return model.type === 'constant';
|
|
};
|
|
|
|
export const isMulti = (model: VariableModel): model is VariableWithMultiSupport => {
|
|
const withMulti = model as VariableWithMultiSupport;
|
|
return withMulti.hasOwnProperty('multi') && typeof withMulti.multi === 'boolean';
|
|
};
|
|
|
|
export const hasOptions = (model: VariableModel): model is VariableWithOptions => {
|
|
if (!model) {
|
|
return false;
|
|
}
|
|
|
|
const withOptions = model as VariableWithOptions;
|
|
return withOptions.hasOwnProperty('options') && typeof withOptions.options === 'object';
|
|
};
|
|
|
|
interface DataSourceWithLegacyVariableSupport<
|
|
TQuery extends DataQuery = DataQuery,
|
|
TOptions extends DataSourceJsonData = DataSourceJsonData
|
|
> extends DataSourceApi<TQuery, TOptions> {
|
|
metricFindQuery(query: any, options?: any): Promise<MetricFindValue[]>;
|
|
variables: undefined;
|
|
}
|
|
|
|
interface DataSourceWithStandardVariableSupport<
|
|
TQuery extends DataQuery = DataQuery,
|
|
TOptions extends DataSourceJsonData = DataSourceJsonData
|
|
> extends DataSourceApi<TQuery, TOptions> {
|
|
variables: {
|
|
getType(): VariableSupportType;
|
|
toDataQuery(query: StandardVariableQuery): TQuery;
|
|
query(request: DataQueryRequest<TQuery>): Observable<DataQueryResponse>;
|
|
};
|
|
}
|
|
|
|
interface DataSourceWithCustomVariableSupport<
|
|
VariableQuery extends DataQuery = any,
|
|
TQuery extends DataQuery = DataQuery,
|
|
TOptions extends DataSourceJsonData = DataSourceJsonData
|
|
> extends DataSourceApi<TQuery, TOptions> {
|
|
variables: {
|
|
getType(): VariableSupportType;
|
|
editor: ComponentType<QueryEditorProps<any, TQuery, TOptions, VariableQuery>>;
|
|
query(request: DataQueryRequest<TQuery>): Observable<DataQueryResponse>;
|
|
};
|
|
}
|
|
|
|
interface DataSourceWithDatasourceVariableSupport<
|
|
TQuery extends DataQuery = DataQuery,
|
|
TOptions extends DataSourceJsonData = DataSourceJsonData
|
|
> extends DataSourceApi<TQuery, TOptions> {
|
|
variables: {
|
|
getType(): VariableSupportType;
|
|
};
|
|
}
|
|
|
|
/*
|
|
* The following guard function are both TypeScript type guards.
|
|
* They also make the basis for the logic used by variableQueryRunner and determining which QueryEditor to use
|
|
* */
|
|
export const hasLegacyVariableSupport = <
|
|
TQuery extends DataQuery = DataQuery,
|
|
TOptions extends DataSourceJsonData = DataSourceJsonData
|
|
>(
|
|
datasource: DataSourceApi<TQuery, TOptions>
|
|
): datasource is DataSourceWithLegacyVariableSupport<TQuery, TOptions> => {
|
|
return Boolean(datasource.metricFindQuery) && !Boolean(datasource.variables);
|
|
};
|
|
|
|
export const hasStandardVariableSupport = <
|
|
TQuery extends DataQuery = DataQuery,
|
|
TOptions extends DataSourceJsonData = DataSourceJsonData
|
|
>(
|
|
datasource: DataSourceApi<TQuery, TOptions>
|
|
): datasource is DataSourceWithStandardVariableSupport<TQuery, TOptions> => {
|
|
if (!datasource.variables) {
|
|
return false;
|
|
}
|
|
|
|
if (datasource.variables.getType() !== VariableSupportType.Standard) {
|
|
return false;
|
|
}
|
|
|
|
const variableSupport = datasource.variables as StandardVariableSupport<DataSourceApi<TQuery, TOptions>>;
|
|
|
|
return Boolean(variableSupport.toDataQuery);
|
|
};
|
|
|
|
export const hasCustomVariableSupport = <
|
|
TQuery extends DataQuery = DataQuery,
|
|
TOptions extends DataSourceJsonData = DataSourceJsonData
|
|
>(
|
|
datasource: DataSourceApi<TQuery, TOptions>
|
|
): datasource is DataSourceWithCustomVariableSupport<any, TQuery, TOptions> => {
|
|
if (!datasource.variables) {
|
|
return false;
|
|
}
|
|
|
|
if (datasource.variables.getType() !== VariableSupportType.Custom) {
|
|
return false;
|
|
}
|
|
|
|
const variableSupport = datasource.variables as CustomVariableSupport<DataSourceApi<TQuery, TOptions>>;
|
|
|
|
return Boolean(variableSupport.query) && Boolean(variableSupport.editor);
|
|
};
|
|
|
|
export const hasDatasourceVariableSupport = <
|
|
TQuery extends DataQuery = DataQuery,
|
|
TOptions extends DataSourceJsonData = DataSourceJsonData
|
|
>(
|
|
datasource: DataSourceApi<TQuery, TOptions>
|
|
): datasource is DataSourceWithDatasourceVariableSupport<TQuery, TOptions> => {
|
|
if (!datasource.variables) {
|
|
return false;
|
|
}
|
|
|
|
return datasource.variables.getType() === VariableSupportType.Datasource;
|
|
};
|
|
|
|
export function isLegacyQueryEditor<
|
|
TQuery extends DataQuery = DataQuery,
|
|
TOptions extends DataSourceJsonData = DataSourceJsonData
|
|
>(
|
|
component: VariableQueryEditorType,
|
|
datasource: DataSourceApi<TQuery, TOptions>
|
|
): component is ComponentType<VariableQueryProps> {
|
|
if (!component) {
|
|
return false;
|
|
}
|
|
|
|
return component.displayName === LEGACY_VARIABLE_QUERY_EDITOR_NAME || hasLegacyVariableSupport(datasource);
|
|
}
|
|
|
|
export function isQueryEditor<
|
|
TQuery extends DataQuery = DataQuery,
|
|
TOptions extends DataSourceJsonData = DataSourceJsonData
|
|
>(
|
|
component: VariableQueryEditorType,
|
|
datasource: DataSourceApi<TQuery, TOptions>
|
|
): component is ComponentType<QueryEditorProps<DataSourceApi<TQuery, TOptions>, TQuery, TOptions, any>> {
|
|
if (!component) {
|
|
return false;
|
|
}
|
|
|
|
return (
|
|
component.displayName !== LEGACY_VARIABLE_QUERY_EDITOR_NAME &&
|
|
(hasDatasourceVariableSupport(datasource) ||
|
|
hasStandardVariableSupport(datasource) ||
|
|
hasCustomVariableSupport(datasource))
|
|
);
|
|
}
|