Skip to content

Commit 26d4509

Browse files
feat(dashboards): Updates prebuilt dashboard preview and management in the All Dashboards view (#104018)
- Updates prebuilt dashboards to display metadata and preview properly in table and grid views in the All Dashboards page - Fix number of widgets display - Adds tooltip to owner icon - Fix preview grid not displaying - Disables access management in the All Dashboards page for prebuilt dashboards - Disables delete capability in the the All Dashboards page for prebuilt dashboards
1 parent b957929 commit 26d4509

File tree

5 files changed

+59
-6
lines changed

5 files changed

+59
-6
lines changed

static/app/views/dashboards/editAccessSelector.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import type {
3434

3535
interface EditAccessSelectorProps {
3636
dashboard: DashboardDetails | DashboardListItem;
37+
disabled?: boolean;
3738
listOnly?: boolean;
3839
onChangeEditAccess?: (newDashboardPermissions: DashboardPermissions) => void;
3940
}
@@ -46,6 +47,7 @@ function EditAccessSelector({
4647
dashboard,
4748
onChangeEditAccess,
4849
listOnly = false,
50+
disabled = false,
4951
}: EditAccessSelectorProps) {
5052
const currentUser: User = useUser();
5153
const dashboardCreator: User | undefined = dashboard.createdBy;
@@ -320,6 +322,7 @@ function EditAccessSelector({
320322
}}
321323
priority="primary"
322324
disabled={
325+
disabled ||
323326
!userCanEditDashboardPermissions ||
324327
isEqual(getDashboardPermissions(), {
325328
...dashboard.permissions,
@@ -369,14 +372,20 @@ function EditAccessSelector({
369372
onSearch={debounce(val => void onSearch(val), DEFAULT_DEBOUNCE_DURATION)}
370373
strategy="fixed"
371374
preventOverflowOptions={{mainAxis: false}}
375+
disabled={disabled}
372376
/>
373377
);
374378

379+
const tooltipTitle = disabled
380+
? t('Prebuilt dashboards cannot be edited')
381+
: t('Only the creator of this dashboard can manage editor access');
382+
375383
return (
376384
<Tooltip
377-
title={t('Only the creator of this dashboard can manage editor access')}
385+
title={tooltipTitle}
378386
disabled={
379-
userCanEditDashboardPermissions || isMenuOpen || isCollapsedAvatarTooltipOpen
387+
!disabled &&
388+
(userCanEditDashboardPermissions || isMenuOpen || isCollapsedAvatarTooltipOpen)
380389
}
381390
>
382391
{dropdownMenu}

static/app/views/dashboards/manage/dashboardGrid.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {IconEllipsis} from 'sentry/icons';
1616
import {t, tn} from 'sentry/locale';
1717
import {space} from 'sentry/styles/space';
1818
import type {Organization} from 'sentry/types/organization';
19+
import {defined} from 'sentry/utils';
1920
import {trackAnalytics} from 'sentry/utils/analytics';
2021
import {useQueryClient} from 'sentry/utils/queryClient';
2122
import withApi from 'sentry/utils/withApi';
@@ -122,6 +123,10 @@ function DashboardGrid({
122123
onConfirm: () => handleDeleteDashboard(dashboard, 'grid'),
123124
});
124125
},
126+
disabled: defined(dashboard.prebuiltId),
127+
tooltip: defined(dashboard.prebuiltId)
128+
? t('Prebuilt dashboards cannot be deleted')
129+
: undefined,
125130
},
126131
];
127132

static/app/views/dashboards/manage/dashboardTable.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type {Location} from 'history';
44
import cloneDeep from 'lodash/cloneDeep';
55

66
import {Flex} from '@sentry/scraps/layout';
7+
import {Tooltip} from '@sentry/scraps/tooltip/tooltip';
78

89
import {
910
updateDashboardFavorite,
@@ -27,6 +28,7 @@ import {IconCopy, IconDelete, IconStar} from 'sentry/icons';
2728
import {t} from 'sentry/locale';
2829
import {space} from 'sentry/styles/space';
2930
import type {Organization} from 'sentry/types/organization';
31+
import {defined} from 'sentry/utils';
3032
import {trackAnalytics} from 'sentry/utils/analytics';
3133
import {useQueryClient} from 'sentry/utils/queryClient';
3234
import {decodeScalar} from 'sentry/utils/queryString';
@@ -229,7 +231,11 @@ function DashboardTable({
229231
<UserAvatar hasTooltip user={dataRow[ResponseKeys.OWNER]} size={26} />
230232
</BodyCellContainer>
231233
) : (
232-
<ActivityAvatar type="system" size={26} />
234+
<BodyCellContainer>
235+
<Tooltip title="Sentry">
236+
<ActivityAvatar type="system" size={26} />
237+
</Tooltip>
238+
</BodyCellContainer>
233239
);
234240
}
235241

@@ -253,6 +259,7 @@ function DashboardTable({
253259
dashboard={dataRow}
254260
onChangeEditAccess={onChangeEditAccess}
255261
listOnly
262+
disabled={defined(dataRow.prebuiltId)} // Prebuilt dashboards cannot be edited
256263
/>
257264
);
258265
}
@@ -309,7 +316,14 @@ function DashboardTable({
309316
data-test-id="dashboard-delete"
310317
icon={<IconDelete />}
311318
size="sm"
312-
disabled={dashboards && dashboards.length <= 1}
319+
disabled={
320+
(dashboards && dashboards.length <= 1) || defined(dataRow.prebuiltId)
321+
}
322+
title={
323+
defined(dataRow.prebuiltId)
324+
? t('Prebuilt dashboards cannot be deleted')
325+
: undefined
326+
}
313327
/>
314328
</Flex>
315329
</BodyCellContainer>

static/app/views/dashboards/manage/index.tsx

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {useEffect, useRef, useState} from 'react';
1+
import {useEffect, useMemo, useRef, useState} from 'react';
22
import styled from '@emotion/styled';
33
import type {Query} from 'history';
44
import debounce from 'lodash/debounce';
@@ -50,6 +50,7 @@ import OwnedDashboardsTable, {
5050
} from 'sentry/views/dashboards/manage/tableView/ownedDashboardsTable';
5151
import type {DashboardsLayout} from 'sentry/views/dashboards/manage/types';
5252
import type {DashboardDetails, DashboardListItem} from 'sentry/views/dashboards/types';
53+
import {PREBUILT_DASHBOARDS} from 'sentry/views/dashboards/utils/prebuiltConfigs';
5354
import RouteError from 'sentry/views/routeError';
5455

5556
import DashboardGrid from './dashboardGrid';
@@ -155,7 +156,7 @@ function ManageDashboards() {
155156
});
156157

157158
const {
158-
data: dashboards,
159+
data: dashboardsWithoutPrebuiltConfigs,
159160
isLoading,
160161
isError,
161162
error,
@@ -183,6 +184,29 @@ function ManageDashboards() {
183184
}
184185
);
185186

187+
const dashboards = useMemo(
188+
() =>
189+
dashboardsWithoutPrebuiltConfigs?.map(dashboard => {
190+
if (dashboard.prebuiltId && dashboard.prebuiltId in PREBUILT_DASHBOARDS) {
191+
return {
192+
...dashboard,
193+
widgetDisplay: PREBUILT_DASHBOARDS[dashboard.prebuiltId].widgets.map(
194+
widget => widget.displayType
195+
),
196+
widgetPreview: PREBUILT_DASHBOARDS[dashboard.prebuiltId].widgets.map(
197+
widget => ({
198+
displayType: widget.displayType,
199+
layout: widget.layout ?? null,
200+
})
201+
),
202+
projects: [],
203+
};
204+
}
205+
return dashboard;
206+
}),
207+
[dashboardsWithoutPrebuiltConfigs]
208+
);
209+
186210
const ownedDashboards = useOwnedDashboards({
187211
query: decodeScalar(location.query.query, ''),
188212
cursor: decodeScalar(location.query[OWNED_CURSOR_KEY], ''),

static/app/views/dashboards/types.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ export type DashboardListItem = {
168168
isFavorited?: boolean;
169169
lastVisited?: string;
170170
permissions?: DashboardPermissions;
171+
prebuiltId?: PrebuiltDashboardId;
171172
};
172173

173174
export enum DashboardFilterKeys {

0 commit comments

Comments
 (0)