From fcffedbbf9e6f5035fe19879ed13f0da39ae0212 Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Wed, 1 Mar 2023 11:13:09 -0800 Subject: [PATCH] Search: Include panel_type in query (#63229) --- .betterer.results | 4 +-- pkg/services/searchV2/bluge.go | 2 +- .../search/page/components/ActionRow.tsx | 15 ++++++--- .../search/page/components/SearchView.tsx | 16 ++-------- .../search/page/components/columns.tsx | 5 ++- .../search/state/SearchStateManager.ts | 31 +++++++++++++++++-- public/app/features/search/types.ts | 1 + 7 files changed, 48 insertions(+), 26 deletions(-) diff --git a/.betterer.results b/.betterer.results index b57002431f4..97cd79a978d 100644 --- a/.betterer.results +++ b/.betterer.results @@ -4090,9 +4090,7 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/features/search/state/SearchStateManager.ts:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"], - [0, 0, 0, "Do not use any type assertions.", "2"] + [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/features/search/types.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] diff --git a/pkg/services/searchV2/bluge.go b/pkg/services/searchV2/bluge.go index 223e46ec966..58389651867 100644 --- a/pkg/services/searchV2/bluge.go +++ b/pkg/services/searchV2/bluge.go @@ -207,7 +207,7 @@ func getDashboardPanelDocs(dash dashboard, location string) []*bluge.Document { AddField(bluge.NewKeywordField(documentFieldLocation, location).Aggregatable().StoreValue()). AddField(bluge.NewKeywordField(documentFieldKind, string(entityKindPanel)).Aggregatable().StoreValue()) // likely want independent index for this - for _, ref := range dash.summary.References { + for _, ref := range panel.References { switch ref.Family { case entity.StandardKindDashboard: if ref.Type != "" { diff --git a/public/app/features/search/page/components/ActionRow.tsx b/public/app/features/search/page/components/ActionRow.tsx index d42d1a01e4c..74400e7847c 100644 --- a/public/app/features/search/page/components/ActionRow.tsx +++ b/public/app/features/search/page/components/ActionRow.tsx @@ -1,5 +1,5 @@ import { css } from '@emotion/css'; -import React, { FC, FormEvent } from 'react'; +import React, { FormEvent } from 'react'; import { GrafanaTheme2, SelectableValue } from '@grafana/data'; import { config } from '@grafana/runtime'; @@ -36,6 +36,7 @@ interface Props { getSortOptions: () => Promise; sortPlaceholder?: string; onDatasourceChange: (ds?: string) => void; + onPanelTypeChange: (pt?: string) => void; includePanels: boolean; onSetIncludePanels: (v: boolean) => void; state: SearchState; @@ -59,7 +60,7 @@ export function getValidQueryLayout(q: SearchState): SearchLayout { return layout; } -export const ActionRow: FC = ({ +export const ActionRow = ({ onLayoutChange, onSortChange, onStarredFilterChange = () => {}, @@ -68,16 +69,17 @@ export const ActionRow: FC = ({ getSortOptions, sortPlaceholder, onDatasourceChange, + onPanelTypeChange, onSetIncludePanels, state, showStarredFilter, hideLayout, -}) => { +}: Props) => { const styles = useStyles2(getStyles); const layout = getValidQueryLayout(state); // Disabled folder layout option when query is present - const disabledOptions = state.query ? [SearchLayout.Folders] : []; + const disabledOptions = state.query || state.datasource || state.panel_type ? [SearchLayout.Folders] : []; return (
@@ -109,6 +111,11 @@ export const ActionRow: FC = ({ )} + {state.panel_type && ( + + )}
diff --git a/public/app/features/search/page/components/SearchView.tsx b/public/app/features/search/page/components/SearchView.tsx index dbde3e3ad22..5e84e778812 100644 --- a/public/app/features/search/page/components/SearchView.tsx +++ b/public/app/features/search/page/components/SearchView.tsx @@ -78,20 +78,7 @@ export const SearchView = ({ showManage, folderDTO, hidePseudoFolders, keyboardE
No results found for your query.

-
@@ -189,6 +176,7 @@ export const SearchView = ({ showManage, folderDTO, hidePseudoFolders, keyboardE getSortOptions={getGrafanaSearcher().getSortOptions} sortPlaceholder={getGrafanaSearcher().sortPlaceholder} onDatasourceChange={stateManager.onDatasourceChange} + onPanelTypeChange={stateManager.onPanelTypeChange} state={state} includePanels={state.includePanels!} onSetIncludePanels={stateManager.onSetIncludePanels} diff --git a/public/app/features/search/page/components/columns.tsx b/public/app/features/search/page/components/columns.tsx index 18eaacd3039..aa195a129a4 100644 --- a/public/app/features/search/page/components/columns.tsx +++ b/public/app/features/search/page/components/columns.tsx @@ -170,7 +170,10 @@ export const generateColumns = ( return (
{parts.map((p) => { - const info = meta.locationInfo[p]; + let info = meta.locationInfo[p]; + if (!info && p === 'general') { + info = { kind: 'folder', url: '/dashboards', name: 'General' }; + } return info ? ( {info.name} diff --git a/public/app/features/search/state/SearchStateManager.ts b/public/app/features/search/state/SearchStateManager.ts index 9a7fa919417..f4c77b248d3 100644 --- a/public/app/features/search/state/SearchStateManager.ts +++ b/public/app/features/search/state/SearchStateManager.ts @@ -43,6 +43,11 @@ export class SearchStateManager extends StateManagerBase { initStateFromUrl(folderUid?: string) { const stateFromUrl = parseRouteParams(locationService.getSearchObject()); + // Force list view when conditions are specified from the URL + if (stateFromUrl.query || stateFromUrl.datasource || stateFromUrl.panel_type) { + stateFromUrl.layout = SearchLayout.List; + } + stateManager.setState({ ...stateFromUrl, folderUid: folderUid, @@ -63,6 +68,7 @@ export class SearchStateManager extends StateManagerBase { query: this.state.query.length === 0 ? null : this.state.query, tag: this.state.tag, datasource: this.state.datasource, + panel_type: this.state.panel_type, starred: this.state.starred ? this.state.starred : null, sort: this.state.sort, }); @@ -79,6 +85,16 @@ export class SearchStateManager extends StateManagerBase { }); }; + onClearSearchAndFilters = () => { + this.setStateAndDoSearch({ + query: '', + datasource: undefined, + tag: [], + panel_type: undefined, + starred: undefined, + }); + }; + onQueryChange = (query: string) => { this.setStateAndDoSearch({ query }); }; @@ -103,6 +119,10 @@ export class SearchStateManager extends StateManagerBase { this.setStateAndDoSearch({ datasource }); }; + onPanelTypeChange = (panel_type?: string) => { + this.setStateAndDoSearch({ panel_type }); + }; + onStarredFilterChange = (e: FormEvent) => { const starred = e.currentTarget.checked; this.setStateAndDoSearch({ starred }); @@ -142,14 +162,15 @@ export class SearchStateManager extends StateManagerBase { }; hasSearchFilters() { - return this.state.query || this.state.tag.length || this.state.starred; + return this.state.query || this.state.tag.length || this.state.starred || this.state.panel_type; } getSearchQuery() { const q: SearchQuery = { query: this.state.query, - tags: this.state.tag as string[], - ds_uid: this.state.datasource as string, + tags: this.state.tag, + ds_uid: this.state.datasource, + panel_type: this.state.panel_type, location: this.state.folderUid, // This will scope all results to the prefix sort: this.state.sort, explain: this.state.explain, @@ -173,6 +194,10 @@ export class SearchStateManager extends StateManagerBase { q.kind = ['dashboard', 'folder']; // skip panels } + if (q.panel_type?.length) { + q.kind = ['panel']; + } + return q; } diff --git a/public/app/features/search/types.ts b/public/app/features/search/types.ts index e2d8e209977..269727fa88f 100644 --- a/public/app/features/search/types.ts +++ b/public/app/features/search/types.ts @@ -86,6 +86,7 @@ export interface SearchState { starred: boolean; explain?: boolean; // adds debug info datasource?: string; + panel_type?: string; sort?: string; prevSort?: string; // Save sorting data between layouts layout: SearchLayout;