mirror of
https://github.com/grafana/grafana.git
synced 2025-02-20 11:48:34 -06:00
* Initial commit * Progress * Update * Progress * updates * Minor fix * fixed ts issue * fixed e2e tests * More explorations * Making progress * Panel options and field options unified * With nested categories * Starting to find something * fix paddings * Progress * Breakthrough ux layout * Progress * Updates * New way of composing options with search * added regex search * Refactoring to react note tree * Show overrides * Adding overrides radio button support * Added popular view * Separate stat/gauge/bargauge options into value options and display options * Initial work on getting library panels into viz picker flow * Fixed issues switching to panel library panel * Move search input put of LibraryPanelsView * Changing design again to have content inside boxes * Style updates * Refactoring to fix scroll issue * Option category naming * Fixed FilterInput issue * Updated snapshots * Fix padding * Updated viz picker design * Unify library panel an viz picker card * Updated card with delete action * Major refactoring back to an object model instead of searching and filtering react node tree * More refactoring * Show option category in label when searching * Nice logic for categories rendering when searching or when only child * Make getSuggestions more lazy for DataLinksEditor * Add missing repeat options and handle conditional options * Prepping options category to be more flexibly and control state from outside * Added option count to search result * Minor style tweak * Added button to close viz picker * Rewrote overrides to enable searching overrides * New search engine and tests * Searching overrides works * Hide radio buttons while searching * Added angular options back * Added memoize for all options so they are not rebuilt for every search key stroke * Added back support for category counters * Started unit test work * Refactoring and base popular options list * Initial update to e2e test, more coming to add e2e test for search features * Minor fix * Review updates * Fixing category open states * Unit test progress * Do not show visualization list mode radio button if library panels is not enabled * Use boolean * More unit tests * Increase library panels per page count and give search focus when switching list mode * field config change test and search test * Feedback updates * Minor tweaks * Minor refactorings * More minimal override collapse state
67 lines
2.2 KiB
TypeScript
67 lines
2.2 KiB
TypeScript
import { Dispatch } from 'react';
|
|
import { AnyAction } from '@reduxjs/toolkit';
|
|
import { from, merge, of, Subscription, timer } from 'rxjs';
|
|
import { catchError, finalize, mapTo, mergeMap, share, takeUntil } from 'rxjs/operators';
|
|
|
|
import { deleteLibraryPanel as apiDeleteLibraryPanel, getLibraryPanels } from '../../state/api';
|
|
import { initialLibraryPanelsViewState, initSearch, searchCompleted } from './reducer';
|
|
|
|
type DispatchResult = (dispatch: Dispatch<AnyAction>) => void;
|
|
interface SearchArgs {
|
|
perPage: number;
|
|
page: number;
|
|
searchString: string;
|
|
currentPanelId?: string;
|
|
}
|
|
|
|
export function searchForLibraryPanels(args: SearchArgs): DispatchResult {
|
|
return function (dispatch) {
|
|
const subscription = new Subscription();
|
|
const dataObservable = from(
|
|
getLibraryPanels({
|
|
name: args.searchString,
|
|
perPage: args.perPage,
|
|
page: args.page,
|
|
excludeUid: args.currentPanelId,
|
|
})
|
|
).pipe(
|
|
mergeMap(({ perPage, libraryPanels, page, totalCount }) =>
|
|
of(searchCompleted({ libraryPanels, page, perPage, totalCount }))
|
|
),
|
|
catchError((err) => {
|
|
console.error(err);
|
|
return of(searchCompleted({ ...initialLibraryPanelsViewState, page: args.page, perPage: args.perPage }));
|
|
}),
|
|
finalize(() => subscription.unsubscribe()), // make sure we unsubscribe
|
|
share()
|
|
);
|
|
|
|
subscription.add(
|
|
// If 50ms without a response dispatch a loading state
|
|
// mapTo will translate the timer event into a loading state
|
|
// takeUntil will cancel the timer emit when first response is received on the dataObservable
|
|
merge(timer(50).pipe(mapTo(initSearch()), takeUntil(dataObservable)), dataObservable).subscribe(dispatch)
|
|
);
|
|
};
|
|
}
|
|
|
|
export function deleteLibraryPanel(uid: string, args: SearchArgs): DispatchResult {
|
|
return async function (dispatch) {
|
|
try {
|
|
await apiDeleteLibraryPanel(uid);
|
|
searchForLibraryPanels(args)(dispatch);
|
|
} catch (e) {
|
|
console.error(e);
|
|
}
|
|
};
|
|
}
|
|
|
|
export function asyncDispatcher(dispatch: Dispatch<AnyAction>) {
|
|
return function (action: any) {
|
|
if (action instanceof Function) {
|
|
return action(dispatch);
|
|
}
|
|
return dispatch(action);
|
|
};
|
|
}
|