mirror of https://github.com/grafana/grafana
Storybook: Add MDX PanelChrome documentation (#64916)
parent
8438716bf5
commit
5bbdc62044
@ -0,0 +1,484 @@ |
||||
import { Meta, Canvas, Story, Preview, Props } from '@storybook/addon-docs/blocks'; |
||||
import { PanelChrome } from './PanelChrome'; |
||||
import { LoadingIndicator } from './LoadingIndicator'; |
||||
|
||||
import { action } from '@storybook/addon-actions'; |
||||
import { DashboardStoryCanvas } from '../../utils/storybook/DashboardStoryCanvas'; |
||||
import { HorizontalGroup } from '../Layout/Layout'; |
||||
import { LoadingState } from '@grafana/data'; |
||||
import { Button } from '../Button/Button.tsx'; |
||||
import { Menu } from '../Menu/Menu'; |
||||
|
||||
<Meta title="MDX|PanelChrome" component={PanelChrome} /> |
||||
|
||||
# PanelChrome |
||||
|
||||
Component used for rendering content wrapped in the same style as grafana panels |
||||
|
||||
### Basic Usage: Title, Description and Content |
||||
|
||||
```tsx |
||||
<PanelChrome |
||||
title="My awesome panel title" |
||||
description="Here I will put a description that explains a bit more this panel" |
||||
width={400} |
||||
height={200} |
||||
> |
||||
{(innerwidth, innerheight) => { |
||||
return ( |
||||
<div |
||||
style={{ |
||||
width: innerwidth, |
||||
height: innerheight, |
||||
background: 'white', |
||||
display: 'flex', |
||||
alignItems: 'center', |
||||
justifyContent: 'center', |
||||
}} |
||||
> |
||||
New panel with old API |
||||
</div> |
||||
); |
||||
}} |
||||
</PanelChrome> |
||||
``` |
||||
|
||||
<Canvas> |
||||
<PanelChrome |
||||
title="My awesome panel title" |
||||
description="Here I will put a description that explains a bit more this panel" |
||||
width={400} |
||||
height={200} |
||||
> |
||||
{(innerwidth, innerheight) => { |
||||
return ( |
||||
<div |
||||
style={{ |
||||
width: innerwidth, |
||||
height: innerheight, |
||||
background: 'gray', |
||||
display: 'flex', |
||||
alignItems: 'center', |
||||
justifyContent: 'center', |
||||
}} |
||||
> |
||||
Content |
||||
</div> |
||||
); |
||||
}} |
||||
</PanelChrome> |
||||
</Canvas> |
||||
|
||||
### Menu: Standard & Hover |
||||
|
||||
```tsx |
||||
<PanelChrome |
||||
title="My awesome panel title" |
||||
hoverHeader={<true || false>} |
||||
menu={() => ( |
||||
<Menu> |
||||
<Menu.Item label="View" icon="eye" /> |
||||
<Menu.Item label="Edit" icon="edit" /> |
||||
<Menu.Item label="Share" icon="share-alt" /> |
||||
<Menu.Divider /> |
||||
<Menu.Item label="Remove" icon="trash-alt" /> |
||||
</Menu> |
||||
)} |
||||
description="Here I will put a description that explains a bit more this panel" |
||||
width={400} |
||||
height={200} |
||||
> |
||||
{(innerwidth, innerheight) => { |
||||
return ( |
||||
<div |
||||
style={{ |
||||
width: innerwidth, |
||||
height: innerheight, |
||||
background: 'white', |
||||
display: 'flex', |
||||
alignItems: 'center', |
||||
justifyContent: 'center', |
||||
}} |
||||
> |
||||
New panel with old API |
||||
</div> |
||||
); |
||||
}} |
||||
</PanelChrome> |
||||
``` |
||||
|
||||
<Canvas> |
||||
|
||||
<HorizontalGroup spacing="md" align="flex-start" wrap> |
||||
<PanelChrome |
||||
title="My awesome panel title" |
||||
menu={() => ( |
||||
<Menu> |
||||
<Menu.Item label="View" icon="eye" /> |
||||
<Menu.Item label="Edit" icon="edit" /> |
||||
<Menu.Item label="Share" icon="share-alt" /> |
||||
<Menu.Divider /> |
||||
<Menu.Item label="Remove" icon="trash-alt" /> |
||||
</Menu> |
||||
)} |
||||
description="Here I will put a description that explains a bit more this panel" |
||||
width={400} |
||||
height={200} |
||||
|
||||
> |
||||
|
||||
{(innerwidth, innerheight) => { |
||||
return ( |
||||
<div |
||||
style={{ |
||||
width: innerwidth, |
||||
height: innerheight, |
||||
background: 'gray', |
||||
display: 'flex', |
||||
alignItems: 'center', |
||||
justifyContent: 'center', |
||||
}} |
||||
> |
||||
Content with fixed header |
||||
</div> |
||||
); |
||||
}} |
||||
|
||||
</PanelChrome> |
||||
|
||||
<PanelChrome |
||||
title="My awesome panel title" |
||||
menu={() => ( |
||||
<Menu> |
||||
<Menu.Item label="View" icon="eye" /> |
||||
<Menu.Item label="Edit" icon="edit" /> |
||||
<Menu.Item label="Share" icon="share-alt" /> |
||||
<Menu.Divider /> |
||||
<Menu.Item label="Remove" icon="trash-alt" /> |
||||
</Menu> |
||||
)} |
||||
hoverHeader={true} |
||||
description="Here I will put a description that explains a bit more this panel" |
||||
width={400} |
||||
height={200} |
||||
|
||||
> |
||||
|
||||
{(innerwidth, innerheight) => { |
||||
return ( |
||||
<div |
||||
style={{ |
||||
width: innerwidth, |
||||
height: innerheight, |
||||
background: 'gray', |
||||
display: 'flex', |
||||
alignItems: 'center', |
||||
justifyContent: 'center', |
||||
}} |
||||
> |
||||
Content with hoverHeader=true |
||||
</div> |
||||
); |
||||
}} |
||||
|
||||
</PanelChrome> |
||||
</HorizontalGroup> |
||||
</Canvas> |
||||
|
||||
### States: Loading , Streaming, Error |
||||
|
||||
```tsx |
||||
<PanelChrome |
||||
title="My awesome panel title" |
||||
loadingState={<Loading.Loading || Loading.Streaming>} |
||||
statusMessage='Error text' |
||||
statusMessageOnClick={action('ErrorIndicator: onClick fired')} |
||||
width={400} |
||||
height={200} |
||||
> |
||||
{(innerwidth, innerheight) => { |
||||
return ( |
||||
<div |
||||
style={{ |
||||
width: innerwidth, |
||||
height: innerheight, |
||||
background: 'white', |
||||
display: 'flex', |
||||
alignItems: 'center', |
||||
justifyContent: 'center', |
||||
}} |
||||
> |
||||
New panel with old API |
||||
</div> |
||||
); |
||||
}} |
||||
</PanelChrome> |
||||
``` |
||||
|
||||
<Canvas> |
||||
|
||||
<HorizontalGroup spacing="md" align="flex-start" wrap> |
||||
<PanelChrome |
||||
title="My awesome panel title" |
||||
loadingState={LoadingState.Loading} |
||||
width={400} |
||||
height={200} |
||||
|
||||
> |
||||
|
||||
{(innerwidth, innerheight) => { |
||||
return ( |
||||
<div |
||||
style={{ |
||||
width: innerwidth, |
||||
height: innerheight, |
||||
background: 'gray', |
||||
display: 'flex', |
||||
alignItems: 'center', |
||||
justifyContent: 'center', |
||||
}} |
||||
> |
||||
Data is loading |
||||
</div> |
||||
); |
||||
}} |
||||
|
||||
</PanelChrome> |
||||
|
||||
<PanelChrome |
||||
title="My awesome panel title" |
||||
loadingState={LoadingState.Streaming} |
||||
width={400} |
||||
height={200} |
||||
> |
||||
|
||||
{(innerwidth, innerheight) => { |
||||
return ( |
||||
<div |
||||
style={{ |
||||
width: innerwidth, |
||||
height: innerheight, |
||||
background: 'gray', |
||||
display: 'flex', |
||||
alignItems: 'center', |
||||
justifyContent: 'center', |
||||
}} |
||||
> |
||||
Data is Streaming |
||||
</div> |
||||
); |
||||
}} |
||||
|
||||
</PanelChrome> |
||||
|
||||
<PanelChrome |
||||
title="My awesome panel title" |
||||
statusMessage='Error text' |
||||
statusMessageOnClick={action('ErrorIndicator: onClick fired')} |
||||
width={400} |
||||
height={200} |
||||
> |
||||
|
||||
{(innerwidth, innerheight) => { |
||||
return ( |
||||
<div |
||||
style={{ |
||||
width: innerwidth, |
||||
height: innerheight, |
||||
background: 'gray', |
||||
display: 'flex', |
||||
alignItems: 'center', |
||||
justifyContent: 'center', |
||||
}} |
||||
> |
||||
There is an error |
||||
</div> |
||||
); |
||||
}} |
||||
|
||||
</PanelChrome> |
||||
</HorizontalGroup> |
||||
</Canvas> |
||||
|
||||
### Extra options? Title Items |
||||
|
||||
```tsx |
||||
<PanelChrome |
||||
title="My awesome panel title" |
||||
titleItems={ |
||||
<div> |
||||
<Button fill="text" icon="github" variant="secondary" tooltip="extra content to render" /> |
||||
<Button fill="text" icon="sliders-v-alt" variant="secondary" tooltip="extra content2 to render" /> |
||||
</div> |
||||
} |
||||
description="Here I will put a description that explains a bit more this panel" |
||||
width={400} |
||||
height={200} |
||||
> |
||||
{(innerwidth, innerheight) => { |
||||
return ( |
||||
<div |
||||
style={{ |
||||
width: innerwidth, |
||||
height: innerheight, |
||||
background: 'white', |
||||
display: 'flex', |
||||
alignItems: 'center', |
||||
justifyContent: 'center', |
||||
}} |
||||
> |
||||
New panel with old API |
||||
</div> |
||||
); |
||||
}} |
||||
</PanelChrome> |
||||
``` |
||||
|
||||
<Canvas> |
||||
<PanelChrome |
||||
title="My awesome panel title" |
||||
description="Here I will put a description that explains a bit more this panel" |
||||
titleItems={ |
||||
<div> |
||||
<Button fill="text" icon="github" variant="secondary" tooltip="extra content to render" /> |
||||
<Button fill="text" icon="sliders-v-alt" variant="secondary" tooltip="extra content2 to render" /> |
||||
</div> |
||||
} |
||||
width={400} |
||||
height={200} |
||||
> |
||||
{(innerwidth, innerheight) => { |
||||
return ( |
||||
<div |
||||
style={{ |
||||
width: innerwidth, |
||||
height: innerheight, |
||||
background: 'gray', |
||||
display: 'flex', |
||||
alignItems: 'center', |
||||
justifyContent: 'center', |
||||
}} |
||||
> |
||||
Content |
||||
</div> |
||||
); |
||||
}} |
||||
</PanelChrome> |
||||
</Canvas> |
||||
|
||||
### Migration from old PanelChrome (before v9.4.0) |
||||
|
||||
#### Before |
||||
|
||||
```tsx |
||||
<PanelChrome |
||||
title="My awesome panel title" |
||||
leftItems={[<PanelChrome.LoadingIndicator loading={isRefreshing} onCancel={onCancelQuery} key="loading-indicator" />]} |
||||
width={400} |
||||
height={200} |
||||
> |
||||
{(innerwidth, innerheight) => { |
||||
return ( |
||||
<div |
||||
style={{ |
||||
width: innerwidth, |
||||
height: innerheight, |
||||
background: 'white', |
||||
display: 'flex', |
||||
alignItems: 'center', |
||||
justifyContent: 'center', |
||||
}} |
||||
> |
||||
New panel with old API |
||||
</div> |
||||
); |
||||
}} |
||||
</PanelChrome> |
||||
``` |
||||
|
||||
<Canvas> |
||||
<PanelChrome |
||||
title="My awesome panel title" |
||||
leftItems={[ |
||||
<PanelChrome.LoadingIndicator |
||||
loading={true} |
||||
onCancel={action('CancelQuery: onClick fired')} |
||||
key="loading-indicator" |
||||
/>, |
||||
]} |
||||
width={400} |
||||
height={200} |
||||
> |
||||
{(innerwidth, innerheight) => { |
||||
return ( |
||||
<div |
||||
style={{ |
||||
width: innerwidth, |
||||
height: innerheight, |
||||
background: 'gray', |
||||
display: 'flex', |
||||
alignItems: 'center', |
||||
justifyContent: 'center', |
||||
}} |
||||
> |
||||
Content |
||||
</div> |
||||
); |
||||
}} |
||||
</PanelChrome> |
||||
</Canvas> |
||||
#### After |
||||
|
||||
```tsx |
||||
<PanelChrome |
||||
title="My awesome panel title" |
||||
loadingState={LoadingState.Loading} |
||||
onCancelQuery={onCancelQuery} |
||||
width={400} |
||||
height={200} |
||||
> |
||||
{(innerwidth, innerheight) => { |
||||
return ( |
||||
<div |
||||
style={{ |
||||
width: innerwidth, |
||||
height: innerheight, |
||||
background: 'white', |
||||
display: 'flex', |
||||
alignItems: 'center', |
||||
justifyContent: 'center', |
||||
}} |
||||
> |
||||
New panel with old API |
||||
</div> |
||||
); |
||||
}} |
||||
</PanelChrome> |
||||
``` |
||||
|
||||
<Canvas> |
||||
<PanelChrome |
||||
title="My awesome panel title" |
||||
loadingState={LoadingState.Loading} |
||||
onCancelQuery={action('CancelQuery: onClick fired')} |
||||
width={400} |
||||
height={200} |
||||
> |
||||
{(innerwidth, innerheight) => { |
||||
return ( |
||||
<div |
||||
style={{ |
||||
width: innerwidth, |
||||
height: innerheight, |
||||
background: 'gray', |
||||
display: 'flex', |
||||
alignItems: 'center', |
||||
justifyContent: 'center', |
||||
}} |
||||
> |
||||
Content |
||||
</div> |
||||
); |
||||
}} |
||||
</PanelChrome> |
||||
</Canvas> |
Loading…
Reference in new issue