@ -12,20 +12,19 @@ import {
VisualState ,
useRegisterActions ,
useKBar ,
ActionImpl ,
} from 'kbar' ;
import React , { useEffect , useRef } from 'react' ;
import React , { useEffect , useMemo , use Ref } from 'react' ;
import { GrafanaTheme2 } from '@grafana/data' ;
import { reportInteraction } from '@grafana/runtime' ;
import { useStyles2 } from '@grafana/ui' ;
import { t } from 'app/core/internationalization' ;
import { ResultItem } from './ResultItem' ;
import { useDashboardResults } from './actions/dashboardActions' ;
import useActions from './actions/useActions' ;
/ * *
* Wrap all the components from KBar here .
* @constructor
* /
import { CommandPaletteAction } from './types' ;
export const CommandPalette = ( ) = > {
const styles = useStyles2 ( getSearchStyles ) ;
@ -35,8 +34,9 @@ export const CommandPalette = () => {
searchQuery : state.searchQuery ,
} ) ) ;
const actions = useActions ( searchQuery , showing ) ;
const actions = useActions ( ) ;
useRegisterActions ( actions , [ actions ] ) ;
const dashboardResults = useDashboardResults ( searchQuery , showing ) ;
const ref = useRef < HTMLDivElement > ( null ) ;
const { overlayProps } = useOverlay (
@ -57,7 +57,7 @@ export const CommandPalette = () => {
< FocusScope contain autoFocus restoreFocus >
< div { ...overlayProps } { ...dialogProps } >
< KBarSearch className = { styles . search } / >
< RenderResults / >
< RenderResults dashboardResults = { dashboardResults } / >
< / div >
< / FocusScope >
< / KBarAnimator >
@ -66,14 +66,29 @@ export const CommandPalette = () => {
) : null ;
} ;
const RenderResults = ( ) = > {
interface RenderResultsProps {
dashboardResults : CommandPaletteAction [ ] ;
}
const RenderResults = ( { dashboardResults } : RenderResultsProps ) = > {
const { results , rootActionId } = useMatches ( ) ;
const styles = useStyles2 ( getSearchStyles ) ;
const dashboardsSectionTitle = t ( 'command-palette.section.dashboard-search-results' , 'Dashboards' ) ;
// because dashboard search results aren't registered as actions, we need to manually
// convert them to ActionImpls before passing them as items to KBarResults
const dashboardResultItems = useMemo (
( ) = > dashboardResults . map ( ( dashboard ) = > new ActionImpl ( dashboard , { store : { } } ) ) ,
[ dashboardResults ]
) ;
const items = useMemo (
( ) = > ( dashboardResultItems . length > 0 ? [ . . . results , dashboardsSectionTitle , . . . dashboardResultItems ] : results ) ,
[ results , dashboardsSectionTitle , dashboardResultItems ]
) ;
return (
< div className = { styles . resultsContainer } >
< KBarResults
items = { results }
items = { item s}
onRender = { ( { item , active } ) = >
typeof item === 'string' ? (
< div className = { styles . sectionHeader } > { item } < / div >