mirror of https://github.com/grafana/grafana.git
Dynamic Dashboards: Add repeat responsive items (#102440)
This commit is contained in:
parent
06545aa770
commit
3ddfa3229a
|
@ -71,19 +71,12 @@ export class VizPanelEditableElement implements EditableDashboardElement, BulkAc
|
|||
);
|
||||
}, [panel]);
|
||||
|
||||
const layoutCategory = useMemo(() => {
|
||||
if (isDashboardLayoutItem(layoutElement) && layoutElement.getOptions) {
|
||||
return layoutElement.getOptions();
|
||||
}
|
||||
return undefined;
|
||||
}, [layoutElement]);
|
||||
const layoutCategories = useMemo(
|
||||
() => (isDashboardLayoutItem(layoutElement) && layoutElement.getOptions ? layoutElement.getOptions() : []),
|
||||
[layoutElement]
|
||||
);
|
||||
|
||||
const categories = [panelOptions];
|
||||
if (layoutCategory) {
|
||||
categories.push(layoutCategory);
|
||||
}
|
||||
|
||||
return categories;
|
||||
return [panelOptions, ...layoutCategories];
|
||||
}
|
||||
|
||||
public onDelete() {
|
||||
|
|
|
@ -84,8 +84,8 @@ export function getPanelFrameOptions(panel: VizPanel): OptionsPaneCategoryDescri
|
|||
)
|
||||
);
|
||||
|
||||
if (isDashboardLayoutItem(layoutElement) && layoutElement.getOptions) {
|
||||
descriptor.addCategory(layoutElement.getOptions());
|
||||
if (isDashboardLayoutItem(layoutElement)) {
|
||||
layoutElement.getOptions?.().forEach((category) => descriptor.addCategory(category));
|
||||
}
|
||||
|
||||
return descriptor;
|
||||
|
|
|
@ -86,7 +86,7 @@ export class DashboardGridItem
|
|||
return this.state.variableName ? 'panel-repeater-grid-item' : '';
|
||||
}
|
||||
|
||||
public getOptions(): OptionsPaneCategoryDescriptor {
|
||||
public getOptions(): OptionsPaneCategoryDescriptor[] {
|
||||
return getDashboardGridItemOptions(this);
|
||||
}
|
||||
|
||||
|
|
|
@ -8,14 +8,13 @@ import { RepeatRowSelect2 } from 'app/features/dashboard/components/RepeatRowSel
|
|||
|
||||
import { DashboardGridItem } from './DashboardGridItem';
|
||||
|
||||
export function getDashboardGridItemOptions(gridItem: DashboardGridItem): OptionsPaneCategoryDescriptor {
|
||||
const category = new OptionsPaneCategoryDescriptor({
|
||||
export function getDashboardGridItemOptions(gridItem: DashboardGridItem): OptionsPaneCategoryDescriptor[] {
|
||||
const repeatCategory = new OptionsPaneCategoryDescriptor({
|
||||
title: t('dashboard.default-layout.item-options.repeat.title', 'Repeat options'),
|
||||
id: 'Repeat options',
|
||||
isOpenDefault: false,
|
||||
});
|
||||
|
||||
category.addItem(
|
||||
})
|
||||
.addItem(
|
||||
new OptionsPaneItemDescriptor({
|
||||
title: t('dashboard.default-layout.item-options.repeat.variable.title', 'Repeat by variable'),
|
||||
description: t(
|
||||
|
@ -24,9 +23,8 @@ export function getDashboardGridItemOptions(gridItem: DashboardGridItem): Option
|
|||
),
|
||||
render: () => <RepeatByOption gridItem={gridItem} />,
|
||||
})
|
||||
);
|
||||
|
||||
category.addItem(
|
||||
)
|
||||
.addItem(
|
||||
new OptionsPaneItemDescriptor({
|
||||
title: t('dashboard.default-layout.item-options.repeat.direction.title', 'Repeat direction'),
|
||||
useShowIf: () => {
|
||||
|
@ -35,9 +33,8 @@ export function getDashboardGridItemOptions(gridItem: DashboardGridItem): Option
|
|||
},
|
||||
render: () => <RepeatDirectionOption gridItem={gridItem} />,
|
||||
})
|
||||
);
|
||||
|
||||
category.addItem(
|
||||
)
|
||||
.addItem(
|
||||
new OptionsPaneItemDescriptor({
|
||||
title: t('dashboard.default-layout.item-options.repeat.max', 'Max per row'),
|
||||
useShowIf: () => {
|
||||
|
@ -48,7 +45,7 @@ export function getDashboardGridItemOptions(gridItem: DashboardGridItem): Option
|
|||
})
|
||||
);
|
||||
|
||||
return category;
|
||||
return [repeatCategory];
|
||||
}
|
||||
|
||||
interface OptionComponentProps {
|
||||
|
|
|
@ -65,7 +65,7 @@ export class ResponsiveGridItem extends SceneObjectBase<ResponsiveGridItemState>
|
|||
};
|
||||
}
|
||||
|
||||
public getOptions(): OptionsPaneCategoryDescriptor {
|
||||
public getOptions(): OptionsPaneCategoryDescriptor[] {
|
||||
return getOptions(this);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,9 +1,42 @@
|
|||
import { t } from 'app/core/internationalization';
|
||||
import { OptionsPaneCategoryDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneCategoryDescriptor';
|
||||
import { OptionsPaneItemDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneItemDescriptor';
|
||||
import { RepeatRowSelect2 } from 'app/features/dashboard/components/RepeatRowSelect/RepeatRowSelect';
|
||||
|
||||
import { useConditionalRenderingEditor } from '../../conditional-rendering/ConditionalRenderingEditor';
|
||||
|
||||
import { ResponsiveGridItem } from './ResponsiveGridItem';
|
||||
|
||||
export function getOptions(model: ResponsiveGridItem): OptionsPaneCategoryDescriptor {
|
||||
return useConditionalRenderingEditor(model.state.conditionalRendering)!;
|
||||
export function getOptions(model: ResponsiveGridItem): OptionsPaneCategoryDescriptor[] {
|
||||
const repeatCategory = new OptionsPaneCategoryDescriptor({
|
||||
title: t('dashboard.responsive-layout.item-options.repeat.title', 'Repeat options'),
|
||||
id: 'repeat-options',
|
||||
isOpenDefault: false,
|
||||
}).addItem(
|
||||
new OptionsPaneItemDescriptor({
|
||||
title: t('dashboard.responsive-layout.item-options.repeat.variable.title', 'Repeat by variable'),
|
||||
description: t(
|
||||
'dashboard.responsive-layout.item-options.repeat.variable.description',
|
||||
'Repeat this panel for each value in the selected variable. This is not visible while in edit mode. You need to go back to dashboard and then update the variable or reload the dashboard.'
|
||||
),
|
||||
render: () => <RepeatByOption item={model} />,
|
||||
})
|
||||
);
|
||||
|
||||
const conditionalRenderingCategory = useConditionalRenderingEditor(model.state.conditionalRendering)!;
|
||||
|
||||
return [repeatCategory, conditionalRenderingCategory];
|
||||
}
|
||||
|
||||
function RepeatByOption({ item }: { item: ResponsiveGridItem }) {
|
||||
const { variableName } = item.useState();
|
||||
|
||||
return (
|
||||
<RepeatRowSelect2
|
||||
id="repeat-by-variable-select"
|
||||
sceneContext={item}
|
||||
repeat={variableName}
|
||||
onChange={(value?: string) => item.setRepeatByVariable(value)}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
|
|
@ -19,48 +19,61 @@ import { RowItem } from './RowItem';
|
|||
|
||||
export function getEditOptions(model: RowItem): OptionsPaneCategoryDescriptor[] {
|
||||
const { layout } = model.useState();
|
||||
const rowOptions = useMemo(() => {
|
||||
const editPaneHeaderOptions = new OptionsPaneCategoryDescriptor({ title: '', id: 'row-options' })
|
||||
|
||||
const rowCategory = useMemo(
|
||||
() =>
|
||||
new OptionsPaneCategoryDescriptor({ title: '', id: 'row-options' })
|
||||
.addItem(
|
||||
new OptionsPaneItemDescriptor({
|
||||
title: t('dashboard.rows-layout.option.title', 'Title'),
|
||||
title: t('dashboard.rows-layout.row-options.row.title', 'Title'),
|
||||
render: () => <RowTitleInput row={model} />,
|
||||
})
|
||||
)
|
||||
.addItem(
|
||||
new OptionsPaneItemDescriptor({
|
||||
title: t('dashboard.rows-layout.option.height', 'Height'),
|
||||
title: t('dashboard.rows-layout.row-options.row.height', 'Height'),
|
||||
render: () => <RowHeightSelect row={model} />,
|
||||
})
|
||||
);
|
||||
|
||||
editPaneHeaderOptions
|
||||
.addItem(
|
||||
new OptionsPaneItemDescriptor({
|
||||
title: t('dashboard.rows-layout.option.repeat', 'Repeat for'),
|
||||
render: () => <RowRepeatSelect row={model} />,
|
||||
})
|
||||
)
|
||||
.addItem(
|
||||
new OptionsPaneItemDescriptor({
|
||||
title: t('dashboard.rows-layout.option.hide-header', 'Hide row header'),
|
||||
title: t('dashboard.rows-layout.row-options.row.hide-header', 'Hide row header'),
|
||||
render: () => <RowHeaderSwitch row={model} />,
|
||||
})
|
||||
),
|
||||
[model]
|
||||
);
|
||||
|
||||
return editPaneHeaderOptions;
|
||||
}, [model]);
|
||||
const repeatCategory = useMemo(
|
||||
() =>
|
||||
new OptionsPaneCategoryDescriptor({
|
||||
title: t('dashboard.rows-layout.row-options.repeat.title', 'Repeat options'),
|
||||
id: 'repeat-options',
|
||||
isOpenDefault: false,
|
||||
}).addItem(
|
||||
new OptionsPaneItemDescriptor({
|
||||
title: t('dashboard.rows-layout.row-options.repeat.variable.title', 'Repeat by variable'),
|
||||
description: t(
|
||||
'dashboard.rows-layout.row-options.repeat.variable.description',
|
||||
'Repeat this row for each value in the selected variable.'
|
||||
),
|
||||
render: () => <RowRepeatSelect row={model} />,
|
||||
})
|
||||
),
|
||||
[model]
|
||||
);
|
||||
|
||||
const layoutCategory = useLayoutCategory(layout);
|
||||
|
||||
const conditionalRenderingOptions = useMemo(() => {
|
||||
return useConditionalRenderingEditor(model.state.conditionalRendering);
|
||||
}, [model]);
|
||||
const editOptions = [rowCategory, layoutCategory, repeatCategory];
|
||||
|
||||
const editOptions = [rowOptions, layoutCategory];
|
||||
const conditionalRenderingCategory = useMemo(
|
||||
() => useConditionalRenderingEditor(model.state.conditionalRendering),
|
||||
[model]
|
||||
);
|
||||
|
||||
if (conditionalRenderingOptions) {
|
||||
editOptions.push(conditionalRenderingOptions);
|
||||
if (conditionalRenderingCategory) {
|
||||
editOptions.push(conditionalRenderingCategory);
|
||||
}
|
||||
|
||||
return editOptions;
|
||||
|
|
|
@ -11,19 +11,22 @@ import { useEditPaneInputAutoFocus } from '../layouts-shared/utils';
|
|||
import { TabItem } from './TabItem';
|
||||
|
||||
export function getEditOptions(model: TabItem): OptionsPaneCategoryDescriptor[] {
|
||||
const tabOptions = useMemo(() => {
|
||||
return new OptionsPaneCategoryDescriptor({ title: '', id: 'tab-item-options' }).addItem(
|
||||
const { layout } = model.useState();
|
||||
|
||||
const tabCategory = useMemo(
|
||||
() =>
|
||||
new OptionsPaneCategoryDescriptor({ title: '', id: 'tab-item-options' }).addItem(
|
||||
new OptionsPaneItemDescriptor({
|
||||
title: t('dashboard.tabs-layout.tab-options.title-option', 'Title'),
|
||||
render: () => <TabTitleInput tab={model} />,
|
||||
})
|
||||
),
|
||||
[model]
|
||||
);
|
||||
}, [model]);
|
||||
|
||||
const { layout } = model.useState();
|
||||
const layoutOptions = useLayoutCategory(layout);
|
||||
const layoutCategory = useLayoutCategory(layout);
|
||||
|
||||
return [tabOptions, layoutOptions];
|
||||
return [tabCategory, layoutCategory];
|
||||
}
|
||||
|
||||
function TabTitleInput({ tab }: { tab: TabItem }) {
|
||||
|
|
|
@ -30,7 +30,7 @@ export interface DashboardLayoutItem extends SceneObject {
|
|||
/**
|
||||
* Return layout item options (like repeat, repeat direction, etc. for the default DashboardGridItem)
|
||||
*/
|
||||
getOptions?(): OptionsPaneCategoryDescriptor;
|
||||
getOptions?(): OptionsPaneCategoryDescriptor[];
|
||||
|
||||
/**
|
||||
* When going into panel edit
|
||||
|
|
|
@ -1439,6 +1439,15 @@
|
|||
},
|
||||
"responsive-layout": {
|
||||
"description": "Panels resize to fit and form uniform grids",
|
||||
"item-options": {
|
||||
"repeat": {
|
||||
"title": "Repeat options",
|
||||
"variable": {
|
||||
"description": "Repeat this panel for each value in the selected variable. This is not visible while in edit mode. You need to go back to dashboard and then update the variable or reload the dashboard.",
|
||||
"title": "Repeat by variable"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Auto grid",
|
||||
"options": {
|
||||
"columns": "Columns",
|
||||
|
@ -1453,12 +1462,6 @@
|
|||
"rows-layout": {
|
||||
"description": "Collapsable panel groups with headings",
|
||||
"name": "Rows",
|
||||
"option": {
|
||||
"height": "Height",
|
||||
"hide-header": "Hide row header",
|
||||
"repeat": "Repeat for",
|
||||
"title": "Title"
|
||||
},
|
||||
"options": {
|
||||
"height-expand": "Expand",
|
||||
"height-min": "Min"
|
||||
|
@ -1482,6 +1485,18 @@
|
|||
}
|
||||
},
|
||||
"row-options": {
|
||||
"repeat": {
|
||||
"title": "Repeat options",
|
||||
"variable": {
|
||||
"description": "Repeat this row for each value in the selected variable.",
|
||||
"title": "Repeat by variable"
|
||||
}
|
||||
},
|
||||
"row": {
|
||||
"height": "Height",
|
||||
"hide-header": "Hide row header",
|
||||
"title": "Title"
|
||||
},
|
||||
"title-option": "Title"
|
||||
}
|
||||
},
|
||||
|
|
Loading…
Reference in New Issue