mirror of https://github.com/grafana/grafana
New Editor: add display modes to fix ratio with actual display (#22032)
* add mode picker * ratio cleanup * add siebar toggle * use secondary button * use cog icon * cleanup * full to fill * Portaling for Select * Centering container for panel edit * Panel editor tabs Co-authored-by: Dominik Prokop <dominik.prokop@grafana.com>pull/22046/head
parent
88922ea4ee
commit
e9c6c040da
@ -0,0 +1,70 @@ |
||||
import React, { useState } from 'react'; |
||||
import { css } from 'emotion'; |
||||
import AutoSizer from 'react-virtualized-auto-sizer'; |
||||
import useMeasure from 'react-use/lib/useMeasure'; |
||||
import { TabsBar, Tab, stylesFactory, TabContent } from '@grafana/ui'; |
||||
import { EditorTab, allTabs } from './types'; |
||||
import { DashboardModel } from '../../state'; |
||||
import { QueriesTab } from '../../panel_editor/QueriesTab'; |
||||
import { PanelModel } from '../../state/PanelModel'; |
||||
|
||||
interface PanelEditorTabsProps { |
||||
panel: PanelModel; |
||||
dashboard: DashboardModel; |
||||
} |
||||
|
||||
const getPanelEditorTabsStyles = stylesFactory(() => { |
||||
return { |
||||
wrapper: css` |
||||
display: flex; |
||||
flex-direction: column; |
||||
height: 100%; |
||||
`,
|
||||
content: css` |
||||
flex-grow: 1; |
||||
`,
|
||||
}; |
||||
}); |
||||
export const PanelEditorTabs: React.FC<PanelEditorTabsProps> = ({ panel, dashboard }) => { |
||||
const [activeTab, setActiveTab] = useState(EditorTab.Query); |
||||
const [tabsBarRef, tabsBarMeasurements] = useMeasure(); |
||||
const styles = getPanelEditorTabsStyles(); |
||||
|
||||
return ( |
||||
<div className={styles.wrapper}> |
||||
<div> |
||||
<TabsBar ref={tabsBarRef}> |
||||
{allTabs.map(t => { |
||||
if (t.show(panel)) { |
||||
return ( |
||||
<Tab |
||||
label={t.label} |
||||
active={activeTab === t.tab} |
||||
onChangeTab={() => { |
||||
setActiveTab(t.tab); |
||||
}} |
||||
/> |
||||
); |
||||
} |
||||
return null; |
||||
})} |
||||
</TabsBar> |
||||
</div> |
||||
<div style={{ flexGrow: 1 }}> |
||||
<TabContent style={{ height: `calc(100% - ${tabsBarMeasurements.height}px)` }}> |
||||
<AutoSizer> |
||||
{({ width, height }) => { |
||||
return ( |
||||
<div style={{ width, height }}> |
||||
{activeTab === EditorTab.Query && <QueriesTab panel={panel} dashboard={dashboard} />} |
||||
{activeTab === EditorTab.Alerts && <div>TODO: Show Alerts</div>} |
||||
{activeTab === EditorTab.Transform && <div>TODO: Show Transform</div>} |
||||
</div> |
||||
); |
||||
}} |
||||
</AutoSizer> |
||||
</TabContent> |
||||
</div> |
||||
</div> |
||||
); |
||||
}; |
@ -0,0 +1,25 @@ |
||||
import { PanelModel } from '../../state/PanelModel'; |
||||
|
||||
export enum DisplayMode { |
||||
Fill = 0, |
||||
Fit = 1, |
||||
Exact = 2, |
||||
} |
||||
|
||||
export const displayModes = [ |
||||
{ value: DisplayMode.Fill, label: 'Fill', description: 'Use all avaliable space' }, |
||||
{ value: DisplayMode.Fit, label: 'Fit', description: 'Fit in the space keeping ratio' }, |
||||
{ value: DisplayMode.Exact, label: 'Exact', description: 'Same size as the dashboard' }, |
||||
]; |
||||
|
||||
export enum EditorTab { |
||||
Query = 'query', |
||||
Alerts = 'alerts', |
||||
Transform = 'xform', |
||||
} |
||||
|
||||
export const allTabs = [ |
||||
{ tab: EditorTab.Query, label: 'Query', show: (panel: PanelModel) => true }, |
||||
{ tab: EditorTab.Alerts, label: 'Alerts', show: (panel: PanelModel) => true }, |
||||
{ tab: EditorTab.Transform, label: 'Transform', show: (panel: PanelModel) => true }, |
||||
]; |
Loading…
Reference in new issue