1import { ComponentType } from 'react';
2import { Reducer } from 'redux';
3import { Registry, UrlQueryValue, VariableType } from '@grafana/data';
4
5import { VariableModel, VariableOption } from './types';
6import { VariableEditorProps } from './editor/types';
7import { VariablePickerProps } from './pickers/types';
8import { createQueryVariableAdapter } from './query/adapter';
9import { createCustomVariableAdapter } from './custom/adapter';
10import { createTextBoxVariableAdapter } from './textbox/adapter';
11import { createConstantVariableAdapter } from './constant/adapter';
12import { createDataSourceVariableAdapter } from './datasource/adapter';
13import { createIntervalVariableAdapter } from './interval/adapter';
14import { createAdHocVariableAdapter } from './adhoc/adapter';
15import { createSystemVariableAdapter } from './system/adapter';
16import { VariablesState } from './state/types';
17
18export interface VariableAdapter<Model extends VariableModel> {
19  id: VariableType;
20  description: string;
21  name: string;
22  initialState: Model;
23  dependsOn: (variable: Model, variableToTest: Model) => boolean;
24  setValue: (variable: Model, option: VariableOption, emitChanges?: boolean) => Promise<void>;
25  setValueFromUrl: (variable: Model, urlValue: UrlQueryValue) => Promise<void>;
26  updateOptions: (variable: Model, searchFilter?: string) => Promise<void>;
27  getSaveModel: (variable: Model, saveCurrentAsDefault?: boolean) => Partial<Model>;
28  getValueForUrl: (variable: Model) => string | string[];
29  picker: ComponentType<VariablePickerProps<Model>>;
30  editor: ComponentType<VariableEditorProps<Model>>;
31  reducer: Reducer<VariablesState>;
32  beforeAdding?: (model: any) => any;
33}
34
35export const getDefaultVariableAdapters = () => [
36  createQueryVariableAdapter(),
37  createCustomVariableAdapter(),
38  createTextBoxVariableAdapter(),
39  createConstantVariableAdapter(),
40  createDataSourceVariableAdapter(),
41  createIntervalVariableAdapter(),
42  createAdHocVariableAdapter(),
43  createSystemVariableAdapter(),
44];
45
46export const variableAdapters = new Registry<VariableAdapter<any>>();
47