1import { ComponentType } from 'react';
2import {
3  BusEventWithPayload,
4  DataQuery,
5  DataSourceJsonData,
6  DataSourceRef,
7  LoadingState,
8  QueryEditorProps,
9  VariableModel as BaseVariableModel,
10  VariableType,
11} from '@grafana/data';
12
13import { NEW_VARIABLE_ID } from './state/types';
14import { VariableQueryProps } from '../../types';
15
16export enum VariableRefresh {
17  never, // removed from the UI
18  onDashboardLoad,
19  onTimeRangeChanged,
20}
21
22export enum VariableHide {
23  dontHide,
24  hideLabel,
25  hideVariable,
26}
27
28export enum VariableSort {
29  disabled,
30  alphabeticalAsc,
31  alphabeticalDesc,
32  numericalAsc,
33  numericalDesc,
34  alphabeticalCaseInsensitiveAsc,
35  alphabeticalCaseInsensitiveDesc,
36}
37
38export interface VariableOption {
39  selected: boolean;
40  text: string | string[];
41  value: string | string[];
42  isNone?: boolean;
43}
44
45export interface AdHocVariableFilter {
46  key: string;
47  operator: string;
48  value: string;
49  condition: string;
50}
51
52export interface AdHocVariableModel extends VariableModel {
53  datasource: DataSourceRef | null;
54  filters: AdHocVariableFilter[];
55}
56
57export interface IntervalVariableModel extends VariableWithOptions {
58  auto: boolean;
59  auto_min: string;
60  auto_count: number;
61  refresh: VariableRefresh;
62}
63
64export interface CustomVariableModel extends VariableWithMultiSupport {}
65
66export interface DataSourceVariableModel extends VariableWithMultiSupport {
67  regex: string;
68  refresh: VariableRefresh;
69}
70
71export interface QueryVariableModel extends DataSourceVariableModel {
72  datasource: DataSourceRef | null;
73  definition: string;
74  sort: VariableSort;
75  queryValue?: string;
76  query: any;
77}
78
79export interface TextBoxVariableModel extends VariableWithOptions {
80  originalQuery: string | null;
81}
82
83export interface ConstantVariableModel extends VariableWithOptions {}
84
85export interface VariableWithMultiSupport extends VariableWithOptions {
86  multi: boolean;
87  includeAll: boolean;
88  allValue?: string | null;
89}
90
91export interface VariableWithOptions extends VariableModel {
92  current: VariableOption;
93  options: VariableOption[];
94  query: string;
95}
96
97export interface DashboardProps {
98  name: string;
99  uid: string;
100  toString: () => string;
101}
102
103export interface DashboardVariableModel extends SystemVariable<DashboardProps> {}
104
105export interface OrgProps {
106  name: string;
107  id: number;
108  toString: () => string;
109}
110
111export interface OrgVariableModel extends SystemVariable<OrgProps> {}
112
113export interface UserProps {
114  login: string;
115  id: number;
116  email?: string;
117  toString: () => string;
118}
119
120export interface UserVariableModel extends SystemVariable<UserProps> {}
121
122export interface SystemVariable<TProps extends { toString: () => string }> extends VariableModel {
123  current: { value: TProps };
124}
125
126export interface VariableModel extends BaseVariableModel {
127  id: string;
128  global: boolean;
129  hide: VariableHide;
130  skipUrlSync: boolean;
131  index: number;
132  state: LoadingState;
133  error: any | null;
134  description: string | null;
135}
136
137export const initialVariableModelState: VariableModel = {
138  id: NEW_VARIABLE_ID,
139  name: '',
140  label: null,
141  type: ('' as unknown) as VariableType,
142  global: false,
143  index: -1,
144  hide: VariableHide.dontHide,
145  skipUrlSync: false,
146  state: LoadingState.NotStarted,
147  error: null,
148  description: null,
149};
150
151export type VariableQueryEditorType<
152  TQuery extends DataQuery = DataQuery,
153  TOptions extends DataSourceJsonData = DataSourceJsonData
154> = ComponentType<VariableQueryProps> | ComponentType<QueryEditorProps<any, TQuery, TOptions, any>> | null;
155
156export interface VariablesChangedEvent {
157  refreshAll: boolean;
158  panelIds: number[];
159}
160
161export class VariablesChanged extends BusEventWithPayload<VariablesChangedEvent> {
162  static type = 'variables-changed';
163}
164
165export interface VariablesTimeRangeProcessDoneEvent {
166  variableIds: string[];
167}
168
169export class VariablesTimeRangeProcessDone extends BusEventWithPayload<VariablesTimeRangeProcessDoneEvent> {
170  static type = 'variables-time-range-process-done';
171}
172
173export class VariablesChangedInUrl extends BusEventWithPayload<VariablesChangedEvent> {
174  static type = 'variables-changed-in-url';
175}
176