[release-12.2.1] Actions: Add permission check to missing panels (#111103)

This commit is contained in:
Adela Almasan
2025-09-15 09:54:27 -05:00
committed by GitHub
parent 06bf567e1c
commit 9738c198b9
6 changed files with 25 additions and 5 deletions
@@ -31,7 +31,9 @@ export const BarChartPanel = (props: PanelProps<Options>) => {
// const { dataLinkPostProcessor } = usePanelContext();
const theme = useTheme2();
const { onAddAdHocFilter } = usePanelContext();
const { onAddAdHocFilter, canExecuteActions } = usePanelContext();
const userCanExecuteActions = useMemo(() => canExecuteActions?.() ?? false, [canExecuteActions]);
const {
barWidth,
@@ -210,6 +212,7 @@ export const BarChartPanel = (props: PanelProps<Options>) => {
dataLinks={dataLinks}
adHocFilters={adHocFilters}
hideZeros={options.tooltip.hideZeros}
canExecuteActions={userCanExecuteActions}
/>
);
}}
@@ -45,9 +45,11 @@ export const HeatmapPanel = ({
}: HeatmapPanelProps) => {
const theme = useTheme2();
const styles = useStyles2(getStyles);
const { sync, eventsScope, canAddAnnotations, onSelectRange } = usePanelContext();
const { sync, eventsScope, canAddAnnotations, onSelectRange, canExecuteActions } = usePanelContext();
const cursorSync = sync?.() ?? DashboardCursorSync.Off;
const userCanExecuteActions = useMemo(() => canExecuteActions?.() ?? false, [canExecuteActions]);
// temp range set for adding new annotation set by TooltipPlugin2, consumed by AnnotationPlugin2
const [newAnnotationRange, setNewAnnotationRange] = useState<TimeRange2 | null>(null);
@@ -220,6 +222,7 @@ export const HeatmapPanel = ({
maxHeight={options.tooltip.maxHeight}
maxWidth={options.tooltip.maxWidth}
replaceVariables={replaceVariables}
canExecuteActions={userCanExecuteActions}
/>
);
}}
@@ -48,10 +48,12 @@ export const StatusHistoryPanel = ({
// temp range set for adding new annotation set by TooltipPlugin2, consumed by AnnotationPlugin2
const [newAnnotationRange, setNewAnnotationRange] = useState<TimeRange2 | null>(null);
const { sync, eventsScope, canAddAnnotations, dataLinkPostProcessor, eventBus } = usePanelContext();
const { sync, eventsScope, canAddAnnotations, dataLinkPostProcessor, eventBus, canExecuteActions } =
usePanelContext();
const cursorSync = sync?.() ?? DashboardCursorSync.Off;
const enableAnnotationCreation = Boolean(canAddAnnotations && canAddAnnotations());
const userCanExecuteActions = useMemo(() => canExecuteActions?.() ?? false, [canExecuteActions]);
const { frames, warn } = useMemo(
() => prepareTimelineFields(data.series, false, timeRange, theme),
@@ -152,6 +154,7 @@ export const StatusHistoryPanel = ({
maxHeight={options.tooltip.maxHeight}
replaceVariables={replaceVariables}
dataLinks={dataLinks}
canExecuteActions={userCanExecuteActions}
/>
);
}}
@@ -33,7 +33,10 @@ export const TrendPanel = ({
replaceVariables,
id,
}: PanelProps<Options>) => {
const { dataLinkPostProcessor } = usePanelContext();
const { dataLinkPostProcessor, canExecuteActions } = usePanelContext();
const userCanExecuteActions = useMemo(() => canExecuteActions?.() ?? false, [canExecuteActions]);
// Need to fallback to first number field if no xField is set in options otherwise panel crashes 😬
const trendXFieldName =
options.xField ?? data.series[0]?.fields.find((field) => field.type === FieldType.number)?.name;
@@ -142,6 +145,7 @@ export const TrendPanel = ({
replaceVariables={replaceVariables}
dataLinks={dataLinks}
hideZeros={options.tooltip.hideZeros}
canExecuteActions={userCanExecuteActions}
/>
);
}}
@@ -12,6 +12,7 @@ import {
VizLegendItem,
useStyles2,
useTheme2,
usePanelContext,
} from '@grafana/ui';
import { getDisplayValuesForCalcs, TooltipHoverMode } from '@grafana/ui/internal';
@@ -28,6 +29,9 @@ export const XYChartPanel2 = (props: Props2) => {
const styles = useStyles2(getStyles);
const theme = useTheme2();
const { canExecuteActions } = usePanelContext();
const userCanExecuteActions = useMemo(() => canExecuteActions?.() ?? false, [canExecuteActions]);
let { mapping, series: mappedSeries } = props.options;
// regenerate series schema when mappings or data changes
@@ -128,6 +132,7 @@ export const XYChartPanel2 = (props: Props2) => {
seriesIdx={seriesIdx!}
replaceVariables={props.replaceVariables}
dataLinks={dataLinks}
canExecuteActions={userCanExecuteActions}
/>
);
}}
@@ -24,6 +24,7 @@ export interface Props {
xySeries: XYSeries[];
replaceVariables: InterpolateFunction;
dataLinks: LinkModel[];
canExecuteActions?: boolean;
}
function stripSeriesName(fieldName: string, seriesName: string) {
@@ -51,6 +52,7 @@ export const XYChartTooltip = ({
isPinned,
replaceVariables,
dataLinks,
canExecuteActions,
}: Props) => {
const rowIndex = dataIdxs.find((idx) => idx !== null)!;
@@ -130,7 +132,7 @@ export const XYChartTooltip = ({
if (isPinned || hasOneClickLink) {
const yFieldFrame = data.find((frame) => frame.fields.includes(yField))!;
const actions = getFieldActions(yFieldFrame, yField, replaceVariables, rowIndex);
const actions = canExecuteActions ? getFieldActions(yFieldFrame, yField, replaceVariables, rowIndex) : [];
footer = <VizTooltipFooter dataLinks={dataLinks} actions={actions} />;
}