mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Select: Changes default menu placement for Select from auto to bottom (#29837)
* Select: Changes default menuPlacement from auto to bottom * Tests: Fixes snapshot
This commit is contained in:
parent
b1a57c6f77
commit
5f4b528122
@ -116,7 +116,7 @@ export function SelectBase<T>({
|
|||||||
maxMenuHeight = 300,
|
maxMenuHeight = 300,
|
||||||
minMenuHeight,
|
minMenuHeight,
|
||||||
maxVisibleValues,
|
maxVisibleValues,
|
||||||
menuPlacement = 'auto',
|
menuPlacement = 'bottom',
|
||||||
menuPosition,
|
menuPosition,
|
||||||
noOptionsMessage = 'No options found',
|
noOptionsMessage = 'No options found',
|
||||||
onBlur,
|
onBlur,
|
||||||
|
@ -3,7 +3,7 @@ import React, { PureComponent } from 'react';
|
|||||||
|
|
||||||
// Components
|
// Components
|
||||||
import { HorizontalGroup, Select } from '@grafana/ui';
|
import { HorizontalGroup, Select } from '@grafana/ui';
|
||||||
import { SelectableValue, DataSourceInstanceSettings } from '@grafana/data';
|
import { DataSourceInstanceSettings, SelectableValue } from '@grafana/data';
|
||||||
import { selectors } from '@grafana/e2e-selectors';
|
import { selectors } from '@grafana/e2e-selectors';
|
||||||
import { isUnsignedPluginSignature, PluginSignatureBadge } from '../../../features/plugins/PluginSignatureBadge';
|
import { isUnsignedPluginSignature, PluginSignatureBadge } from '../../../features/plugins/PluginSignatureBadge';
|
||||||
import { getDataSourceSrv } from '@grafana/runtime';
|
import { getDataSourceSrv } from '@grafana/runtime';
|
||||||
@ -130,7 +130,6 @@ export class DataSourcePicker extends PureComponent<Props, State> {
|
|||||||
onBlur={onBlur}
|
onBlur={onBlur}
|
||||||
openMenuOnFocus={openMenuOnFocus}
|
openMenuOnFocus={openMenuOnFocus}
|
||||||
maxMenuHeight={500}
|
maxMenuHeight={500}
|
||||||
menuPlacement="bottom"
|
|
||||||
placeholder={placeholder}
|
placeholder={placeholder}
|
||||||
noOptionsMessage="No datasources found"
|
noOptionsMessage="No datasources found"
|
||||||
value={value}
|
value={value}
|
||||||
|
@ -226,7 +226,6 @@ export class CalculateFieldTransformerEditor extends React.PureComponent<
|
|||||||
stats={[options.reducer]}
|
stats={[options.reducer]}
|
||||||
onChange={this.onStatsChange}
|
onChange={this.onStatsChange}
|
||||||
defaultStat={ReducerID.sum}
|
defaultStat={ReducerID.sum}
|
||||||
menuPlacement="bottom"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -305,14 +304,12 @@ export class CalculateFieldTransformerEditor extends React.PureComponent<
|
|||||||
className="min-width-18 gf-form-spacing"
|
className="min-width-18 gf-form-spacing"
|
||||||
value={options?.left}
|
value={options?.left}
|
||||||
onChange={this.onBinaryLeftChanged}
|
onChange={this.onBinaryLeftChanged}
|
||||||
menuPlacement="bottom"
|
|
||||||
/>
|
/>
|
||||||
<Select
|
<Select
|
||||||
className="width-8 gf-form-spacing"
|
className="width-8 gf-form-spacing"
|
||||||
options={ops}
|
options={ops}
|
||||||
value={options.operator ?? ops[0].value}
|
value={options.operator ?? ops[0].value}
|
||||||
onChange={this.onBinaryOperationChanged}
|
onChange={this.onBinaryOperationChanged}
|
||||||
menuPlacement="bottom"
|
|
||||||
/>
|
/>
|
||||||
<Select
|
<Select
|
||||||
allowCustomValue={true}
|
allowCustomValue={true}
|
||||||
@ -321,7 +318,6 @@ export class CalculateFieldTransformerEditor extends React.PureComponent<
|
|||||||
options={rightNames}
|
options={rightNames}
|
||||||
value={options?.right}
|
value={options?.right}
|
||||||
onChange={this.onBinaryRightChanged}
|
onChange={this.onBinaryRightChanged}
|
||||||
menuPlacement="bottom"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -347,7 +343,6 @@ export class CalculateFieldTransformerEditor extends React.PureComponent<
|
|||||||
options={calculationModes}
|
options={calculationModes}
|
||||||
value={calculationModes.find(v => v.value === mode)}
|
value={calculationModes.find(v => v.value === mode)}
|
||||||
onChange={this.onModeChanged}
|
onChange={this.onModeChanged}
|
||||||
menuPlacement="bottom"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -8,8 +8,8 @@ import {
|
|||||||
} from '@grafana/data';
|
} from '@grafana/data';
|
||||||
import { Input, Select } from '@grafana/ui';
|
import { Input, Select } from '@grafana/ui';
|
||||||
import {
|
import {
|
||||||
ConcatenateTransformerOptions,
|
|
||||||
ConcatenateFrameNameMode,
|
ConcatenateFrameNameMode,
|
||||||
|
ConcatenateTransformerOptions,
|
||||||
} from '@grafana/data/src/transformations/transformers/concat';
|
} from '@grafana/data/src/transformations/transformers/concat';
|
||||||
|
|
||||||
interface ConcatenateTransformerEditorProps extends TransformerUIProps<ConcatenateTransformerOptions> {}
|
interface ConcatenateTransformerEditorProps extends TransformerUIProps<ConcatenateTransformerOptions> {}
|
||||||
@ -61,7 +61,6 @@ export class ConcatenateTransformerEditor extends React.PureComponent<Concatenat
|
|||||||
options={nameModes}
|
options={nameModes}
|
||||||
value={nameModes.find(v => v.value === frameNameMode)}
|
value={nameModes.find(v => v.value === frameNameMode)}
|
||||||
onChange={this.onModeChanged}
|
onChange={this.onModeChanged}
|
||||||
menuPlacement="bottom"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -87,7 +87,6 @@ export const FilterByValueFilterEditor: React.FC<Props> = props => {
|
|||||||
options={fieldsAsOptions}
|
options={fieldsAsOptions}
|
||||||
value={filter.fieldName}
|
value={filter.fieldName}
|
||||||
onChange={onChangeField}
|
onChange={onChangeField}
|
||||||
menuPlacement="bottom"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="gf-form gf-form-spacing">
|
<div className="gf-form gf-form-spacing">
|
||||||
@ -98,7 +97,6 @@ export const FilterByValueFilterEditor: React.FC<Props> = props => {
|
|||||||
options={matcherOptions}
|
options={matcherOptions}
|
||||||
value={matcherId}
|
value={matcherId}
|
||||||
onChange={onChangeMatcher}
|
onChange={onChangeMatcher}
|
||||||
menuPlacement="bottom"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="gf-form gf-form--grow gf-form-spacing">
|
<div className="gf-form gf-form--grow gf-form-spacing">
|
||||||
|
@ -1,20 +1,20 @@
|
|||||||
import React, { useMemo, useCallback } from 'react';
|
import React, { useCallback, useMemo } from 'react';
|
||||||
import { css, cx } from 'emotion';
|
import { css, cx } from 'emotion';
|
||||||
import {
|
import {
|
||||||
DataTransformerID,
|
DataTransformerID,
|
||||||
|
ReducerID,
|
||||||
|
SelectableValue,
|
||||||
standardTransformers,
|
standardTransformers,
|
||||||
TransformerRegistyItem,
|
TransformerRegistyItem,
|
||||||
TransformerUIProps,
|
TransformerUIProps,
|
||||||
ReducerID,
|
|
||||||
SelectableValue,
|
|
||||||
} from '@grafana/data';
|
} from '@grafana/data';
|
||||||
import { getAllFieldNamesFromDataFrames } from './OrganizeFieldsTransformerEditor';
|
import { getAllFieldNamesFromDataFrames } from './OrganizeFieldsTransformerEditor';
|
||||||
import { Select, StatsPicker, stylesFactory } from '@grafana/ui';
|
import { Select, StatsPicker, stylesFactory } from '@grafana/ui';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
GroupByTransformerOptions,
|
|
||||||
GroupByOperationID,
|
|
||||||
GroupByFieldOptions,
|
GroupByFieldOptions,
|
||||||
|
GroupByOperationID,
|
||||||
|
GroupByTransformerOptions,
|
||||||
} from '@grafana/data/src/transformations/transformers/groupBy';
|
} from '@grafana/data/src/transformations/transformers/groupBy';
|
||||||
|
|
||||||
interface FieldProps {
|
interface FieldProps {
|
||||||
@ -90,7 +90,6 @@ export const GroupByFieldConfiguration: React.FC<FieldProps> = ({ fieldName, con
|
|||||||
placeholder="Ignored"
|
placeholder="Ignored"
|
||||||
onChange={onChange}
|
onChange={onChange}
|
||||||
isClearable
|
isClearable
|
||||||
menuPlacement="bottom"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -105,7 +104,6 @@ export const GroupByFieldConfiguration: React.FC<FieldProps> = ({ fieldName, con
|
|||||||
onChange={stats => {
|
onChange={stats => {
|
||||||
onConfigChange({ ...config, aggregations: stats as ReducerID[] });
|
onConfigChange({ ...config, aggregations: stats as ReducerID[] });
|
||||||
}}
|
}}
|
||||||
menuPlacement="bottom"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import {
|
import {
|
||||||
DataTransformerID,
|
DataTransformerID,
|
||||||
|
SelectableValue,
|
||||||
standardTransformers,
|
standardTransformers,
|
||||||
TransformerRegistyItem,
|
TransformerRegistyItem,
|
||||||
TransformerUIProps,
|
TransformerUIProps,
|
||||||
SelectableValue,
|
|
||||||
} from '@grafana/data';
|
} from '@grafana/data';
|
||||||
import { Select } from '@grafana/ui';
|
import { Select } from '@grafana/ui';
|
||||||
|
|
||||||
@ -49,7 +49,6 @@ export const LabelsAsFieldsTransformerEditor: React.FC<TransformerUIProps<Labels
|
|||||||
className="min-width-18 gf-form-spacing"
|
className="min-width-18 gf-form-spacing"
|
||||||
value={options?.valueLabel}
|
value={options?.valueLabel}
|
||||||
onChange={onValueLabelChange}
|
onChange={onValueLabelChange}
|
||||||
menuPlacement="bottom"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
import React, { useCallback } from 'react';
|
import React, { useCallback } from 'react';
|
||||||
import { StatsPicker, Select, LegacyForms } from '@grafana/ui';
|
import { LegacyForms, Select, StatsPicker } from '@grafana/ui';
|
||||||
import {
|
import {
|
||||||
DataTransformerID,
|
DataTransformerID,
|
||||||
ReducerID,
|
ReducerID,
|
||||||
|
SelectableValue,
|
||||||
standardTransformers,
|
standardTransformers,
|
||||||
TransformerRegistyItem,
|
TransformerRegistyItem,
|
||||||
TransformerUIProps,
|
TransformerUIProps,
|
||||||
SelectableValue,
|
|
||||||
} from '@grafana/data';
|
} from '@grafana/data';
|
||||||
|
|
||||||
import { ReduceTransformerOptions, ReduceTransformerMode } from '@grafana/data/src/transformations/transformers/reduce';
|
import { ReduceTransformerMode, ReduceTransformerOptions } from '@grafana/data/src/transformations/transformers/reduce';
|
||||||
import { selectors } from '@grafana/e2e-selectors';
|
import { selectors } from '@grafana/e2e-selectors';
|
||||||
|
|
||||||
// TODO: Minimal implementation, needs some <3
|
// TODO: Minimal implementation, needs some <3
|
||||||
@ -60,7 +60,6 @@ export const ReduceTransformerEditor: React.FC<TransformerUIProps<ReduceTransfor
|
|||||||
options={modes}
|
options={modes}
|
||||||
value={modes.find(v => v.value === options.mode) || modes[0]}
|
value={modes.find(v => v.value === options.mode) || modes[0]}
|
||||||
onChange={onSelectMode}
|
onChange={onSelectMode}
|
||||||
menuPlacement="bottom"
|
|
||||||
className="flex-grow-1"
|
className="flex-grow-1"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@ -81,7 +80,6 @@ export const ReduceTransformerEditor: React.FC<TransformerUIProps<ReduceTransfor
|
|||||||
reducers: stats as ReducerID[],
|
reducers: stats as ReducerID[],
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
menuPlacement="bottom"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -33,13 +33,7 @@ export const SeriesToFieldsTransformerEditor: React.FC<TransformerUIProps<Series
|
|||||||
<div className="gf-form-inline">
|
<div className="gf-form-inline">
|
||||||
<div className="gf-form gf-form--grow">
|
<div className="gf-form gf-form--grow">
|
||||||
<div className="gf-form-label width-8">Field name</div>
|
<div className="gf-form-label width-8">Field name</div>
|
||||||
<Select
|
<Select options={fieldNameOptions} value={options.byField} onChange={onSelectField} isClearable />
|
||||||
options={fieldNameOptions}
|
|
||||||
value={options.byField}
|
|
||||||
onChange={onSelectField}
|
|
||||||
isClearable
|
|
||||||
menuPlacement="bottom"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -159,7 +159,6 @@ export class TransformationsEditor extends React.PureComponent<TransformationsEd
|
|||||||
options={availableTransformers}
|
options={availableTransformers}
|
||||||
onChange={this.onTransformationAdd}
|
onChange={this.onTransformationAdd}
|
||||||
isFullWidth={false}
|
isFullWidth={false}
|
||||||
menuPlacement="bottom"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -5,24 +5,24 @@ import debounce from 'lodash/debounce';
|
|||||||
import unionBy from 'lodash/unionBy';
|
import unionBy from 'lodash/unionBy';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
QueryField,
|
BracesPlugin,
|
||||||
SlatePrism,
|
|
||||||
LegacyForms,
|
LegacyForms,
|
||||||
|
MultiSelect,
|
||||||
|
QueryField,
|
||||||
|
Select,
|
||||||
|
SlatePrism,
|
||||||
TypeaheadInput,
|
TypeaheadInput,
|
||||||
TypeaheadOutput,
|
TypeaheadOutput,
|
||||||
BracesPlugin,
|
|
||||||
Select,
|
|
||||||
MultiSelect,
|
|
||||||
} from '@grafana/ui';
|
} from '@grafana/ui';
|
||||||
|
|
||||||
// Utils & Services
|
// Utils & Services
|
||||||
// dom also includes Element polyfills
|
// dom also includes Element polyfills
|
||||||
import { Plugin, Node, Editor } from 'slate';
|
import { Editor, Node, Plugin } from 'slate';
|
||||||
import syntax from '../syntax';
|
import syntax from '../syntax';
|
||||||
|
|
||||||
// Types
|
// Types
|
||||||
import { ExploreQueryFieldProps, AbsoluteTimeRange, SelectableValue, AppEvents } from '@grafana/data';
|
import { AbsoluteTimeRange, AppEvents, ExploreQueryFieldProps, SelectableValue } from '@grafana/data';
|
||||||
import { CloudWatchQuery, CloudWatchLogsQuery } from '../types';
|
import { CloudWatchLogsQuery, CloudWatchQuery } from '../types';
|
||||||
import { CloudWatchDatasource } from '../datasource';
|
import { CloudWatchDatasource } from '../datasource';
|
||||||
import { LanguageMap, languages as prismLanguages } from 'prismjs';
|
import { LanguageMap, languages as prismLanguages } from 'prismjs';
|
||||||
import { CloudWatchLanguageProvider } from '../language_provider';
|
import { CloudWatchLanguageProvider } from '../language_provider';
|
||||||
@ -321,7 +321,6 @@ export class CloudWatchLogsQueryField extends React.PureComponent<CloudWatchLogs
|
|||||||
onChange={v => this.setSelectedRegion(v)}
|
onChange={v => this.setSelectedRegion(v)}
|
||||||
width={18}
|
width={18}
|
||||||
placeholder="Choose Region"
|
placeholder="Choose Region"
|
||||||
menuPlacement="bottom"
|
|
||||||
maxMenuHeight={500}
|
maxMenuHeight={500}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
@ -349,7 +348,6 @@ export class CloudWatchLogsQueryField extends React.PureComponent<CloudWatchLogs
|
|||||||
isOptionDisabled={() => selectedLogGroups.length >= MAX_LOG_GROUPS}
|
isOptionDisabled={() => selectedLogGroups.length >= MAX_LOG_GROUPS}
|
||||||
placeholder="Choose Log Groups"
|
placeholder="Choose Log Groups"
|
||||||
maxVisibleValues={4}
|
maxVisibleValues={4}
|
||||||
menuPlacement="bottom"
|
|
||||||
noOptionsMessage="No log groups available"
|
noOptionsMessage="No log groups available"
|
||||||
isLoading={loadingLogGroups}
|
isLoading={loadingLogGroups}
|
||||||
onOpenMenu={this.onOpenLogGroupMenu}
|
onOpenMenu={this.onOpenLogGroupMenu}
|
||||||
|
@ -3,15 +3,15 @@ import React, { PureComponent } from 'react';
|
|||||||
|
|
||||||
// Types
|
// Types
|
||||||
import { InlineFormLabel, LegacyForms, Select } from '@grafana/ui';
|
import { InlineFormLabel, LegacyForms, Select } from '@grafana/ui';
|
||||||
import { SelectableValue, QueryEditorProps } from '@grafana/data';
|
import { QueryEditorProps, SelectableValue } from '@grafana/data';
|
||||||
|
|
||||||
const { Switch } = LegacyForms;
|
|
||||||
|
|
||||||
import { PrometheusDatasource } from '../datasource';
|
import { PrometheusDatasource } from '../datasource';
|
||||||
import { PromQuery, PromOptions } from '../types';
|
import { PromOptions, PromQuery } from '../types';
|
||||||
|
|
||||||
import PromQueryField from './PromQueryField';
|
import PromQueryField from './PromQueryField';
|
||||||
import PromLink from './PromLink';
|
import PromLink from './PromLink';
|
||||||
|
|
||||||
|
const { Switch } = LegacyForms;
|
||||||
|
|
||||||
export type Props = QueryEditorProps<PrometheusDatasource, PromQuery, PromOptions>;
|
export type Props = QueryEditorProps<PrometheusDatasource, PromQuery, PromOptions>;
|
||||||
|
|
||||||
const FORMAT_OPTIONS: Array<SelectableValue<string>> = [
|
const FORMAT_OPTIONS: Array<SelectableValue<string>> = [
|
||||||
@ -157,7 +157,6 @@ export class PromQueryEditor extends PureComponent<Props, State> {
|
|||||||
<div className="gf-form-label">Resolution</div>
|
<div className="gf-form-label">Resolution</div>
|
||||||
<Select
|
<Select
|
||||||
isSearchable={false}
|
isSearchable={false}
|
||||||
menuPlacement="bottom"
|
|
||||||
options={INTERVAL_FACTOR_OPTIONS}
|
options={INTERVAL_FACTOR_OPTIONS}
|
||||||
onChange={this.onIntervalFactorChange}
|
onChange={this.onIntervalFactorChange}
|
||||||
value={intervalFactorOption}
|
value={intervalFactorOption}
|
||||||
|
@ -82,7 +82,6 @@ exports[`Render PromQueryEditor with basic options should render 1`] = `
|
|||||||
</div>
|
</div>
|
||||||
<Select
|
<Select
|
||||||
isSearchable={false}
|
isSearchable={false}
|
||||||
menuPlacement="bottom"
|
|
||||||
onChange={[Function]}
|
onChange={[Function]}
|
||||||
options={
|
options={
|
||||||
Array [
|
Array [
|
||||||
|
Loading…
Reference in New Issue
Block a user