Skip to content

Commit 417ff40

Browse files
author
Antoine THEBAUD
committed
[ENHANCEMENT] Make panel display attribute optional
Signed-off-by: Antoine THEBAUD <antoine.thebaud@amadeus.com>
1 parent 330dc5b commit 417ff40

File tree

3 files changed

+33
-10
lines changed

3 files changed

+33
-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/PanelDrawer/PanelEditorForm.tsx

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ export function PanelEditorForm(props: PanelEditorFormProps): ReactElement {
4444
const { plugin } = panelDefinition.spec;
4545
const [isDiscardDialogOpened, setDiscardDialogOpened] = useState<boolean>(false);
4646

47+
// Ensure display is initialized (can be undefined)
48+
const displayData = panelDefinition.spec.display ?? { name: undefined, description: undefined };
49+
4750
const { panelEditorSchema } = useValidationSchemas();
4851
const form = useForm<PanelEditorValues>({
4952
resolver: zodResolver(panelEditorSchema),
@@ -87,7 +90,21 @@ export function PanelEditorForm(props: PanelEditorFormProps): ReactElement {
8790
// - update action: ask for discard approval if changed
8891
// - read action: don´t ask for discard approval
8992
function handleCancel(): void {
90-
if (JSON.stringify(initialValues) !== JSON.stringify(form.getValues())) {
93+
const currentValues = form.getValues();
94+
95+
// Normalize display: if both name and description are undefined, set display to undefined
96+
const normalizeDisplay = (values: PanelEditorValues) => {
97+
if (values.panelDefinition.spec.display?.name === undefined &&
98+
values.panelDefinition.spec.display?.description === undefined) {
99+
values.panelDefinition.spec.display = undefined;
100+
}
101+
return values;
102+
};
103+
104+
const normalizedInitial = normalizeDisplay(JSON.parse(JSON.stringify(initialValues)));
105+
const normalizedCurrent = normalizeDisplay(JSON.parse(JSON.stringify(currentValues)));
106+
107+
if (JSON.stringify(normalizedInitial) !== JSON.stringify(normalizedCurrent)) {
91108
setDiscardDialogOpened(true);
92109
} else {
93110
onClose();
@@ -111,6 +128,10 @@ export function PanelEditorForm(props: PanelEditorFormProps): ReactElement {
111128
const watchedDescription = useWatch({ control: form.control, name: 'panelDefinition.spec.display.description' });
112129
const watchedPluginKind = useWatch({ control: form.control, name: 'panelDefinition.spec.plugin.kind' });
113130

131+
// Handle undefined display for rendering purposes
132+
const displayName = displayData.name;
133+
const displayDescription = displayData.description;
134+
114135
const handleSubmit = useCallback(() => {
115136
form.handleSubmit(processForm)();
116137
}, [form, processForm]);
@@ -145,7 +166,6 @@ export function PanelEditorForm(props: PanelEditorFormProps): ReactElement {
145166
render={({ field, fieldState }) => (
146167
<TextField
147168
{...field}
148-
required
149169
fullWidth
150170
label="Name"
151171
error={!!fieldState.error}
@@ -196,7 +216,7 @@ export function PanelEditorForm(props: PanelEditorFormProps): ReactElement {
196216
label="Description"
197217
error={!!fieldState.error}
198218
helperText={fieldState.error?.message}
199-
value={watchedDescription ?? ''}
219+
value={displayDescription ?? ''}
200220
onChange={(event) => {
201221
field.onChange(event);
202222
setDescription(event.target.value);

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)