chore: Deprecate Layout components - Replace Horizontal/VerticalGroup with Stack (#86874) (#104227)

* chore: Deprecate Layout components - Replace Horizontal/VerticalGroup with Stack (#86874)

* chore: Deprecate Layout components - Replace Horizontal/VerticalGroup with Stack (#86874)

* Update public/app/features/explore/TraceView/components/TracePageHeader/SpanFilters/SpanFilters.tsx

Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com>

* Update public/app/features/explore/TraceView/components/TracePageHeader/SpanFilters/SpanFilters.tsx

Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com>

* Update public/app/plugins/datasource/jaeger/components/QueryEditor.tsx

Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com>

* Update public/app/features/explore/TraceView/components/TracePageHeader/SpanFilters/SpanFilters.tsx

Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com>

* Update public/app/plugins/datasource/tempo/QueryField.tsx

Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com>

* Update public/app/plugins/datasource/tempo/SearchTraceQLEditor/DurationInput.tsx

Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com>

* Update public/app/plugins/panel/nodeGraph/ViewControls.tsx

Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com>

* Update public/app/plugins/datasource/tempo/SearchTraceQLEditor/SearchField.tsx

Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com>

* Update public/app/plugins/datasource/tempo/SearchTraceQLEditor/TraceQLSearch.tsx

Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com>

* Update public/app/plugins/panel/nodeGraph/ViewControls.tsx

Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com>

* Update public/app/plugins/datasource/zipkin/QueryField.tsx

Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com>

* Fixed linting issue - spacing problem in different import groups.

* Updated betterer results with improved 1 test.

---------

Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com>
pull/104637/head^2
Fahad Siddiqui 2 months ago committed by GitHub
parent d05b2862b6
commit 750b90e756
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 27
      .betterer.results
  2. 14
      public/app/features/explore/TraceView/components/TracePageHeader/SpanFilters/SpanFilters.tsx
  3. 6
      public/app/plugins/datasource/jaeger/components/QueryEditor.tsx
  4. 6
      public/app/plugins/datasource/tempo/QueryField.tsx
  5. 6
      public/app/plugins/datasource/tempo/SearchTraceQLEditor/DurationInput.tsx
  6. 6
      public/app/plugins/datasource/tempo/SearchTraceQLEditor/SearchField.tsx
  7. 6
      public/app/plugins/datasource/tempo/SearchTraceQLEditor/TraceQLSearch.tsx
  8. 6
      public/app/plugins/datasource/zipkin/QueryField.tsx
  9. 10
      public/app/plugins/panel/nodeGraph/ViewControls.tsx

@ -1718,9 +1718,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"] [0, 0, 0, "Do not use any type assertions.", "1"]
], ],
"public/app/features/explore/TraceView/components/TracePageHeader/SpanFilters/SpanFilters.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
],
"public/app/features/explore/TraceView/components/TracePageHeader/index.tsx:5381": [ "public/app/features/explore/TraceView/components/TracePageHeader/index.tsx:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./TracePageHeader\`)", "0"] [0, 0, 0, "Do not re-export imported variable (\`./TracePageHeader\`)", "0"]
], ],
@ -2835,9 +2832,6 @@ exports[`better eslint`] = {
"public/app/plugins/datasource/jaeger/_importedDependencies/types/index.tsx:5381": [ "public/app/plugins/datasource/jaeger/_importedDependencies/types/index.tsx:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./trace\`)", "0"] [0, 0, 0, "Do not re-export imported variable (\`./trace\`)", "0"]
], ],
"public/app/plugins/datasource/jaeger/components/QueryEditor.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
],
"public/app/plugins/datasource/jaeger/datasource.ts:5381": [ "public/app/plugins/datasource/jaeger/datasource.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"] [0, 0, 0, "Unexpected any. Specify a different type.", "1"]
@ -2915,18 +2909,6 @@ exports[`better eslint`] = {
"public/app/plugins/datasource/parca/webpack.config.ts:5381": [ "public/app/plugins/datasource/parca/webpack.config.ts:5381": [
[0, 0, 0, "Do not re-export imported variable (\`config\`)", "0"] [0, 0, 0, "Do not re-export imported variable (\`config\`)", "0"]
], ],
"public/app/plugins/datasource/tempo/QueryField.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
],
"public/app/plugins/datasource/tempo/SearchTraceQLEditor/DurationInput.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
],
"public/app/plugins/datasource/tempo/SearchTraceQLEditor/SearchField.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
],
"public/app/plugins/datasource/tempo/SearchTraceQLEditor/TraceQLSearch.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
],
"public/app/plugins/datasource/tempo/ServiceGraphSection.tsx:5381": [ "public/app/plugins/datasource/tempo/ServiceGraphSection.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"] [0, 0, 0, "Do not use any type assertions.", "0"]
], ],
@ -2962,9 +2944,8 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not re-export imported variable (\`config\`)", "0"] [0, 0, 0, "Do not re-export imported variable (\`config\`)", "0"]
], ],
"public/app/plugins/datasource/zipkin/QueryField.tsx:5381": [ "public/app/plugins/datasource/zipkin/QueryField.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"], [0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"]
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
], ],
"public/app/plugins/datasource/zipkin/datasource.ts:5381": [ "public/app/plugins/datasource/zipkin/datasource.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"] [0, 0, 0, "Do not use any type assertions.", "0"]
@ -3126,9 +3107,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "3"] [0, 0, 0, "Do not use any type assertions.", "3"]
], ],
"public/app/plugins/panel/nodeGraph/ViewControls.tsx:5381": [ "public/app/plugins/panel/nodeGraph/ViewControls.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "0"]
[0, 0, 0, "\'VerticalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
], ],
"public/app/plugins/panel/nodeGraph/index.ts:5381": [ "public/app/plugins/panel/nodeGraph/index.ts:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./NodeGraph\`)", "0"] [0, 0, 0, "Do not re-export imported variable (\`./NodeGraph\`)", "0"]

@ -17,7 +17,7 @@ import React, { useState, useEffect, memo, useCallback } from 'react';
import { GrafanaTheme2, SelectableValue, toOption } from '@grafana/data'; import { GrafanaTheme2, SelectableValue, toOption } from '@grafana/data';
import { IntervalInput } from '@grafana/o11y-ds-frontend'; import { IntervalInput } from '@grafana/o11y-ds-frontend';
import { Collapse, HorizontalGroup, Icon, InlineField, InlineFieldRow, Select, Tooltip, useStyles2 } from '@grafana/ui'; import { Collapse, Icon, InlineField, InlineFieldRow, Select, Stack, Tooltip, useStyles2 } from '@grafana/ui';
import { t, Trans } from 'app/core/internationalization'; import { t, Trans } from 'app/core/internationalization';
import { defaultFilters, SearchProps } from '../../../useSearch'; import { defaultFilters, SearchProps } from '../../../useSearch';
@ -144,7 +144,7 @@ export const SpanFilters = memo((props: SpanFilterProps) => {
<Collapse label={collapseLabel} collapsible={true} isOpen={showSpanFilters} onToggle={setShowSpanFilters}> <Collapse label={collapseLabel} collapsible={true} isOpen={showSpanFilters} onToggle={setShowSpanFilters}>
<InlineFieldRow className={styles.flexContainer}> <InlineFieldRow className={styles.flexContainer}>
<InlineField label={t('explore.span-filters.label-service-name', 'Service name')} labelWidth={16}> <InlineField label={t('explore.span-filters.label-service-name', 'Service name')} labelWidth={16}>
<HorizontalGroup spacing={'xs'}> <Stack gap={0.5}>
<Select <Select
aria-label={t( aria-label={t(
'explore.span-filters.aria-label-select-service-name-operator', 'explore.span-filters.aria-label-select-service-name-operator',
@ -164,7 +164,7 @@ export const SpanFilters = memo((props: SpanFilterProps) => {
value={search.serviceName || null} value={search.serviceName || null}
defaultValue={search.serviceName || null} defaultValue={search.serviceName || null}
/> />
</HorizontalGroup> </Stack>
</InlineField> </InlineField>
<SearchBarInput <SearchBarInput
onChange={(v) => { onChange={(v) => {
@ -175,7 +175,7 @@ export const SpanFilters = memo((props: SpanFilterProps) => {
</InlineFieldRow> </InlineFieldRow>
<InlineFieldRow> <InlineFieldRow>
<InlineField label={t('explore.span-filters.label-span-name', 'Span name')} labelWidth={16}> <InlineField label={t('explore.span-filters.label-span-name', 'Span name')} labelWidth={16}>
<HorizontalGroup spacing={'xs'}> <Stack gap={0.5}>
<Select <Select
aria-label={t('explore.span-filters.aria-label-select-span-name-operator', 'Select span name operator')} aria-label={t('explore.span-filters.aria-label-select-span-name-operator', 'Select span name operator')}
onChange={(v) => setSpanFiltersSearch({ ...search, spanNameOperator: v.value! })} onChange={(v) => setSpanFiltersSearch({ ...search, spanNameOperator: v.value! })}
@ -191,7 +191,7 @@ export const SpanFilters = memo((props: SpanFilterProps) => {
placeholder={t('explore.span-filters.placeholder-all-span-names', 'All span names')} placeholder={t('explore.span-filters.placeholder-all-span-names', 'All span names')}
value={search.spanName || null} value={search.spanName || null}
/> />
</HorizontalGroup> </Stack>
</InlineField> </InlineField>
</InlineFieldRow> </InlineFieldRow>
<InlineFieldRow> <InlineFieldRow>
@ -202,7 +202,7 @@ export const SpanFilters = memo((props: SpanFilterProps) => {
units: 'ns, us, ms, s, m, h', units: 'ns, us, ms, s, m, h',
})} })}
> >
<HorizontalGroup spacing="xs" align="flex-start"> <Stack alignItems="flex-start" gap={0.5}>
<Select <Select
aria-label={t('explore.span-filters.aria-label-select-min-span-operator', 'Select min span operator')} aria-label={t('explore.span-filters.aria-label-select-min-span-operator', 'Select min span operator')}
onChange={(v) => setSpanFiltersSearch({ ...search, fromOperator: v.value! })} onChange={(v) => setSpanFiltersSearch({ ...search, fromOperator: v.value! })}
@ -237,7 +237,7 @@ export const SpanFilters = memo((props: SpanFilterProps) => {
value={search.to || ''} value={search.to || ''}
validationRegex={durationRegex} validationRegex={durationRegex}
/> />
</HorizontalGroup> </Stack>
</InlineField> </InlineField>
</InlineFieldRow> </InlineFieldRow>
<InlineFieldRow className={styles.tagsRow}> <InlineFieldRow className={styles.tagsRow}>

@ -5,9 +5,9 @@ import { QueryEditorProps } from '@grafana/data';
import { import {
Button, Button,
FileDropzone, FileDropzone,
HorizontalGroup,
InlineField, InlineField,
InlineFieldRow, InlineFieldRow,
Stack,
Modal, Modal,
QueryField, QueryField,
RadioButtonGroup, RadioButtonGroup,
@ -76,7 +76,7 @@ export function QueryEditor({ datasource, query, onChange, onRunQuery }: Props)
<div className={styles.container}> <div className={styles.container}>
<InlineFieldRow> <InlineFieldRow>
<InlineField label="Query type" grow={true}> <InlineField label="Query type" grow={true}>
<HorizontalGroup spacing={'sm'} align={'center'} justify={'space-between'}> <Stack gap={1} alignItems="center" justifyContent="space-between">
<RadioButtonGroup<JaegerQueryType> <RadioButtonGroup<JaegerQueryType>
options={[ options={[
{ value: 'search', label: 'Search' }, { value: 'search', label: 'Search' },
@ -101,7 +101,7 @@ export function QueryEditor({ datasource, query, onChange, onRunQuery }: Props)
> >
Import trace Import trace
</Button> </Button>
</HorizontalGroup> </Stack>
</InlineField> </InlineField>
</InlineFieldRow> </InlineFieldRow>
{renderEditorBody()} {renderEditorBody()}

@ -6,7 +6,7 @@ import { config, reportInteraction } from '@grafana/runtime';
import { import {
Button, Button,
FileDropzone, FileDropzone,
HorizontalGroup, Stack,
InlineField, InlineField,
InlineFieldRow, InlineFieldRow,
Modal, Modal,
@ -116,7 +116,7 @@ class TempoQueryFieldComponent extends PureComponent<Props, State> {
</Modal> </Modal>
<InlineFieldRow> <InlineFieldRow>
<InlineField label="Query type" grow={true}> <InlineField label="Query type" grow={true}>
<HorizontalGroup spacing={'sm'} align={'center'} justify={'space-between'}> <Stack gap={1} alignItems="center" justifyContent="space-between">
<RadioButtonGroup<TempoQueryType> <RadioButtonGroup<TempoQueryType>
options={queryTypeOptions} options={queryTypeOptions}
value={query.queryType} value={query.queryType}
@ -146,7 +146,7 @@ class TempoQueryFieldComponent extends PureComponent<Props, State> {
> >
Import trace Import trace
</Button> </Button>
</HorizontalGroup> </Stack>
</InlineField> </InlineField>
</InlineFieldRow> </InlineFieldRow>
{query.queryType === 'traceqlSearch' && ( {query.queryType === 'traceqlSearch' && (

@ -1,6 +1,6 @@
import { css } from '@emotion/css'; import { css } from '@emotion/css';
import { Select, HorizontalGroup, Input, useStyles2 } from '@grafana/ui'; import { Select, Stack, Input, useStyles2 } from '@grafana/ui';
import { TraceqlFilter } from '../dataquery.gen'; import { TraceqlFilter } from '../dataquery.gen';
@ -34,7 +34,7 @@ const DurationInput = ({ filter, operators, updateFilter }: Props) => {
} }
return ( return (
<HorizontalGroup spacing={'none'}> <Stack gap={0}>
<Select <Select
className={styles.noBoxShadow} className={styles.noBoxShadow}
inputId={`${filter.id}-operator`} inputId={`${filter.id}-operator`}
@ -59,7 +59,7 @@ const DurationInput = ({ filter, operators, updateFilter }: Props) => {
invalid={invalid} invalid={invalid}
width={18} width={18}
/> />
</HorizontalGroup> </Stack>
); );
}; };

@ -6,7 +6,7 @@ import useAsync from 'react-use/lib/useAsync';
import { SelectableValue } from '@grafana/data'; import { SelectableValue } from '@grafana/data';
import { TemporaryAlert } from '@grafana/o11y-ds-frontend'; import { TemporaryAlert } from '@grafana/o11y-ds-frontend';
import { FetchError, getTemplateSrv, isFetchError } from '@grafana/runtime'; import { FetchError, getTemplateSrv, isFetchError } from '@grafana/runtime';
import { Select, HorizontalGroup, useStyles2, InputActionMeta } from '@grafana/ui'; import { Select, Stack, useStyles2, InputActionMeta } from '@grafana/ui';
import { TraceqlFilter, TraceqlSearchScope } from '../dataquery.gen'; import { TraceqlFilter, TraceqlSearchScope } from '../dataquery.gen';
import { TempoDatasource } from '../datasource'; import { TempoDatasource } from '../datasource';
@ -144,7 +144,7 @@ const SearchField = ({
return ( return (
<> <>
<HorizontalGroup spacing={'none'} width={'auto'}> <Stack gap={0} width="auto">
{!hideScope && ( {!hideScope && (
<Select <Select
className={styles.dropdown} className={styles.dropdown}
@ -228,7 +228,7 @@ const SearchField = ({
allowCreateWhileLoading allowCreateWhileLoading
/> />
)} )}
</HorizontalGroup> </Stack>
{alertText && <TemporaryAlert severity="error" text={alertText} />} {alertText && <TemporaryAlert severity="error" text={alertText} />}
</> </>
); );

@ -4,7 +4,7 @@ import { useCallback, useEffect, useState } from 'react';
import { CoreApp, GrafanaTheme2 } from '@grafana/data'; import { CoreApp, GrafanaTheme2 } from '@grafana/data';
import { TemporaryAlert } from '@grafana/o11y-ds-frontend'; import { TemporaryAlert } from '@grafana/o11y-ds-frontend';
import { config, FetchError, getTemplateSrv, reportInteraction } from '@grafana/runtime'; import { config, FetchError, getTemplateSrv, reportInteraction } from '@grafana/runtime';
import { Alert, Button, HorizontalGroup, Select, useStyles2 } from '@grafana/ui'; import { Alert, Button, Stack, Select, useStyles2 } from '@grafana/ui';
import { RawQuery } from '../_importedDependencies/datasources/prometheus/RawQuery'; import { RawQuery } from '../_importedDependencies/datasources/prometheus/RawQuery';
import { TraceqlFilter, TraceqlSearchScope } from '../dataquery.gen'; import { TraceqlFilter, TraceqlSearchScope } from '../dataquery.gen';
@ -185,7 +185,7 @@ const TraceQLSearch = ({ datasource, query, onChange, onClearResults, app, addVa
label={'Duration'} label={'Duration'}
tooltip="The trace or span duration, i.e. end - start time of the trace/span. Accepted units are ns, ms, s, m, h" tooltip="The trace or span duration, i.e. end - start time of the trace/span. Accepted units are ns, ms, s, m, h"
> >
<HorizontalGroup spacing={'none'}> <Stack gap={0}>
<Select <Select
options={[ options={[
{ label: 'span', value: 'span' }, { label: 'span', value: 'span' },
@ -225,7 +225,7 @@ const TraceQLSearch = ({ datasource, query, onChange, onClearResults, app, addVa
operators={['<', '<=']} operators={['<', '<=']}
updateFilter={updateFilter} updateFilter={updateFilter}
/> />
</HorizontalGroup> </Stack>
</InlineSearchField> </InlineSearchField>
<InlineSearchField label={'Tags'}> <InlineSearchField label={'Tags'}>
<TagsInput <TagsInput

@ -17,7 +17,7 @@ import {
QueryField, QueryField,
useStyles2, useStyles2,
Modal, Modal,
HorizontalGroup, Stack,
Button, Button,
} from '@grafana/ui'; } from '@grafana/ui';
@ -90,7 +90,7 @@ export const ZipkinQueryField = ({ query, onChange, onRunQuery, datasource }: Pr
</Modal> </Modal>
<InlineFieldRow> <InlineFieldRow>
<InlineField label="Query type" grow={true}> <InlineField label="Query type" grow={true}>
<HorizontalGroup spacing={'sm'} align={'center'} justify={'space-between'}> <Stack gap={1} alignItems="center" justifyContent="space-between">
<RadioButtonGroup<ZipkinQueryType> <RadioButtonGroup<ZipkinQueryType>
options={[{ value: 'traceID', label: 'TraceID' }]} options={[{ value: 'traceID', label: 'TraceID' }]}
value={query.queryType || 'traceID'} value={query.queryType || 'traceID'}
@ -111,7 +111,7 @@ export const ZipkinQueryField = ({ query, onChange, onRunQuery, datasource }: Pr
> >
Import trace Import trace
</Button> </Button>
</HorizontalGroup> </Stack>
</InlineField> </InlineField>
</InlineFieldRow> </InlineFieldRow>
{query.queryType === 'traceID' && ( {query.queryType === 'traceID' && (

@ -1,7 +1,7 @@
import { css } from '@emotion/css'; import { css } from '@emotion/css';
import { useState } from 'react'; import { useState } from 'react';
import { Button, HorizontalGroup, useStyles2, VerticalGroup } from '@grafana/ui'; import { Button, Stack, useStyles2 } from '@grafana/ui';
function getStyles() { function getStyles() {
return { return {
@ -35,8 +35,8 @@ export function ViewControls<Config extends Record<string, any>>(props: Props<Co
return ( return (
<div className={styles.wrapper}> <div className={styles.wrapper}>
<VerticalGroup spacing="sm"> <Stack direction="column" gap={1}>
<HorizontalGroup spacing="xs"> <Stack gap={0.5}>
<Button <Button
icon={'plus-circle'} icon={'plus-circle'}
onClick={onPlus} onClick={onPlus}
@ -53,8 +53,8 @@ export function ViewControls<Config extends Record<string, any>>(props: Props<Co
variant="secondary" variant="secondary"
disabled={disableZoomOut} disabled={disableZoomOut}
/> />
</HorizontalGroup> </Stack>
</VerticalGroup> </Stack>
{allowConfiguration && ( {allowConfiguration && (
<Button size={'xs'} fill="text" onClick={() => setShowConfig((showConfig) => !showConfig)}> <Button size={'xs'} fill="text" onClick={() => setShowConfig((showConfig) => !showConfig)}>

Loading…
Cancel
Save