1- import React , { useEffect , useState , useCallback , useMemo } from "react" ;
2- import { LogRowModel , } from '@grafana/data' ;
1+ import React , { useEffect , useState , useCallback , useMemo , createContext } from "react" ;
2+ import { Field , LogRowModel , } from '@grafana/data' ;
33import { ElasticsearchQuery as DataQuery } from '../../types' ;
44import { LogContextQueryEditor } from "./LogContextQueryEditor" ;
55
66import { css } from "@emotion/css" ;
77import { Button } from "@grafana/ui" ;
88import { useQueryBuilder , QueryBuilderContext } from 'LogContext/QueryBuilder' ;
99import { LogContextQueryBuilderSidebar } from "./LogContextQueryBuilderSidebar" ;
10+ import { DatasourceContext } from "components/QueryEditor/ElasticsearchQueryContext" ;
11+ import { QuickwitDataSource } from "datasource" ;
12+ import { getHook } from "utils/context" ;
1013
1114const logContextUiStyle = css `
1215 display : flex;
@@ -15,20 +18,39 @@ const logContextUiStyle = css`
1518 height : 200px ;
1619`
1720
21+
1822export interface LogContextProps {
1923 row : LogRowModel ,
2024 runContextQuery ?: ( ( ) => void )
2125 origQuery ?: DataQuery
2226}
2327export interface LogContextUIProps extends LogContextProps {
28+ datasource : QuickwitDataSource ,
2429 updateQuery : ( query : string ) => void
2530}
31+ const SearchableFieldsContext = createContext < Field [ ] | undefined > ( undefined )
32+ export const useSearchableFields = getHook ( SearchableFieldsContext )
2633
2734export function LogContextUI ( props : LogContextUIProps ) {
2835 const builder = useQueryBuilder ( ) ;
2936 const { query, parsedQuery, setQuery, setParsedQuery} = builder ;
3037 const [ canRunQuery , setCanRunQuery ] = useState < boolean > ( false ) ;
3138 const { origQuery, updateQuery, runContextQuery } = props ;
39+ const datasource = props . datasource ;
40+ const [ fields , setFields ] = useState < typeof props . row . dataFrame . fields > ( [ ] ) ;
41+
42+ useEffect ( ( ) => {
43+ const dfFields = props . row . dataFrame . fields
44+ // Get datasource fields definitions
45+ datasource . getTagKeys ( { searchable :true } ) . then ( ( dsFields ) => {
46+ const dsFieldsNames = dsFields . map ( f => f . text )
47+ setFields ( dfFields . filter ( f => dsFieldsNames . includes ( f . name ) ) )
48+
49+ } ) ;
50+
51+
52+
53+ } , [ props . row , datasource , setFields ] )
3254
3355 useEffect ( ( ) => {
3456 setQuery ( origQuery ?. query || '' )
@@ -55,13 +77,17 @@ export function LogContextUI(props: LogContextUIProps ){
5577
5678 return (
5779 < div className = { logContextUiStyle } >
58- < QueryBuilderContext . Provider value = { builder } >
59- < LogContextQueryBuilderSidebar { ...props } updateQuery = { setParsedQuery } />
60- < div className = { css `width : 100% ; display : flex; flex-direction : column; gap : 0.5rem ; min-width : 0 ;` } >
61- { ActionBar }
62- < LogContextQueryEditor />
63- </ div >
64- </ QueryBuilderContext . Provider >
80+ < DatasourceContext . Provider value = { props . datasource } >
81+ < QueryBuilderContext . Provider value = { builder } >
82+ < SearchableFieldsContext . Provider value = { fields } >
83+ < LogContextQueryBuilderSidebar { ...props } updateQuery = { setParsedQuery } />
84+ < div className = { css `width : 100% ; display : flex; flex-direction : column; gap : 0.5rem ; min-width : 0 ;` } >
85+ { ActionBar }
86+ < LogContextQueryEditor />
87+ </ div >
88+ </ SearchableFieldsContext . Provider >
89+ </ QueryBuilderContext . Provider >
90+ </ DatasourceContext . Provider >
6591 </ div >
6692 ) ;
6793}
0 commit comments