1
1
import React , { ChangeEvent } from 'react' ;
2
- import { Observable } from 'rxjs' ;
3
- import { map as map$ , switchMap as switchMap$ } from 'rxjs/operators' ;
2
+ import { lastValueFrom , Observable } from 'rxjs' ;
4
3
import { RedisDataSourceOptions } from 'types' ;
5
4
import { css , cx } from '@emotion/css' ;
6
- import { DataFrame , DataQueryRequest , DataQueryResponse , PanelProps } from '@grafana/data' ;
5
+ import {
6
+ DataQueryRequest ,
7
+ DataQueryResponse ,
8
+ DataQueryResponseData ,
9
+ DataSourceRef ,
10
+ Field ,
11
+ PanelProps ,
12
+ } from '@grafana/data' ;
7
13
import { getDataSourceSrv } from '@grafana/runtime' ;
8
14
import { Button , RadioButtonGroup , useTheme2 } from '@grafana/ui' ;
9
15
import { Help , ResponseMode , ResponseModeOptions } from '../../constants' ;
@@ -29,7 +35,7 @@ export const RedisCLIPanel: React.FC<PanelProps<PanelOptions>> = ({
29
35
* Get configured Data Source Id
30
36
*/
31
37
const targets = data . request ?. targets ;
32
- let datasource = '' ;
38
+ let datasource : string | DataSourceRef = '' ;
33
39
if ( targets && targets . length && targets [ 0 ] . datasource ) {
34
40
datasource = targets [ 0 ] . datasource ;
35
41
}
@@ -64,33 +70,39 @@ export const RedisCLIPanel: React.FC<PanelProps<PanelOptions>> = ({
64
70
const dsQuery = ds . query ( {
65
71
targets : [ { refId : 'A' , query : replaceVariables ( query ) , cli : ! options . raw } ] ,
66
72
} as DataQueryRequest < RedisQuery > ) as unknown ;
67
- const res = await ( dsQuery as Observable < DataQueryResponse > )
68
- . pipe (
69
- switchMap$ ( ( response ) => {
70
- /**
71
- * Check for error in response
72
- */
73
- if ( response . error && response . error . message ) {
74
- error = response . error . message ;
75
- }
76
-
77
- return response . data ;
78
- } ) ,
79
- switchMap$ ( ( data : DataFrame ) => data . fields ) ,
80
- map$ ( ( field ) =>
81
- field . values . toArray ( ) . map ( ( value ) => {
82
- return value ;
83
- } )
84
- )
85
- )
86
- . toPromise ( ) ;
73
+ const q = lastValueFrom ( dsQuery as Observable < DataQueryResponse > ) ;
87
74
88
75
/**
89
- * Result
76
+ * Get Results
77
+ */
78
+ const results : string [ ] = [ ] ;
79
+ await q
80
+ . then ( ( response : DataQueryResponse ) => {
81
+ /**
82
+ * Check for error in response
83
+ */
84
+ if ( response . error && response . error . message ) {
85
+ error = response . error . message ;
86
+ }
87
+
88
+ return response . data ;
89
+ } )
90
+ . then ( ( data : DataQueryResponseData [ ] ) =>
91
+ data . forEach ( ( item : DataQueryResponseData ) => {
92
+ item . fields . forEach ( ( field : Field ) => {
93
+ field . values . toArray ( ) . map ( ( value ) => {
94
+ results . push ( value ) ;
95
+ } ) ;
96
+ } ) ;
97
+ } )
98
+ ) ;
99
+
100
+ /**
101
+ * Show Output
90
102
*/
91
103
let result = `${ ds . name } > ${ query } \n` ;
92
- if ( res && res . length ) {
93
- result += res . join ( '\n' ) ;
104
+ if ( results . length ) {
105
+ result += results . join ( '\n' ) ;
94
106
} else if ( error ) {
95
107
result += `(error) ${ error } \n` ;
96
108
} else {
0 commit comments