From 2ec01c8d0843ab1c92bae2c126cc1f472c8eabe3 Mon Sep 17 00:00:00 2001 From: Ivan Ortega Alba Date: Fri, 22 Jul 2022 10:44:22 +0200 Subject: [PATCH] Preferences: Use dashboardUID to set the home dashboard (#51919) --- .betterer.results | 3 +- .../SharedPreferences.test.tsx | 26 ++++-- .../SharedPreferences/SharedPreferences.tsx | 87 +++++++++++-------- .../app/features/org/OrgDetailsPage.test.tsx | 6 +- .../profile/UserProfileEditPage.test.tsx | 2 +- public/app/features/search/types.ts | 5 ++ public/app/features/teams/TeamPages.test.tsx | 4 +- public/app/types/preferences.ts | 3 +- 8 files changed, 86 insertions(+), 50 deletions(-) diff --git a/.betterer.results b/.betterer.results index 2d71b7e29f5..d84e88a2d19 100644 --- a/.betterer.results +++ b/.betterer.results @@ -3144,7 +3144,8 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "public/app/core/components/SharedPreferences/SharedPreferences.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"] + [0, 0, 0, "Do not use any type assertions.", "0"], + [0, 0, 0, "Do not use any type assertions.", "1"] ], "public/app/core/components/TagFilter/TagBadge.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], diff --git a/public/app/core/components/SharedPreferences/SharedPreferences.test.tsx b/public/app/core/components/SharedPreferences/SharedPreferences.test.tsx index 4b09e4bef47..868df02d1d6 100644 --- a/public/app/core/components/SharedPreferences/SharedPreferences.test.tsx +++ b/public/app/core/components/SharedPreferences/SharedPreferences.test.tsx @@ -25,20 +25,32 @@ jest.mock('@grafana/runtime', () => { jest.mock('app/core/services/backend_srv', () => { return { backendSrv: { + getDashboardByUid: jest.fn().mockResolvedValue({ + dashboard: { + id: 2, + title: 'My Dashboard', + uid: 'myDash', + templating: { + list: [], + }, + panels: [], + }, + meta: {}, + }), search: jest.fn().mockResolvedValue([ { id: 2, title: 'My Dashboard', tags: [], type: '', - uid: '', + uid: 'myDash', uri: '', url: '', folderId: 0, folderTitle: '', folderUid: '', folderUrl: '', - isStarred: false, + isStarred: true, slug: '', items: [], }, @@ -47,14 +59,14 @@ jest.mock('app/core/services/backend_srv', () => { title: 'Another Dashboard', tags: [], type: '', - uid: '', + uid: 'anotherDash', uri: '', url: '', folderId: 0, folderTitle: '', folderUid: '', folderUrl: '', - isStarred: false, + isStarred: true, slug: '', items: [], }, @@ -67,7 +79,7 @@ const mockPreferences: UserPreferencesDTO = { timezone: 'browser', weekStart: 'monday', theme: 'light', - homeDashboardId: 2, + homeDashboardUID: 'myDash', queryHistory: { homeTab: '', }, @@ -159,7 +171,7 @@ describe('SharedPreferences', () => { timezone: 'Australia/Sydney', weekStart: 'saturday', theme: 'dark', - homeDashboardId: 3, + homeDashboardUID: 'anotherDash', queryHistory: { homeTab: '', }, @@ -181,7 +193,7 @@ describe('SharedPreferences', () => { timezone: 'browser', weekStart: '', theme: '', - homeDashboardId: 0, + homeDashboardUID: undefined, queryHistory: { homeTab: '', }, diff --git a/public/app/core/components/SharedPreferences/SharedPreferences.tsx b/public/app/core/components/SharedPreferences/SharedPreferences.tsx index 326df7e5a0f..6117947e2ba 100644 --- a/public/app/core/components/SharedPreferences/SharedPreferences.tsx +++ b/public/app/core/components/SharedPreferences/SharedPreferences.tsx @@ -22,7 +22,7 @@ import { } from '@grafana/ui'; import { PreferencesService } from 'app/core/services/PreferencesService'; import { backendSrv } from 'app/core/services/backend_srv'; -import { DashboardSearchHit, DashboardSearchItemType } from 'app/features/search/types'; +import { DashboardSearchItem, DashboardSearchItemType } from 'app/features/search/types'; import { UserPreferencesDTO } from '../../../types'; @@ -32,7 +32,7 @@ export interface Props { } export type State = UserPreferencesDTO & { - dashboards: DashboardSearchHit[]; + dashboards: DashboardSearchItem[]; }; const themes: SelectableValue[] = [ @@ -74,6 +74,22 @@ const languages: Array> = [ const i18nFlag = Boolean(config.featureToggles.internationalization); +const DEFAULT_DASHBOARD_HOME: DashboardSearchItem = { + title: 'Default', + tags: [], + type: '' as DashboardSearchItemType, + uid: undefined, + uri: '', + url: '', + folderId: 0, + folderTitle: '', + folderUid: '', + folderUrl: '', + isStarred: false, + slug: '', + items: [], +}; + export class SharedPreferences extends PureComponent { service: PreferencesService; @@ -82,7 +98,7 @@ export class SharedPreferences extends PureComponent { this.service = new PreferencesService(props.resourceUri); this.state = { - homeDashboardId: 0, + homeDashboardUID: DEFAULT_DASHBOARD_HOME.uid, theme: '', timezone: '', weekStart: '', @@ -94,45 +110,44 @@ export class SharedPreferences extends PureComponent { async componentDidMount() { const prefs = await this.service.load(); - const dashboards = await backendSrv.search({ starred: true }); - const defaultDashboardHit: DashboardSearchHit = { - id: 0, - title: 'Default', - tags: [], - type: '' as DashboardSearchItemType, - uid: '', - uri: '', - url: '', - folderId: 0, - folderTitle: '', - folderUid: '', - folderUrl: '', - isStarred: false, - slug: '', - items: [], - }; + const dashboards = (await backendSrv.search({ starred: true })) as DashboardSearchItem[]; + + if (prefs.homeDashboardUID && !dashboards.find((d) => d.uid === prefs.homeDashboardUID)) { + const missingDash = await backendSrv.getDashboardByUid(prefs.homeDashboardUID); - if (prefs.homeDashboardId > 0 && !dashboards.find((d) => d.id === prefs.homeDashboardId)) { - const missing = await backendSrv.search({ dashboardIds: [prefs.homeDashboardId] }); - if (missing && missing.length > 0) { - dashboards.push(missing[0]); + if (missingDash?.dashboard) { + dashboards.push({ + title: missingDash.dashboard.title, + tags: [], + type: DashboardSearchItemType.DashDB, + uid: missingDash.dashboard.uid, + uri: '', // uri is not part of dashboard metadata + url: missingDash.meta.url || '', + folderId: missingDash.meta.folderId, + folderTitle: missingDash.meta.folderTitle, + folderUid: missingDash.meta.folderUid, + folderUrl: missingDash.meta.folderUrl, + isStarred: missingDash.meta.isStarred || false, + slug: missingDash.meta.slug, + items: [], + }); } } this.setState({ - homeDashboardId: prefs.homeDashboardId, + homeDashboardUID: prefs.homeDashboardUID, theme: prefs.theme, timezone: prefs.timezone, weekStart: prefs.weekStart, locale: prefs.locale, - dashboards: [defaultDashboardHit, ...dashboards], + dashboards: [DEFAULT_DASHBOARD_HOME, ...dashboards], queryHistory: prefs.queryHistory, }); } onSubmitForm = async () => { - const { homeDashboardId, theme, timezone, weekStart, locale, queryHistory } = this.state; - await this.service.update({ homeDashboardId, theme, timezone, weekStart, locale, queryHistory }); + const { homeDashboardUID, theme, timezone, weekStart, locale, queryHistory } = this.state; + await this.service.update({ homeDashboardUID, theme, timezone, weekStart, locale, queryHistory }); window.location.reload(); }; @@ -151,15 +166,15 @@ export class SharedPreferences extends PureComponent { this.setState({ weekStart: weekStart }); }; - onHomeDashboardChanged = (dashboardId: number) => { - this.setState({ homeDashboardId: dashboardId }); + onHomeDashboardChanged = (dashboardUID: string) => { + this.setState({ homeDashboardUID: dashboardUID }); }; onLocaleChanged = (locale: string) => { this.setState({ locale }); }; - getFullDashName = (dashboard: SelectableValue) => { + getFullDashName = (dashboard: SelectableValue) => { if (typeof dashboard.folderTitle === 'undefined' || dashboard.folderTitle === '') { return dashboard.title; } @@ -167,7 +182,7 @@ export class SharedPreferences extends PureComponent { }; render() { - const { theme, timezone, weekStart, homeDashboardId, locale, dashboards } = this.state; + const { theme, timezone, weekStart, homeDashboardUID, locale, dashboards } = this.state; const { disabled } = this.props; const styles = getStyles(); @@ -209,11 +224,11 @@ export class SharedPreferences extends PureComponent { data-testid="User preferences home dashboard drop down" >