@@ -14,6 +14,7 @@ import { MetricAggregation } from 'types/api/v5/queryRange';
1414import { DataSource , ReduceOperators } from 'types/common/queryBuilder' ;
1515
1616import HavingFilter from './HavingFilter/HavingFilter' ;
17+ import { buildDefaultLegendFromGroupBy } from './utils' ;
1718
1819import './QueryAddOns.styles.scss' ;
1920
@@ -250,12 +251,33 @@ function QueryAddOns({
250251 } , [ panelType , isListViewPanel , query , showReduceTo ] ) ;
251252
252253 const handleOptionClick = ( e : RadioChangeEvent ) : void => {
253- if ( selectedViews . find ( ( view ) => view . key === e . target . value . key ) ) {
254- setSelectedViews (
255- selectedViews . filter ( ( view ) => view . key !== e . target . value . key ) ,
254+ const clickedAddOn = e . target . value as AddOn ;
255+ const isAlreadySelected = selectedViews . some (
256+ ( view ) => view . key === clickedAddOn . key ,
257+ ) ;
258+
259+ if ( isAlreadySelected ) {
260+ setSelectedViews ( ( prev ) =>
261+ prev . filter ( ( view ) => view . key !== clickedAddOn . key ) ,
256262 ) ;
257263 } else {
258- setSelectedViews ( [ ...selectedViews , e . target . value ] ) ;
264+ // When enabling Legend format for the first time with an empty legend
265+ // and existing group-by keys, prefill the legend using all group-by keys.
266+ // This keeps existing custom legends intact and only helps seed a sensible default.
267+ if (
268+ clickedAddOn . key === ADD_ONS_KEYS . LEGEND_FORMAT &&
269+ isEmpty ( query ?. legend ) &&
270+ Array . isArray ( query . groupBy ) &&
271+ query . groupBy . length > 0
272+ ) {
273+ const defaultLegend = buildDefaultLegendFromGroupBy ( query . groupBy ) ;
274+
275+ if ( defaultLegend ) {
276+ handleChangeQueryLegend ( defaultLegend ) ;
277+ }
278+ }
279+
280+ setSelectedViews ( ( prev ) => [ ...prev , clickedAddOn ] ) ;
259281 }
260282 } ;
261283
@@ -288,12 +310,9 @@ function QueryAddOns({
288310 [ handleSetQueryData , index , query ] ,
289311 ) ;
290312
291- const handleRemoveView = useCallback (
292- ( key : string ) : void => {
293- setSelectedViews ( selectedViews . filter ( ( view ) => view . key !== key ) ) ;
294- } ,
295- [ selectedViews ] ,
296- ) ;
313+ const handleRemoveView = useCallback ( ( key : string ) : void => {
314+ setSelectedViews ( ( prev ) => prev . filter ( ( view ) => view . key !== key ) ) ;
315+ } , [ ] ) ;
297316
298317 const handleChangeQueryLegend = useCallback (
299318 ( value : string ) => {
@@ -379,8 +398,8 @@ function QueryAddOns({
379398 < div className = "input" >
380399 < HavingFilter
381400 onClose = { ( ) : void => {
382- setSelectedViews (
383- selectedViews . filter ( ( view ) => view . key !== 'having' ) ,
401+ setSelectedViews ( ( prev ) =>
402+ prev . filter ( ( view ) => view . key !== 'having' ) ,
384403 ) ;
385404 } }
386405 onChange = { handleChangeHaving }
@@ -399,7 +418,9 @@ function QueryAddOns({
399418 initialValue = { query ?. limit ?? undefined }
400419 placeholder = "Enter limit"
401420 onClose = { ( ) : void => {
402- setSelectedViews ( selectedViews . filter ( ( view ) => view . key !== 'limit' ) ) ;
421+ setSelectedViews ( ( prev ) =>
422+ prev . filter ( ( view ) => view . key !== 'limit' ) ,
423+ ) ;
403424 } }
404425 closeIcon = { < ChevronUp size = { 16 } /> }
405426 />
@@ -482,8 +503,8 @@ function QueryAddOns({
482503 onChange = { handleChangeQueryLegend }
483504 initialValue = { isEmpty ( query ?. legend ) ? undefined : query ?. legend }
484505 onClose = { ( ) : void => {
485- setSelectedViews (
486- selectedViews . filter ( ( view ) => view . key !== 'legend_format' ) ,
506+ setSelectedViews ( ( prev ) =>
507+ prev . filter ( ( view ) => view . key !== 'legend_format' ) ,
487508 ) ;
488509 } }
489510 closeIcon = { < ChevronUp size = { 16 } /> }
0 commit comments