Skip to content

Commit 0f92629

Browse files
feature: Adds display column selection to variable
This makes variables more dynamic by increasing the customization of variable values vs variable display values
1 parent ce411ba commit 0f92629

File tree

3 files changed

+49
-18
lines changed

3 files changed

+49
-18
lines changed

src/components/VariableQueryEditor.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,11 @@ export const VariableQueryEditor: React.FC<VariableQueryProps> = ({ onChange, qu
3333
if (query.column !== undefined && query.column !== '') {
3434
column = `'${query.column}'`;
3535
}
36-
let displayString = `${type}: '${queryCmd}', Column: ${column}`
36+
let displayColumn = "none";
37+
if (query.displayColumn !== undefined && query.displayColumn !== '') {
38+
displayColumn = `'${query.displayColumn}'`;
39+
}
40+
let displayString = `${type}: '${queryCmd}', Column: ${column}, Display: ${displayColumn}`
3741
onChange(query, displayString);
3842
};
3943

@@ -57,6 +61,10 @@ export const VariableQueryEditor: React.FC<VariableQueryProps> = ({ onChange, qu
5761
setState({...query, column: event.currentTarget.value,});
5862
};
5963

64+
const onDisplayColumnChange = (event: React.FormEvent<HTMLInputElement>) => {
65+
setState({...query, displayColumn: event.currentTarget.value,});
66+
};
67+
6068
return (
6169
<div onBlur={saveQuery}>
6270
<HaystackQueryTypeSelector
@@ -75,6 +83,12 @@ export const VariableQueryEditor: React.FC<VariableQueryProps> = ({ onChange, qu
7583
value={query.column}
7684
/>
7785
</InlineField>
86+
<InlineField label="Display Column">
87+
<Input
88+
onChange={onDisplayColumnChange}
89+
value={query.displayColumn}
90+
/>
91+
</InlineField>
7892
</div>
7993
);
8094
};

src/datasource.ts

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -100,39 +100,55 @@ export class DataSource extends DataSourceWithBackend<HaystackQuery, HaystackDat
100100

101101
return response.data.reduce((acc: MetricFindValue[], frame: DataFrame) => {
102102
// Default to the first field
103-
let field = frame.fields[0];
103+
let column = frame.fields[0];
104104
if (variableQuery.column !== undefined && variableQuery.column !== '') {
105105
// If a column was input, match the column name
106-
field = frame.fields.find((field: Field) => field.name === variableQuery.column) ?? field;
106+
column = frame.fields.find((field: Field) => field.name === variableQuery.column) ?? column;
107107
} else if (frame.fields.some((field: Field) => field.name === 'id')) {
108108
// If there is an id column, use that
109-
field = frame.fields.find((field: Field) => field.name === 'id') ?? field;
109+
column = frame.fields.find((field: Field) => field.name === 'id') ?? column;
110110
}
111111

112-
let fieldVals = field.values.map((value) => {
113-
switch (field.type) {
112+
// Default to the selected column
113+
let displayColumn = column;
114+
if (variableQuery.displayColumn !== undefined && variableQuery.displayColumn !== '') {
115+
// If a column was input, match the column name
116+
displayColumn =
117+
frame.fields.find((field: Field) => field.name === variableQuery.displayColumn) ?? displayColumn;
118+
}
119+
120+
let variableValues = column.values.map((value, index) => {
121+
let variableValue = value;
122+
switch (column.type) {
114123
case FieldType.string:
115124
if (value.startsWith('@')) {
116125
// Detect ref using @ prefix, and adjust value to just the Ref
117126
const spaceIndex = value.indexOf(' ');
118127
if (spaceIndex > -1) {
119128
// Display name exists
120-
const id = value.substring(0, spaceIndex);
121-
const dis = value.substring(spaceIndex + 2, value.length - 1);
122-
return { text: dis, value: id };
123-
} else {
124-
// Otherwise, just use id
125-
return { text: value, value: value };
129+
variableValue = value.substring(0, spaceIndex);
126130
}
127-
} else {
128-
// Otherwise, just use the value directly
129-
return { text: value, value: value };
130131
}
131-
default:
132-
return { text: value, value: value };
133132
}
133+
134+
let displayValue = displayColumn.values[index];
135+
let variableText = displayValue;
136+
switch (displayColumn.type) {
137+
case FieldType.string:
138+
if (displayValue.startsWith('@')) {
139+
// Detect ref using @ prefix, and adjust value to just the Ref
140+
const spaceIndex = displayValue.indexOf(' ');
141+
if (spaceIndex > -1) {
142+
// Display name exists
143+
variableText = displayValue.substring(spaceIndex + 2, displayValue.length - 1);
144+
}
145+
}
146+
}
147+
148+
return { text: variableText, value: variableValue };
134149
});
135-
return acc.concat(fieldVals);
150+
151+
return acc.concat(variableValues);
136152
}, []);
137153
}
138154

src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export interface QueryType extends SelectableValue<string> {
3030

3131
export interface HaystackVariableQuery extends HaystackQuery {
3232
column: string;
33+
displayColumn: string;
3334
refId: string;
3435
}
3536

0 commit comments

Comments
 (0)