From ae8a8cf16e36a229fa09944a3a3320a401d5d57e Mon Sep 17 00:00:00 2001 From: Oscar Kilhed Date: Thu, 13 Nov 2025 16:16:21 +0100 Subject: [PATCH] Dynamic dashboards: Fix empty space under time controls when dashboard has many variables (#113765) * fix space under time controls by using floats instead of flex * remove commented out styles * adjust spacing: use marginBottom and reduce bottom padding * make Add variable button float inline with variables --- .../scene/DashboardControls.tsx | 26 ++++++++----------- .../scene/VariableControls.tsx | 26 ++++++++++++++++--- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/public/app/features/dashboard-scene/scene/DashboardControls.tsx b/public/app/features/dashboard-scene/scene/DashboardControls.tsx index 0e23d53e6fa..714c1a81bb3 100644 --- a/public/app/features/dashboard-scene/scene/DashboardControls.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardControls.tsx @@ -163,23 +163,20 @@ function DashboardControlsRenderer({ model }: SceneComponentProps - - {!hideVariableControls && ( - <> - - - - )} - - {!hideLinksControls && !editPanel && } - {editPanel && } - {!hideTimeControls && (
)} + {!hideVariableControls && ( + <> + + + + )} + {!hideLinksControls && !editPanel && } + {editPanel && } {!hideDashboardControls && model.hasDashboardControls() && ( @@ -208,11 +205,8 @@ function renderHiddenVariables(dashboard: DashboardScene) { function getStyles(theme: GrafanaTheme2) { return { controls: css({ - display: 'flex', - alignItems: 'flex-start', - flex: '100%', gap: theme.spacing(1), - padding: theme.spacing(2), + padding: theme.spacing(2, 2, 1, 2), flexDirection: 'row', flexWrap: 'nowrap', position: 'relative', @@ -240,6 +234,8 @@ function getStyles(theme: GrafanaTheme2) { display: 'flex', justifyContent: 'flex-end', gap: theme.spacing(1), + marginBottom: theme.spacing(1), + float: 'right', }), timeControlsWrap: css({ flexWrap: 'wrap', diff --git a/public/app/features/dashboard-scene/scene/VariableControls.tsx b/public/app/features/dashboard-scene/scene/VariableControls.tsx index eba51280522..3509848c442 100644 --- a/public/app/features/dashboard-scene/scene/VariableControls.tsx +++ b/public/app/features/dashboard-scene/scene/VariableControls.tsx @@ -19,6 +19,7 @@ import { AddVariableButton } from './VariableControlsAddButton'; export function VariableControls({ dashboard }: { dashboard: DashboardScene }) { const { variables } = sceneGraph.getVariables(dashboard)!.useState(); + const styles = useStyles2(getStyles); return ( <> @@ -27,7 +28,11 @@ export function VariableControls({ dashboard }: { dashboard: DashboardScene }) { .map((variable) => ( ))} - {config.featureToggles.dashboardNewLayouts ? : null} + {config.featureToggles.dashboardNewLayouts ? ( +
+ +
+ ) : null} ); } @@ -105,7 +110,7 @@ export function VariableValueSelectWrapper({ variable, inMenu }: VariableSelectP onPointerDown={onPointerDown} data-testid={selectors.pages.Dashboard.SubMenu.submenuItem} > - + ); @@ -145,12 +150,16 @@ function VariableLabel({ const getStyles = (theme: GrafanaTheme2) => ({ container: css({ - display: 'flex', + display: 'inline-flex', + alignItems: 'center', + verticalAlign: 'middle', // No border for second element (inputs) as label and input border is shared '> :nth-child(2)': css({ borderTopLeftRadius: 'unset', borderBottomLeftRadius: 'unset', }), + marginBottom: theme.spacing(1), + marginRight: theme.spacing(1), }), verticalContainer: css({ display: 'flex', @@ -176,4 +185,15 @@ const getStyles = (theme: GrafanaTheme2) => ({ labelSelectable: css({ cursor: 'pointer', }), + label: css({ + display: 'flex', + alignItems: 'center', + }), + addButton: css({ + display: 'inline-flex', + alignItems: 'center', + verticalAlign: 'middle', + marginBottom: theme.spacing(1), + marginRight: theme.spacing(1), + }), });