From 1d7595374a6c6c341b7ec4f51387dc16fbb5cc98 Mon Sep 17 00:00:00 2001 From: Sarah Zinger Date: Thu, 20 May 2021 04:20:01 -0400 Subject: [PATCH] Azure Monitor: Fix Resource Picker UI overflow (#34442) * Truncate text * Replace HorizontalGroup. * Add loading spinner * increase modal width Co-authored-by: joshhunt --- .../LogsQueryEditor/ResourceField.tsx | 13 +++++++++-- .../components/ResourcePicker/NestedRows.tsx | 20 ++++++++-------- .../components/ResourcePicker/styles.ts | 23 ++++++++++++++++++- 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/LogsQueryEditor/ResourceField.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/LogsQueryEditor/ResourceField.tsx index 9c2810717cd..ec2b5505c74 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/LogsQueryEditor/ResourceField.tsx +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/LogsQueryEditor/ResourceField.tsx @@ -1,4 +1,6 @@ -import { Button, Icon, Modal } from '@grafana/ui'; +import { css } from '@emotion/css'; +import { GrafanaTheme2 } from '@grafana/data'; +import { Button, Icon, Modal, useStyles2 } from '@grafana/ui'; import React, { useCallback, useEffect, useState } from 'react'; import { AzureQueryEditorFieldProps, AzureResourceSummaryItem } from '../../types'; import { Field } from '../Field'; @@ -22,6 +24,7 @@ function parseResourceDetails(resourceURI: string) { } const ResourceField: React.FC = ({ query, datasource, onQueryChange }) => { + const styles = useStyles2(getStyles); const { resource } = query.azureLogAnalytics; const [resourceComponents, setResourceComponents] = useState(parseResourceDetails(resource ?? '')); @@ -59,7 +62,7 @@ const ResourceField: React.FC = ({ query, datasource return ( <> - + ( ); export default ResourceField; + +const getStyles = (theme: GrafanaTheme2) => ({ + modal: css({ + width: theme.breakpoints.values.lg, + }), +}); diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ResourcePicker/NestedRows.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ResourcePicker/NestedRows.tsx index 08ff9b80c3e..7d8fe4a7f2c 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ResourcePicker/NestedRows.tsx +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ResourcePicker/NestedRows.tsx @@ -1,5 +1,5 @@ import { cx } from '@emotion/css'; -import { Checkbox, HorizontalGroup, Icon, IconButton, useStyles2, useTheme2 } from '@grafana/ui'; +import { Checkbox, Icon, IconButton, LoadingPlaceholder, useStyles2, useTheme2, FadeTransition } from '@grafana/ui'; import React, { useCallback, useEffect, useState } from 'react'; import getStyles from './styles'; import { EntryType, Row, RowGroup } from './types'; @@ -100,13 +100,13 @@ const NestedRow: React.FC = ({ row, selectedRows, level, request /> )} - {openStatus === 'loading' && ( + - Loading... + - )} + ); }; @@ -169,10 +169,10 @@ const NestedEntry: React.FC = ({ ); return ( -
- - {/* When groups are selectable, I *think* we will want to show a 2-wide space instead +
+ {/* When groups are selectable, I *think* we will want to show a 2-wide space instead of the collapse button for leaf rows that have no children to get them to align */} + {hasChildren && ( = ({ )} {isSelectable && } + + + - {entry.name} - + {entry.name}
); }; diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ResourcePicker/styles.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ResourcePicker/styles.ts index 0fa539b2b50..95f95ee7025 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ResourcePicker/styles.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ResourcePicker/styles.ts @@ -4,6 +4,7 @@ import { GrafanaTheme2 } from '@grafana/data'; const getStyles = (theme: GrafanaTheme2) => ({ table: css({ width: '100%', + tableLayout: 'fixed', }), tableScroller: css({ @@ -30,7 +31,8 @@ const getStyles = (theme: GrafanaTheme2) => ({ cell: css({ padding: theme.spacing(1, 0), width: '25%', - + overflow: 'hidden', + textOverflow: 'ellipsis', '&:first-of-type': { width: '50%', padding: theme.spacing(1, 0, 1, 2), @@ -42,6 +44,25 @@ const getStyles = (theme: GrafanaTheme2) => ({ loadingCell: css({ textAlign: 'center', }), + + spinner: css({ + marginBottom: 0, + }), + + nestedEntry: css({ + display: 'flex', + }), + + entryContentItem: css({ + margin: theme.spacing(0, 1, 0, 0), + }), + + truncated: css({ + minWidth: 0, + overflow: 'hidden', + textOverflow: 'ellipsis', + whiteSpace: 'nowrap', + }), }); export default getStyles;