From 5f6b23e45a536dce27407a5ceae467fbf56684b4 Mon Sep 17 00:00:00 2001 From: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com> Date: Mon, 30 May 2022 10:46:33 +0200 Subject: [PATCH] AutoSizeInput: Move to @grafana/ui (#48811) * AutoSizeInput: Move to @grafana/ui * Update packages/grafana-ui/src/components/AutoSizeInput/AutoSizeInput.mdx Co-authored-by: JitaC <70489351+achatterjee-grafana@users.noreply.github.com> * Update packages/grafana-ui/src/components/AutoSizeInput/AutoSizeInput.mdx Co-authored-by: JitaC <70489351+achatterjee-grafana@users.noreply.github.com> * Update packages/grafana-ui/src/components/AutoSizeInput/AutoSizeInput.mdx Co-authored-by: JitaC <70489351+achatterjee-grafana@users.noreply.github.com> * Fix linter error * Update packages/grafana-ui/src/components/AutoSizeInput/AutoSizeInput.mdx Co-authored-by: JitaC <70489351+achatterjee-grafana@users.noreply.github.com> * Update packages/grafana-ui/src/components/AutoSizeInput/AutoSizeInput.mdx Co-authored-by: JitaC <70489351+achatterjee-grafana@users.noreply.github.com> * Move AutoSizeInput to Input folder * Use iconOptions in storybook Co-authored-by: JitaC <70489351+achatterjee-grafana@users.noreply.github.com> --- .../src/components/Input/AutoSizeInput.mdx | 37 +++++++ .../components/Input/AutoSizeInput.story.tsx | 100 ++++++++++++++++++ .../components/Input}/AutoSizeInput.test.tsx | 9 +- .../src/components/Input}/AutoSizeInput.tsx | 6 +- packages/grafana-ui/src/components/index.ts | 1 + .../components/LokiQueryBuilderOptions.tsx | 3 +- .../querybuilder/components/NestedQuery.tsx | 3 +- .../querybuilder/components/NestedQuery.tsx | 3 +- .../components/PromQueryBuilderOptions.tsx | 3 +- .../components/PromQueryLegendEditor.tsx | 3 +- .../shared/OperationParamEditor.tsx | 3 +- 11 files changed, 151 insertions(+), 20 deletions(-) create mode 100644 packages/grafana-ui/src/components/Input/AutoSizeInput.mdx create mode 100644 packages/grafana-ui/src/components/Input/AutoSizeInput.story.tsx rename {public/app/plugins/datasource/prometheus/querybuilder/shared => packages/grafana-ui/src/components/Input}/AutoSizeInput.test.tsx (87%) rename {public/app/plugins/datasource/prometheus/querybuilder/shared => packages/grafana-ui/src/components/Input}/AutoSizeInput.tsx (93%) diff --git a/packages/grafana-ui/src/components/Input/AutoSizeInput.mdx b/packages/grafana-ui/src/components/Input/AutoSizeInput.mdx new file mode 100644 index 00000000000..7494b398511 --- /dev/null +++ b/packages/grafana-ui/src/components/Input/AutoSizeInput.mdx @@ -0,0 +1,37 @@ +import { Props, Preview } from '@storybook/addon-docs/blocks'; +import { AutoSizeInput } from './AutoSizeInput'; +import { Field } from '../Forms/Field'; +import { Icon } from '../Icon/Icon'; + +# AutoSizeInput + +You can use it or regular text input. When used, AutoSizeInput resizes itself to the current content. For an array of data or tree-structured data, consider using `Select` or `Cascader` respectively. + +## Prefix and suffix + +To add more context to the input, you can add either text or an icon before or after the input using the `prefix` and `suffix`. Here are some examples for you to try in the canvas! + +```jsx +} /> +``` + + + } /> + + +## Usage in forms with Field + +Use `AutoSizeInput`with the`Field`component to get labels and descriptions. Also, you can use`AutoSizeInput`with the`required`attribute for validation. See the`Field` component for more information. + +```jsx + + + +``` + + + + + + + diff --git a/packages/grafana-ui/src/components/Input/AutoSizeInput.story.tsx b/packages/grafana-ui/src/components/Input/AutoSizeInput.story.tsx new file mode 100644 index 00000000000..29c8dcdca3f --- /dev/null +++ b/packages/grafana-ui/src/components/Input/AutoSizeInput.story.tsx @@ -0,0 +1,100 @@ +import { Story, Meta } from '@storybook/react'; +import React from 'react'; + +import { Icon, Button, AutoSizeInput } from '@grafana/ui'; + +import { IconName } from '../../types'; +import { iconOptions } from '../../utils/storybook/knobs'; +import { withCenteredStory } from '../../utils/storybook/withCenteredStory'; + +import mdx from './AutoSizeInput.mdx'; + +const icons: { [key: string]: string | undefined } = { ...iconOptions }; +Object.keys(icons).forEach((key) => { + icons[key] = `icon-${icons[key]}`; +}); + +const prefixSuffixOpts = { + Text: '$', + ...icons, +}; + +export default { + title: 'Forms/Input/AutoSizeInput', + component: AutoSizeInput, + decorators: [withCenteredStory], + parameters: { + docs: { + page: mdx, + }, + controls: { + exclude: ['prefix', 'suffix', 'addonBefore', 'addonAfter'], + }, + }, + args: { + type: 'text', + width: 40, + prefixVisible: '', + suffixVisible: '', + invalid: false, + loading: false, + }, + argTypes: { + prefixVisible: { + control: { + type: 'select', + options: prefixSuffixOpts, + }, + }, + suffixVisible: { + control: { + type: 'select', + options: prefixSuffixOpts, + }, + }, + type: { + control: { + type: 'select', + options: ['text', 'number', 'password'], + }, + }, + minWidth: { control: { type: 'range', min: 10, max: 200, step: 10 } }, + }, +} as Meta; + +export const Simple: Story = (args) => { + const addonAfter = ; + const addonBefore =
AutoSizeInput
; + const prefix = args.prefixVisible; + const suffix = args.suffixVisible; + let prefixEl: any = prefix; + if (prefix && prefix.match(/icon-/g)) { + prefixEl = ; + } + let suffixEl: any = suffix; + if (suffix && suffix.match(/icon-/g)) { + suffixEl = ; + } + + return ( + + ); +}; +Simple.args = { + disabled: false, + before: false, + after: false, + placeholder: 'Enter your name here...', +}; diff --git a/public/app/plugins/datasource/prometheus/querybuilder/shared/AutoSizeInput.test.tsx b/packages/grafana-ui/src/components/Input/AutoSizeInput.test.tsx similarity index 87% rename from public/app/plugins/datasource/prometheus/querybuilder/shared/AutoSizeInput.test.tsx rename to packages/grafana-ui/src/components/Input/AutoSizeInput.test.tsx index 1bd9458fb50..2a07011eb8e 100644 --- a/public/app/plugins/datasource/prometheus/querybuilder/shared/AutoSizeInput.test.tsx +++ b/packages/grafana-ui/src/components/Input/AutoSizeInput.test.tsx @@ -3,16 +3,13 @@ import React from 'react'; import { AutoSizeInput } from './AutoSizeInput'; -jest.mock('@grafana/ui', () => { - const original = jest.requireActual('@grafana/ui'); - const mockedUi = { ...original }; - +jest.mock('../../utils/measureText', () => { // Mocking measureText - mockedUi.measureText = (text: string, fontSize: number) => { + const measureText = (text: string, fontSize: number) => { return { width: text.length * fontSize }; }; - return mockedUi; + return { measureText }; }); describe('AutoSizeInput', () => { diff --git a/public/app/plugins/datasource/prometheus/querybuilder/shared/AutoSizeInput.tsx b/packages/grafana-ui/src/components/Input/AutoSizeInput.tsx similarity index 93% rename from public/app/plugins/datasource/prometheus/querybuilder/shared/AutoSizeInput.tsx rename to packages/grafana-ui/src/components/Input/AutoSizeInput.tsx index a81e3c91010..3aedbe32e78 100644 --- a/public/app/plugins/datasource/prometheus/querybuilder/shared/AutoSizeInput.tsx +++ b/packages/grafana-ui/src/components/Input/AutoSizeInput.tsx @@ -1,7 +1,9 @@ import React, { useEffect } from 'react'; -import { Input, measureText } from '@grafana/ui'; -import { Props as InputProps } from '@grafana/ui/src/components/Input/Input'; +import { measureText } from '../../utils/measureText'; + +import { Input, Props as InputProps } from './Input'; + export interface Props extends InputProps { /** Sets the min-width to a multiple of 8px. Default value is 10*/ minWidth?: number; diff --git a/packages/grafana-ui/src/components/index.ts b/packages/grafana-ui/src/components/index.ts index 4c32405d854..eda36a086d3 100644 --- a/packages/grafana-ui/src/components/index.ts +++ b/packages/grafana-ui/src/components/index.ts @@ -218,6 +218,7 @@ export { RadioButtonGroup } from './Forms/RadioButtonGroup/RadioButtonGroup'; export { RadioButtonList } from './Forms/RadioButtonList/RadioButtonList'; export { Input, getInputStyles } from './Input/Input'; +export { AutoSizeInput } from './Input/AutoSizeInput'; export { FilterInput } from './FilterInput/FilterInput'; export { FormInputSize } from './Forms/types'; diff --git a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderOptions.tsx b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderOptions.tsx index c975a9aea1b..6a6136ec75f 100644 --- a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderOptions.tsx +++ b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderOptions.tsx @@ -2,8 +2,7 @@ import React from 'react'; import { SelectableValue } from '@grafana/data'; import { EditorRow, EditorField } from '@grafana/experimental'; -import { RadioButtonGroup, Select } from '@grafana/ui'; -import { AutoSizeInput } from 'app/plugins/datasource/prometheus/querybuilder/shared/AutoSizeInput'; +import { RadioButtonGroup, Select, AutoSizeInput } from '@grafana/ui'; import { QueryOptionGroup } from 'app/plugins/datasource/prometheus/querybuilder/shared/QueryOptionGroup'; import { preprocessMaxLines, queryTypeOptions, RESOLUTION_OPTIONS } from '../../components/LokiOptionFields'; diff --git a/public/app/plugins/datasource/loki/querybuilder/components/NestedQuery.tsx b/public/app/plugins/datasource/loki/querybuilder/components/NestedQuery.tsx index 0c88536906f..fbd4ed2074f 100644 --- a/public/app/plugins/datasource/loki/querybuilder/components/NestedQuery.tsx +++ b/public/app/plugins/datasource/loki/querybuilder/components/NestedQuery.tsx @@ -3,8 +3,7 @@ import React from 'react'; import { GrafanaTheme2, toOption } from '@grafana/data'; import { EditorRows, FlexItem } from '@grafana/experimental'; -import { IconButton, Select, useStyles2 } from '@grafana/ui'; -import { AutoSizeInput } from 'app/plugins/datasource/prometheus/querybuilder/shared/AutoSizeInput'; +import { AutoSizeInput, IconButton, Select, useStyles2 } from '@grafana/ui'; import { LokiDatasource } from '../../datasource'; import { binaryScalarDefs } from '../binaryScalarOperations'; diff --git a/public/app/plugins/datasource/prometheus/querybuilder/components/NestedQuery.tsx b/public/app/plugins/datasource/prometheus/querybuilder/components/NestedQuery.tsx index 80034621982..2bf6c16c66c 100644 --- a/public/app/plugins/datasource/prometheus/querybuilder/components/NestedQuery.tsx +++ b/public/app/plugins/datasource/prometheus/querybuilder/components/NestedQuery.tsx @@ -3,11 +3,10 @@ import React from 'react'; import { GrafanaTheme2, toOption } from '@grafana/data'; import { EditorRows, FlexItem } from '@grafana/experimental'; -import { IconButton, Select, useStyles2 } from '@grafana/ui'; +import { AutoSizeInput, IconButton, Select, useStyles2 } from '@grafana/ui'; import { PrometheusDatasource } from '../../datasource'; import { binaryScalarDefs } from '../binaryScalarOperations'; -import { AutoSizeInput } from '../shared/AutoSizeInput'; import { PromVisualQueryBinary } from '../types'; import { PromQueryBuilder } from './PromQueryBuilder'; diff --git a/public/app/plugins/datasource/prometheus/querybuilder/components/PromQueryBuilderOptions.tsx b/public/app/plugins/datasource/prometheus/querybuilder/components/PromQueryBuilderOptions.tsx index 17b3b296eea..b24e15df1aa 100644 --- a/public/app/plugins/datasource/prometheus/querybuilder/components/PromQueryBuilderOptions.tsx +++ b/public/app/plugins/datasource/prometheus/querybuilder/components/PromQueryBuilderOptions.tsx @@ -2,12 +2,11 @@ import React, { SyntheticEvent } from 'react'; import { CoreApp, SelectableValue } from '@grafana/data'; import { EditorRow, EditorField, EditorSwitch } from '@grafana/experimental'; -import { RadioButtonGroup, Select } from '@grafana/ui'; +import { AutoSizeInput, RadioButtonGroup, Select } from '@grafana/ui'; import { getQueryTypeChangeHandler, getQueryTypeOptions } from '../../components/PromExploreExtraField'; import { FORMAT_OPTIONS, INTERVAL_FACTOR_OPTIONS } from '../../components/PromQueryEditor'; import { PromQuery } from '../../types'; -import { AutoSizeInput } from '../shared/AutoSizeInput'; import { QueryOptionGroup } from '../shared/QueryOptionGroup'; import { getLegendModeLabel, PromQueryLegendEditor } from './PromQueryLegendEditor'; diff --git a/public/app/plugins/datasource/prometheus/querybuilder/components/PromQueryLegendEditor.tsx b/public/app/plugins/datasource/prometheus/querybuilder/components/PromQueryLegendEditor.tsx index 3d4e512d86f..bb1503b0d9d 100644 --- a/public/app/plugins/datasource/prometheus/querybuilder/components/PromQueryLegendEditor.tsx +++ b/public/app/plugins/datasource/prometheus/querybuilder/components/PromQueryLegendEditor.tsx @@ -2,10 +2,9 @@ import React, { useRef } from 'react'; import { SelectableValue } from '@grafana/data'; import { EditorField } from '@grafana/experimental'; -import { Select } from '@grafana/ui'; +import { Select, AutoSizeInput } from '@grafana/ui'; import { LegendFormatMode } from '../../types'; -import { AutoSizeInput } from '../shared/AutoSizeInput'; export interface Props { legendFormat: string | undefined; diff --git a/public/app/plugins/datasource/prometheus/querybuilder/shared/OperationParamEditor.tsx b/public/app/plugins/datasource/prometheus/querybuilder/shared/OperationParamEditor.tsx index 2ebe1431e34..2ad1e5e6005 100644 --- a/public/app/plugins/datasource/prometheus/querybuilder/shared/OperationParamEditor.tsx +++ b/public/app/plugins/datasource/prometheus/querybuilder/shared/OperationParamEditor.tsx @@ -1,11 +1,10 @@ import React, { ComponentType } from 'react'; import { SelectableValue, toOption } from '@grafana/data'; -import { Checkbox, Select } from '@grafana/ui'; +import { AutoSizeInput, Checkbox, Select } from '@grafana/ui'; import { QueryBuilderOperationParamDef, QueryBuilderOperationParamEditorProps } from '../shared/types'; -import { AutoSizeInput } from './AutoSizeInput'; import { getOperationParamId } from './operationUtils'; export function getOperationParamEditor(