Skip to content

Commit 86ae30f

Browse files
author
Antoine THEBAUD
committed
[ENHANCEMENT] Make panel display attribute optional
Signed-off-by: Antoine THEBAUD <[email protected]>
1 parent 330dc5b commit 86ae30f

File tree

4 files changed

+28
-10
lines changed

4 files changed

+28
-10
lines changed

dashboards/src/components/Panel/Panel.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,8 +225,8 @@ export const Panel = memo(function Panel(props: PanelProps) {
225225
<PanelHeader
226226
extra={panelOptions?.extra?.({ panelDefinition: definition, panelGroupItemId })}
227227
id={headerId}
228-
title={definition.spec.display.name}
229-
description={definition.spec.display.description}
228+
title={definition.spec.display?.name}
229+
description={definition.spec.display?.description}
230230
queryResults={queryResults}
231231
readHandlers={readHandlers}
232232
editHandlers={editHandlers}

dashboards/src/components/Panel/PanelHeader.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ type OmittedProps = 'children' | 'action' | 'title' | 'disableTypography';
2424

2525
export interface PanelHeaderProps extends Omit<CardHeaderProps, OmittedProps> {
2626
id: string;
27-
title: string;
27+
title?: string;
2828
description?: string;
2929
links?: Link[];
3030
extra?: ReactNode;

dashboards/src/components/PanelDrawer/PanelEditorForm.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,23 @@ export function PanelEditorForm(props: PanelEditorFormProps): ReactElement {
8787
// - update action: ask for discard approval if changed
8888
// - read action: don´t ask for discard approval
8989
function handleCancel(): void {
90-
if (JSON.stringify(initialValues) !== JSON.stringify(form.getValues())) {
90+
const currentValues = form.getValues();
91+
92+
// Normalize display: if both name and description are undefined, set display to undefined
93+
const normalizeDisplay = (values: PanelEditorValues): PanelEditorValues => {
94+
if (
95+
values.panelDefinition.spec.display?.name === undefined &&
96+
values.panelDefinition.spec.display?.description === undefined
97+
) {
98+
values.panelDefinition.spec.display = undefined;
99+
}
100+
return values;
101+
};
102+
103+
const normalizedInitial = normalizeDisplay(JSON.parse(JSON.stringify(initialValues)));
104+
const normalizedCurrent = normalizeDisplay(JSON.parse(JSON.stringify(currentValues)));
105+
106+
if (JSON.stringify(normalizedInitial) !== JSON.stringify(normalizedCurrent)) {
91107
setDiscardDialogOpened(true);
92108
} else {
93109
onClose();
@@ -145,7 +161,6 @@ export function PanelEditorForm(props: PanelEditorFormProps): ReactElement {
145161
render={({ field, fieldState }) => (
146162
<TextField
147163
{...field}
148-
required
149164
fullWidth
150165
label="Name"
151166
error={!!fieldState.error}

dashboards/src/components/PanelDrawer/usePanelEditor.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@ export const usePanelEditor: (panelDefinition: PanelDefinition) => UsePanelEdito
3232
panelDefinition: PanelDefinition
3333
) => {
3434
const { display, plugin: pluginDefinition, queries: initialQueries, links: initialLinks } = panelDefinition.spec;
35-
const [name, setName] = useState(display.name);
36-
const [description, setDescription] = useState(display.description);
35+
// Provide default display object if undefined
36+
const displayData = display ?? { name: undefined, description: undefined };
37+
const [name, setName] = useState(displayData.name);
38+
const [description, setDescription] = useState(displayData.description);
3739
const [links, setLinks] = useState(initialLinks);
3840
const [plugin, setPlugin] = useState(pluginDefinition);
3941

@@ -61,8 +63,9 @@ export const usePanelEditor: (panelDefinition: PanelDefinition) => UsePanelEdito
6163
const setPanelDefinition = useCallback(
6264
(panelDefinition: PanelDefinition) => {
6365
const { display, plugin, queries, links } = panelDefinition.spec;
64-
setName(display.name);
65-
setDescription(display.description);
66+
const displayData = display ?? { name: undefined, description: undefined };
67+
setName(displayData.name);
68+
setDescription(displayData.description);
6669
setLinks(links);
6770
setPlugin(plugin);
6871
setQueries(queries);
@@ -75,7 +78,7 @@ export const usePanelEditor: (panelDefinition: PanelDefinition) => UsePanelEdito
7578
panelDefinition: {
7679
kind: 'Panel',
7780
spec: {
78-
display: { name, description },
81+
display: name !== undefined || description !== undefined ? { name, description } : undefined,
7982
plugin,
8083
queries: currentQueries,
8184
links,

0 commit comments

Comments
 (0)