@@ -12,6 +12,7 @@ import { DataSourceWithBackend, getTemplateSrv } from '@grafana/runtime';
1212
1313import  {  HaystackQuery ,  OpsQuery ,  HaystackDataSourceOptions ,  HaystackVariableQuery ,  QueryType  }  from  './types' ; 
1414import  {  firstValueFrom  }  from  'rxjs' ; 
15+ import  {  isRef ,  parseRef  }  from  'haystack' ; 
1516
1617export  const  queryTypes : QueryType [ ]  =  [ 
1718  {  label : 'Eval' ,  value : 'eval' ,  apiRequirements : [ 'eval' ] ,  description : 'Evaluate an Axon expression'  } , 
@@ -100,39 +101,33 @@ export class DataSource extends DataSourceWithBackend<HaystackQuery, HaystackDat
100101
101102    return  response . data . reduce ( ( acc : MetricFindValue [ ] ,  frame : DataFrame )  =>  { 
102103      // Default to the first field 
103-       let  field  =  frame . fields [ 0 ] ; 
104+       let  column  =  frame . fields [ 0 ] ; 
104105      if  ( variableQuery . column  !==  undefined  &&  variableQuery . column  !==  '' )  { 
105106        // If a column was input, match the column name 
106-         field  =  frame . fields . find ( ( field : Field )  =>  field . name  ===  variableQuery . column )  ??  field ; 
107+         column  =  frame . fields . find ( ( field : Field )  =>  field . name  ===  variableQuery . column )  ??  column ; 
107108      }  else  if  ( frame . fields . some ( ( field : Field )  =>  field . name  ===  'id' ) )  { 
108109        // If there is an id column, use that 
109-         field  =  frame . fields . find ( ( field : Field )  =>  field . name  ===  'id' )  ??  field ; 
110+         column  =  frame . fields . find ( ( field : Field )  =>  field . name  ===  'id' )  ??  column ; 
110111      } 
111112
112-       let  fieldVals  =  field . values . map ( ( value )  =>  { 
113-         switch  ( field . type )  { 
114-           case  FieldType . string :
115-             if  ( value . startsWith ( '@' ) )  { 
116-               // Detect ref using @ prefix, and adjust value to just the Ref 
117-               const  spaceIndex  =  value . indexOf ( ' ' ) ; 
118-               if  ( spaceIndex  >  - 1 )  { 
119-                 // 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  } ; 
126-               } 
127-             }  else  { 
128-               // Otherwise, just use the value directly 
129-               return  {  text : value ,  value : value  } ; 
130-             } 
131-           default :
132-             return  {  text : value ,  value : value  } ; 
133-         } 
113+       // Default to the selected column 
114+       let  displayColumn  =  column ; 
115+       if  ( variableQuery . displayColumn  !==  undefined  &&  variableQuery . displayColumn  !==  '' )  { 
116+         // If a column was input, match the column name 
117+         displayColumn  = 
118+           frame . fields . find ( ( field : Field )  =>  field . name  ===  variableQuery . displayColumn )  ??  displayColumn ; 
119+       } 
120+ 
121+       let  variableValues  =  column . values . map ( ( value ,  index )  =>  { 
122+         let  variableValue  =  variableValueFromCell ( value ,  column . type ) ; 
123+ 
124+         let  displayValue  =  displayColumn . values [ index ] ; 
125+         let  variableText  =  variableTextFromCell ( displayValue ,  displayColumn . type ) ; 
126+ 
127+         return  {  text : variableText ,  value : variableValue  } ; 
134128      } ) ; 
135-       return  acc . concat ( fieldVals ) ; 
129+ 
130+       return  acc . concat ( variableValues ) ; 
136131    } ,  [ ] ) ; 
137132  } 
138133
@@ -154,3 +149,24 @@ export class DataSource extends DataSourceWithBackend<HaystackQuery, HaystackDat
154149    } ; 
155150  } 
156151} 
152+ 
153+ function  variableValueFromCell ( value : string ,  columnType : FieldType ) : string  { 
154+   switch  ( columnType )  { 
155+     case  FieldType . string :
156+       if  ( isRef ( value ) )  { 
157+         return  parseRef ( value ) . id ; 
158+       } 
159+   } 
160+   return  value ; 
161+ } 
162+ 
163+ function  variableTextFromCell ( value : string ,  columnType : FieldType ) : string  { 
164+   switch  ( columnType )  { 
165+     case  FieldType . string :
166+       if  ( isRef ( value ) )  { 
167+         let  ref  =  parseRef ( value ) ; 
168+         return  ref . dis  ??  ref . id ; 
169+       } 
170+   } 
171+   return  value ; 
172+ } 
0 commit comments