mirror of
https://github.com/grafana/grafana.git
synced 2025-02-13 00:55:47 -06:00
* add SQL migrations * dashboard previews from sql: poc * added todos * refactor: use the same enums where possible * use useEffect, always return json * added todo * refactor + delete files after use * refactor + fix manual thumbnail upload * refactor: move all interactions with sqlStore to thumbnail repo * refactor: remove file operations in thumb crawler/service * refactor: fix dashboard_thumbs sql store * refactor: extracted thumbnail fetching/updating to a hook * refactor: store thumbnails in redux store * refactor: store thumbnails in redux store * refactor: private'd repo methods * removed redux storage, saving images as blobs * allow for configurable rendering timeouts * added 1) query for dashboards with stale thumbnails, 2) command for marking thumbnails as stale * use sql-based queue in crawler * ui for marking thumbnails as stale * replaced `stale` boolean prop with `state` enum * introduce rendering session * compilation errors * fix crawler stop button * rename thumbnail state frozen to locked * #44449: fix merge conflicts * #44449: remove thumb methods from `Store` interface * #44449: clean filepath, defer file closing * #44449: fix rendering.Theme cyclic import * #44449: linting * #44449: linting * #44449: mutex'd crawlerStatus access * #44449: added integration tests for `sqlstore.dashboard_thumbs` * #44449: added comments to explain the `ThumbnailState` enum * #44449: use os.ReadFile rather then os.Open * #44449: always enable dashboardPreviews feature during integration tests * #44449: add /previews/system-requirements API * #44449: remove sleep time, adjust number of threads * #44449: review fix: add `orgId` to `DashboardThumbnailMeta` * #44449: review fix: automatic parsing of thumbnailState * #44449: update returned json * #44449: UI changes - dashboard previews sytem req check * #44449: lint fixes * #44449: fix tests * #44449: typo * #44449: fix getSystemRequirements API: return 200 even if we plugin version is invalid * #44449: fix getSystemRequirements API: don't return SemverConstraint on error * #44449: fix getSystemRequirements API * #44449: fix previews sytem requirements text * #44449: add `doThumbnailsExist` to repo * #44449: remove redux api * #44449: add missing model * #44449: implement frontedsettings-driven capability check * #44449: simplify * #44449: revert test changes * #44449: add dummy setup settings * #44449: implicit typing over `FC<Props>` * #44449: refactor conditionals * #44449: replace `getText` with a react component * #44449: fix component interface * #44449: add onRemove to `PreviewsSystemRequirements` alert * #44449: add bottom/top margin to previewSystemRequirements modal * #44449: merge conflict fix * #44449: remove console.log Co-authored-by: Ryan McKinley <ryantxu@gmail.com> Co-authored-by: Alexander Emelin <frvzmb@gmail.com>
78 lines
2.5 KiB
TypeScript
78 lines
2.5 KiB
TypeScript
import { KeyboardEvent, useReducer } from 'react';
|
|
import { locationService } from '@grafana/runtime';
|
|
import { DashboardQuery, DashboardSearchItemType, DashboardSection } from '../types';
|
|
import { MOVE_SELECTION_DOWN, MOVE_SELECTION_UP } from '../reducers/actionTypes';
|
|
import { dashboardsSearchState, DashboardsSearchState, searchReducer } from '../reducers/dashboardSearch';
|
|
import { findSelected } from '../utils';
|
|
import { useSearch } from './useSearch';
|
|
import { locationUtil } from '@grafana/data';
|
|
import { useShowDashboardPreviews } from './useShowDashboardPreviews';
|
|
import { reportDashboardListViewed } from './useManageDashboards';
|
|
import { useDebounce } from 'react-use';
|
|
|
|
export const useDashboardSearch = (query: DashboardQuery, onCloseSearch: () => void) => {
|
|
const reducer = useReducer(searchReducer, dashboardsSearchState);
|
|
const { showPreviews, setShowPreviews, previewFeatureEnabled } = useShowDashboardPreviews();
|
|
const {
|
|
state: { results, loading },
|
|
onToggleSection,
|
|
dispatch,
|
|
} = useSearch<DashboardsSearchState>(query, reducer, { queryParsing: true });
|
|
|
|
useDebounce(
|
|
() => {
|
|
reportDashboardListViewed('dashboard_search', showPreviews, previewFeatureEnabled, {
|
|
layout: query.layout,
|
|
starred: query.starred,
|
|
sortValue: query.sort?.value,
|
|
query: query.query,
|
|
tagCount: query.tag?.length,
|
|
});
|
|
},
|
|
1000,
|
|
[
|
|
showPreviews,
|
|
previewFeatureEnabled,
|
|
query.layout,
|
|
query.starred,
|
|
query.sort?.value,
|
|
query.query?.length,
|
|
query.tag?.length,
|
|
]
|
|
);
|
|
|
|
const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {
|
|
switch (event.key) {
|
|
case 'Escape':
|
|
onCloseSearch();
|
|
break;
|
|
case 'ArrowUp':
|
|
dispatch({ type: MOVE_SELECTION_UP });
|
|
break;
|
|
case 'ArrowDown':
|
|
dispatch({ type: MOVE_SELECTION_DOWN });
|
|
break;
|
|
case 'Enter':
|
|
const selectedItem = findSelected(results);
|
|
if (selectedItem) {
|
|
if (selectedItem.type === DashboardSearchItemType.DashFolder) {
|
|
onToggleSection(selectedItem as DashboardSection);
|
|
} else {
|
|
locationService.push(locationUtil.stripBaseFromUrl(selectedItem.url));
|
|
// Delay closing to prevent current page flicker
|
|
setTimeout(onCloseSearch, 0);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
return {
|
|
results,
|
|
loading,
|
|
onToggleSection,
|
|
onKeyDown,
|
|
showPreviews,
|
|
setShowPreviews,
|
|
};
|
|
};
|