Files
grafana/public/app/features/dashboard-scene/panel-edit/PanelOptions.tsx
Victor Marin f70fefc67c DashboardScene: Fix dependencies on field overrides (#94335)
fix deps on field overrides
2024-10-08 08:25:42 +03:00

120 lines
3.5 KiB
TypeScript

import { useMemo } from 'react';
import * as React from 'react';
import { PanelData } from '@grafana/data';
import { VizPanel } from '@grafana/scenes';
import { OptionFilter, renderSearchHits } from 'app/features/dashboard/components/PanelEditor/OptionsPaneOptions';
import { getFieldOverrideCategories } from 'app/features/dashboard/components/PanelEditor/getFieldOverrideElements';
import {
getLibraryVizPanelOptionsCategory,
getVisualizationOptions2,
} from 'app/features/dashboard/components/PanelEditor/getVisualizationOptions';
import { LibraryPanelBehavior } from '../scene/LibraryPanelBehavior';
import { getLibraryPanelBehavior, isLibraryPanel } from '../utils/utils';
import { getPanelFrameCategory2 } from './getPanelFrameOptions';
interface Props {
panel: VizPanel;
searchQuery: string;
listMode: OptionFilter;
data?: PanelData;
}
export const PanelOptions = React.memo<Props>(({ panel, searchQuery, listMode, data }) => {
const { options, fieldConfig, _pluginInstanceState } = panel.useState();
const layoutElement = panel.parent!;
const layoutElementState = layoutElement.useState();
const panelFrameOptions = useMemo(
() => getPanelFrameCategory2(panel, layoutElementState),
[panel, layoutElementState]
);
const visualizationOptions = useMemo(() => {
const plugin = panel.getPlugin();
if (!plugin) {
return undefined;
}
return getVisualizationOptions2({
panel,
data,
plugin: plugin,
eventBus: panel.getPanelContext().eventBus,
instanceState: _pluginInstanceState,
});
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [data, panel, options, fieldConfig, _pluginInstanceState]);
const libraryPanelOptions = useMemo(() => {
if (panel instanceof VizPanel && isLibraryPanel(panel)) {
const behavior = getLibraryPanelBehavior(panel);
if (!(behavior instanceof LibraryPanelBehavior)) {
return;
}
return getLibraryVizPanelOptionsCategory(behavior);
}
return;
}, [panel]);
const justOverrides = useMemo(
() =>
getFieldOverrideCategories(
fieldConfig,
panel.getPlugin()?.fieldConfigRegistry!,
data?.series ?? [],
searchQuery,
(newConfig) => {
panel.onFieldConfigChange(newConfig, true);
}
),
// eslint-disable-next-line react-hooks/exhaustive-deps
[data, searchQuery, panel, fieldConfig]
);
const isSearching = searchQuery.length > 0;
const mainBoxElements: React.ReactNode[] = [];
if (isSearching) {
mainBoxElements.push(
renderSearchHits(
[panelFrameOptions, ...(libraryPanelOptions ? [libraryPanelOptions] : []), ...(visualizationOptions ?? [])],
justOverrides,
searchQuery
)
);
} else {
switch (listMode) {
case OptionFilter.All:
if (libraryPanelOptions) {
// Library Panel options first
mainBoxElements.push(libraryPanelOptions.render());
}
mainBoxElements.push(panelFrameOptions.render());
for (const item of visualizationOptions ?? []) {
mainBoxElements.push(item.render());
}
for (const item of justOverrides) {
mainBoxElements.push(item.render());
}
break;
case OptionFilter.Overrides:
for (const item of justOverrides) {
mainBoxElements.push(item.render());
}
default:
break;
}
}
return mainBoxElements;
});
PanelOptions.displayName = 'PanelOptions';