mirror of https://github.com/grafana/grafana
Chore: Stories for Select performance (#57965)
* user essentials mob! 🔱 * user essentials mob! 🔱 lastFile:packages/grafana-ui/src/components/Select/SelectPerf.story.internal.tsx * user essentials mob! 🔱 Co-authored-by: Ashley Harrison <ashley.harrison@grafana.com>pull/57967/head
parent
5c30b0cca1
commit
2de6cd0692
@ -0,0 +1,71 @@ |
|||||||
|
import { Meta } from '@storybook/react'; |
||||||
|
import React, { useMemo } from 'react'; |
||||||
|
import ReactSelect, { createFilter } from 'react-select'; |
||||||
|
|
||||||
|
import { SelectableValue } from '@grafana/data'; |
||||||
|
|
||||||
|
import { withCenteredStory, withHorizontallyCenteredStory } from '../../utils/storybook/withCenteredStory'; |
||||||
|
import { Label } from '../Forms/Label'; |
||||||
|
|
||||||
|
import { Select, VirtualizedSelect } from './Select'; |
||||||
|
|
||||||
|
const meta: Meta = { |
||||||
|
title: 'Forms/Select (Perf)', |
||||||
|
decorators: [withCenteredStory, withHorizontallyCenteredStory], |
||||||
|
argTypes: { |
||||||
|
numberOfOptions: { |
||||||
|
defaultValue: 10_000, |
||||||
|
control: { type: 'number' }, |
||||||
|
}, |
||||||
|
}, |
||||||
|
}; |
||||||
|
|
||||||
|
export default meta; |
||||||
|
|
||||||
|
const _customFilter = createFilter({ ignoreAccents: false }); |
||||||
|
function customFilter(opt: SelectableValue, searchQuery: string) { |
||||||
|
return _customFilter( |
||||||
|
{ |
||||||
|
label: opt.label ?? '', |
||||||
|
value: opt.value ?? '', |
||||||
|
data: {}, |
||||||
|
}, |
||||||
|
searchQuery |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
export function PerformanceScenarios({ numberOfOptions }: { numberOfOptions: number }) { |
||||||
|
const options = useMemo(() => { |
||||||
|
const opts: SelectableValue[] = []; |
||||||
|
const ALPHABET = 'qwertyuiopasdfghjklzxcvbnm'.split(''); |
||||||
|
|
||||||
|
for (let index = 0; index < numberOfOptions; index++) { |
||||||
|
const letter = ALPHABET[index % ALPHABET.length]; |
||||||
|
opts.push({ label: letter + '-' + index, value: letter + '-' + index }); |
||||||
|
} |
||||||
|
|
||||||
|
return opts; |
||||||
|
}, [numberOfOptions]); |
||||||
|
|
||||||
|
return ( |
||||||
|
<div> |
||||||
|
<Label>Virtual:</Label> |
||||||
|
<VirtualizedSelect options={options} onChange={() => {}} /> |
||||||
|
<br /> |
||||||
|
|
||||||
|
<Label>Virtual with ignoreAccents false:</Label> |
||||||
|
<VirtualizedSelect filterOption={customFilter} options={options} onChange={() => {}} /> |
||||||
|
<br /> |
||||||
|
|
||||||
|
<Label>Normal:</Label> |
||||||
|
<Select options={options} onChange={() => {}} /> |
||||||
|
<br /> |
||||||
|
|
||||||
|
<Label>Standard react-select</Label> |
||||||
|
<ReactSelect options={options} onChange={() => {}} /> |
||||||
|
<br /> |
||||||
|
|
||||||
|
<p>Rendered with {options.length.toLocaleString()} options</p> |
||||||
|
</div> |
||||||
|
); |
||||||
|
} |
Loading…
Reference in new issue