Skip to content

Commit 9d5c692

Browse files
authored
fix(dashboards): auto select first widget in library (#91754)
When we open the widget library, we've now autoselected the first widget in the library. This should work on the "add widget" button and the breadcrumbs backlink.
1 parent cb103d0 commit 9d5c692

File tree

3 files changed

+18
-18
lines changed

3 files changed

+18
-18
lines changed

static/app/views/dashboards/detail.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ import {convertWidgetToBuilderStateParams} from 'sentry/views/dashboards/widgetB
7070
import {getDefaultWidget} from 'sentry/views/dashboards/widgetBuilder/utils/getDefaultWidget';
7171
import {DATA_SET_TO_WIDGET_TYPE} from 'sentry/views/dashboards/widgetBuilder/widgetBuilder';
7272
import WidgetLegendNameEncoderDecoder from 'sentry/views/dashboards/widgetLegendNameEncoderDecoder';
73+
import {getTopNConvertedDefaultWidgets} from 'sentry/views/dashboards/widgetLibrary/data';
7374
import {generatePerformanceEventView} from 'sentry/views/performance/data';
7475
import {MetricsDataSwitcher} from 'sentry/views/performance/landing/metricsDataSwitcher';
7576
import {MetricsDataSwitcherAlert} from 'sentry/views/performance/landing/metricsDataSwitcherAlert';
@@ -675,14 +676,18 @@ class DashboardDetail extends Component<Props, State> {
675676
if (!defined(dashboardId)) {
676677
pathname = `/organizations/${organization.slug}/dashboards/new/widget-builder/widget/new/`;
677678
}
679+
680+
const defaultLibraryWidget = getTopNConvertedDefaultWidgets(organization)[0];
678681
navigate(
679682
normalizeUrl({
680683
// TODO: Replace with the old widget builder path when swapping over
681684
pathname,
682685
query: {
683686
...location.query,
684687
...(openWidgetTemplates
685-
? {}
688+
? defaultLibraryWidget
689+
? convertWidgetToBuilderStateParams(defaultLibraryWidget)
690+
: {}
686691
: convertWidgetToBuilderStateParams(
687692
getDefaultWidget(DATA_SET_TO_WIDGET_TYPE[dataset ?? DataSet.ERRORS])
688693
)),

static/app/views/dashboards/widgetBuilder/components/widgetBuilderSlideout.tsx

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,19 @@ import {Fragment, useEffect, useRef, useState} from 'react';
22
import {useTheme} from '@emotion/react';
33
import styled from '@emotion/styled';
44
import isEqual from 'lodash/isEqual';
5-
import pick from 'lodash/pick';
65

76
import {Breadcrumbs} from 'sentry/components/breadcrumbs';
87
import {openConfirmModal} from 'sentry/components/confirm';
98
import {Button} from 'sentry/components/core/button';
109
import ErrorBoundary from 'sentry/components/errorBoundary';
1110
import SlideOverPanel from 'sentry/components/slideOverPanel';
12-
import {URL_PARAM} from 'sentry/constants/pageFilters';
1311
import {IconClose} from 'sentry/icons';
1412
import {t} from 'sentry/locale';
1513
import {space} from 'sentry/styles/space';
1614
import {trackAnalytics} from 'sentry/utils/analytics';
1715
import {WidgetBuilderVersion} from 'sentry/utils/analytics/dashboardsAnalyticsEvents';
1816
import type {TableDataWithTitle} from 'sentry/utils/discover/discoverQuery';
19-
import {useLocation} from 'sentry/utils/useLocation';
2017
import useMedia from 'sentry/utils/useMedia';
21-
import {useNavigate} from 'sentry/utils/useNavigate';
2218
import useOrganization from 'sentry/utils/useOrganization';
2319
import {useValidateWidgetQuery} from 'sentry/views/dashboards/hooks/useValidateWidget';
2420
import {
@@ -47,6 +43,8 @@ import {useWidgetBuilderContext} from 'sentry/views/dashboards/widgetBuilder/con
4743
import useDashboardWidgetSource from 'sentry/views/dashboards/widgetBuilder/hooks/useDashboardWidgetSource';
4844
import useIsEditingWidget from 'sentry/views/dashboards/widgetBuilder/hooks/useIsEditingWidget';
4945
import {convertBuilderStateToWidget} from 'sentry/views/dashboards/widgetBuilder/utils/convertBuilderStateToWidget';
46+
import {convertWidgetToBuilderStateParams} from 'sentry/views/dashboards/widgetBuilder/utils/convertWidgetToBuilderStateParams';
47+
import {getTopNConvertedDefaultWidgets} from 'sentry/views/dashboards/widgetLibrary/data';
5048

5149
type WidgetBuilderSlideoutProps = {
5250
dashboard: DashboardDetails;
@@ -78,15 +76,13 @@ function WidgetBuilderSlideout({
7876
thresholdMetaState,
7977
}: WidgetBuilderSlideoutProps) {
8078
const organization = useOrganization();
81-
const {state} = useWidgetBuilderContext();
79+
const {state, dispatch} = useWidgetBuilderContext();
8280
const [initialState] = useState(state);
8381
const [customizeFromLibrary, setCustomizeFromLibrary] = useState(false);
8482
const [error, setError] = useState<Record<string, any>>({});
8583
const theme = useTheme();
8684
const isEditing = useIsEditingWidget();
8785
const source = useDashboardWidgetSource();
88-
const navigate = useNavigate();
89-
const location = useLocation();
9086
const validatedWidgetResponse = useValidateWidgetQuery(
9187
convertBuilderStateToWidget(state)
9288
);
@@ -144,21 +140,20 @@ function WidgetBuilderSlideout({
144140
return () => observer.disconnect();
145141
}, [setIsPreviewDraggable, openWidgetTemplates]);
146142

143+
const widgetLibraryWidgets = getTopNConvertedDefaultWidgets(organization);
144+
147145
const widgetLibraryElement = (
148146
<SlideoutBreadcrumb
149147
onClick={() => {
150148
setCustomizeFromLibrary(false);
151149
setOpenWidgetTemplates(true);
152150
// clears the widget to start fresh on the library page
153-
navigate(
154-
{
155-
pathname: location.pathname,
156-
query: {
157-
...pick(location.query, [...Object.values(URL_PARAM)]),
158-
},
159-
},
160-
{preventScrollReset: true}
161-
);
151+
dispatch({
152+
type: 'SET_STATE',
153+
payload: convertWidgetToBuilderStateParams(
154+
widgetLibraryWidgets[0] ?? ({} as Widget)
155+
),
156+
});
162157
}}
163158
>
164159
{t('Widget Library')}

static/app/views/dashboards/widgetBuilder/components/widgetTemplatesList.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ function WidgetTemplatesList({
3333
}: WidgetTemplatesListProps) {
3434
const theme = useTheme();
3535
const organization = useOrganization();
36-
const [selectedWidget, setSelectedWidget] = useState<number | null>(null);
36+
const [selectedWidget, setSelectedWidget] = useState<number | null>(0);
3737

3838
const {dispatch} = useWidgetBuilderContext();
3939
const {widgetIndex} = useParams();

0 commit comments

Comments
 (0)