Skip to content

Commit 5301819

Browse files
nreesekibanamachineelasticmachine
authored
[dashboard as code] dashboard client (#241393)
Part of #238500 PR consolidates HTTP requests into `dashboardClient`. `get` and `delete` are migrated to REST endpoints while `create`, `search`, and `update` are labeled with TODOs. Those endpoints need some work before dashboard can use them. --------- Co-authored-by: kibanamachine <[email protected]> Co-authored-by: Elastic Machine <[email protected]>
1 parent af3b01c commit 5301819

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+544
-971
lines changed

src/platform/plugins/shared/dashboard/common/content_management/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
*/
99

1010
export const LATEST_VERSION = 1;
11+
export const DASHBOARD_API_VERSION = String(LATEST_VERSION);
1112

1213
export const CONTENT_ID = 'dashboard';
1314

src/platform/plugins/shared/dashboard/jest_setup.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
*/
1717
import {
1818
mockDashboardBackupService,
19-
mockDashboardContentManagementCache,
20-
mockDashboardContentManagementService,
2119
setStubKibanaServices,
2220
setStubLogger,
2321
} from './public/services/mocks';
@@ -26,14 +24,6 @@ setStubLogger();
2624
// Start the kibana services with stubs
2725
setStubKibanaServices();
2826

29-
// Mock the dashboard services
30-
jest.mock('./public/services/dashboard_content_management_service', () => {
31-
return {
32-
getDashboardContentManagementCache: () => mockDashboardContentManagementCache,
33-
getDashboardContentManagementService: () => mockDashboardContentManagementService,
34-
};
35-
});
36-
3727
jest.mock('./public/services/dashboard_backup_service', () => {
3828
return {
3929
getDashboardBackupService: () => mockDashboardBackupService,

src/platform/plugins/shared/dashboard/public/dashboard_api/get_dashboard_api.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ import { CONTROLS_GROUP_TYPE } from '@kbn/controls-constants';
1515
import { DASHBOARD_APP_ID } from '../../common/constants';
1616
import { getReferencesForControls, getReferencesForPanelId } from '../../common';
1717
import type { DashboardState } from '../../common/types';
18-
import { getDashboardContentManagementService } from '../services/dashboard_content_management_service';
19-
import type { LoadDashboardReturn } from '../services/dashboard_content_management_service/types';
2018
import {
2119
CONTROL_GROUP_EMBEDDABLE_ID,
2220
initializeControlGroupManager,
@@ -37,6 +35,8 @@ import { initializeUnifiedSearchManager } from './unified_search_manager';
3735
import { initializeUnsavedChangesManager } from './unsaved_changes_manager';
3836
import { initializeViewModeManager } from './view_mode_manager';
3937
import { mergeControlGroupStates } from './merge_control_group_states';
38+
import type { DashboardAPIGetOut } from '../../server/content_management';
39+
import { saveDashboard } from './save_modal/save_dashboard';
4040

4141
export function getDashboardApi({
4242
creationOptions,
@@ -48,15 +48,19 @@ export function getDashboardApi({
4848
creationOptions?: DashboardCreationOptions;
4949
incomingEmbeddables?: EmbeddablePackageState[] | undefined;
5050
initialState: DashboardState;
51-
savedObjectResult?: LoadDashboardReturn;
51+
savedObjectResult?: DashboardAPIGetOut;
5252
savedObjectId?: string;
5353
}) {
5454
const fullScreenMode$ = new BehaviorSubject(creationOptions?.fullScreenMode ?? false);
55-
const isManaged = savedObjectResult?.managed ?? false;
55+
const isManaged = savedObjectResult?.meta.managed ?? false;
5656
const savedObjectId$ = new BehaviorSubject<string | undefined>(savedObjectId);
5757
const dashboardContainerRef$ = new BehaviorSubject<HTMLElement | null>(null);
5858

59-
const viewModeManager = initializeViewModeManager(incomingEmbeddables, savedObjectResult);
59+
const viewModeManager = initializeViewModeManager({
60+
incomingEmbeddables,
61+
isManaged,
62+
savedObjectId,
63+
});
6064
const trackPanel = initializeTrackPanel(async (id: string) => {
6165
await layoutManager.api.getChildApi(id);
6266
}, dashboardContainerRef$);
@@ -107,7 +111,7 @@ export function getDashboardApi({
107111
viewMode$: viewModeManager.api.viewMode$,
108112
storeUnsavedChanges: creationOptions?.useSessionStorageIntegration,
109113
controlGroupManager,
110-
lastSavedState: savedObjectResult?.dashboardInput ?? DEFAULT_DASHBOARD_STATE,
114+
lastSavedState: savedObjectResult?.data ?? DEFAULT_DASHBOARD_STATE,
111115
layoutManager,
112116
savedObjectId$,
113117
settingsManager,
@@ -209,7 +213,7 @@ export function getDashboardApi({
209213
runQuickSave: async () => {
210214
if (isManaged) return;
211215
const { dashboardState, references } = getState();
212-
const saveResult = await getDashboardContentManagementService().saveDashboardState({
216+
const saveResult = await saveDashboard({
213217
dashboardState,
214218
references,
215219
saveOptions: {},

src/platform/plugins/shared/dashboard/public/dashboard_api/load_dashboard_api/load_dashboard_api.test.ts

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,18 @@ jest.mock('@kbn/content-management-content-insights-public', () => {
2525
};
2626
});
2727

28+
jest.mock('../../dashboard_client', () => {
29+
// eslint-disable-next-line @typescript-eslint/no-var-requires
30+
const defaultState = require('../default_dashboard_state');
31+
return {
32+
dashboardClient: {
33+
get: jest.fn().mockResolvedValue({
34+
data: { ...defaultState.DEFAULT_DASHBOARD_STATE },
35+
}),
36+
},
37+
};
38+
});
39+
2840
const lastSavedQuery = { query: 'memory:>220000', language: 'kuery' };
2941

3042
describe('loadDashboardApi', () => {
@@ -39,16 +51,6 @@ describe('loadDashboardApi', () => {
3951
internalApi: {},
4052
});
4153

42-
// eslint-disable-next-line @typescript-eslint/no-var-requires
43-
require('../../services/dashboard_content_management_service').getDashboardContentManagementService =
44-
() => ({
45-
loadDashboardState: () => ({
46-
dashboardFound: true,
47-
dashboardInput: DEFAULT_DASHBOARD_STATE,
48-
references: [],
49-
}),
50-
});
51-
5254
// eslint-disable-next-line @typescript-eslint/no-var-requires
5355
require('../../services/dashboard_backup_service').getDashboardBackupService = () => ({
5456
getState: () => ({
@@ -71,10 +73,7 @@ describe('loadDashboardApi', () => {
7173
});
7274
expect(getDashboardApiMock).toHaveBeenCalled();
7375
// @ts-ignore
74-
expect(getDashboardApiMock.mock.calls[0][0].initialState).toEqual({
75-
...DEFAULT_DASHBOARD_STATE,
76-
references: [],
77-
});
76+
expect(getDashboardApiMock.mock.calls[0][0].initialState).toEqual(DEFAULT_DASHBOARD_STATE);
7877
});
7978

8079
test('should overwrite saved object state with unsaved state', async () => {
@@ -88,7 +87,6 @@ describe('loadDashboardApi', () => {
8887
// @ts-ignore
8988
expect(getDashboardApiMock.mock.calls[0][0].initialState).toEqual({
9089
...DEFAULT_DASHBOARD_STATE,
91-
references: [],
9290
query: lastSavedQuery,
9391
});
9492
});
@@ -109,7 +107,6 @@ describe('loadDashboardApi', () => {
109107
// @ts-ignore
110108
expect(getDashboardApiMock.mock.calls[0][0].initialState).toEqual({
111109
...DEFAULT_DASHBOARD_STATE,
112-
references: [],
113110
query: queryFromUrl,
114111
});
115112
});

src/platform/plugins/shared/dashboard/public/dashboard_api/load_dashboard_api/load_dashboard_api.ts

Lines changed: 9 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@
88
*/
99

1010
import { ContentInsightsClient } from '@kbn/content-management-content-insights-public';
11-
import type { DashboardState } from '../../../common';
1211
import { getDashboardBackupService } from '../../services/dashboard_backup_service';
13-
import { getDashboardContentManagementService } from '../../services/dashboard_content_management_service';
1412
import { coreServices } from '../../services/kibana_services';
1513
import { logger } from '../../services/logger';
1614
import { getDashboardApi } from '../get_dashboard_api';
1715
import { startQueryPerformanceTracking } from '../performance/query_performance_tracking';
1816
import type { DashboardCreationOptions } from '../types';
1917
import { transformPanels } from './transform_panels';
18+
import { dashboardClient } from '../../dashboard_client';
19+
import { DEFAULT_DASHBOARD_STATE } from '../default_dashboard_state';
2020

2121
export async function loadDashboardApi({
2222
getCreationOptions,
@@ -28,13 +28,8 @@ export async function loadDashboardApi({
2828
const creationStartTime = performance.now();
2929
const creationOptions = await getCreationOptions?.();
3030
const incomingEmbeddables = creationOptions?.getIncomingEmbeddables?.();
31-
const savedObjectResult = await getDashboardContentManagementService().loadDashboardState({
32-
id: savedObjectId,
33-
});
31+
const savedObjectResult = savedObjectId ? await dashboardClient.get(savedObjectId) : undefined;
3432

35-
// --------------------------------------------------------------------------------------
36-
// Run validation.
37-
// --------------------------------------------------------------------------------------
3833
const validationResult =
3934
savedObjectResult && creationOptions?.validateLoadedSavedObject?.(savedObjectResult);
4035
if (validationResult === 'invalid') {
@@ -44,25 +39,10 @@ export async function loadDashboardApi({
4439
return;
4540
}
4641

47-
// --------------------------------------------------------------------------------------
48-
// Combine saved object state and session storage state
49-
// --------------------------------------------------------------------------------------
50-
const sessionStorageInput = ((): Partial<DashboardState> | undefined => {
51-
if (!creationOptions?.useSessionStorageIntegration) return;
52-
return getDashboardBackupService().getState(savedObjectResult.dashboardId);
53-
})();
54-
55-
const combinedSessionState: DashboardState = {
56-
...(savedObjectResult?.dashboardInput ?? {}),
57-
...sessionStorageInput,
58-
};
59-
combinedSessionState.references = sessionStorageInput?.references?.length
60-
? sessionStorageInput?.references
61-
: savedObjectResult?.references;
42+
const unsavedChanges = creationOptions?.useSessionStorageIntegration
43+
? getDashboardBackupService().getState(savedObjectId)
44+
: undefined;
6245

63-
// --------------------------------------------------------------------------------------
64-
// Combine state with overrides.
65-
// --------------------------------------------------------------------------------------
6646
const { viewMode, ...overrideState } = creationOptions?.getInitialInput?.() ?? {};
6747
if (overrideState.panels) {
6848
overrideState.panels = await transformPanels(overrideState.panels, overrideState.references);
@@ -73,14 +53,13 @@ export async function loadDashboardApi({
7353
getDashboardBackupService().storeViewMode(viewMode);
7454
}
7555

76-
// --------------------------------------------------------------------------------------
77-
// get dashboard Api
78-
// --------------------------------------------------------------------------------------
7956
const { api, cleanup, internalApi } = getDashboardApi({
8057
creationOptions,
8158
incomingEmbeddables,
8259
initialState: {
83-
...combinedSessionState,
60+
...DEFAULT_DASHBOARD_STATE,
61+
...savedObjectResult?.data,
62+
...unsavedChanges,
8463
...overrideState,
8564
},
8665
savedObjectResult,

src/platform/plugins/shared/dashboard/public/dashboard_api/save_modal/open_save_modal.tsx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ import type { Reference } from '@kbn/content-management-utils';
1313
import { reportPerformanceMetricEvent } from '@kbn/ebt-tools';
1414
import { showSaveModal } from '@kbn/saved-objects-plugin/public';
1515
import { i18n } from '@kbn/i18n';
16-
import type { SaveDashboardReturn } from '../../services/dashboard_content_management_service/types';
17-
import type { DashboardSaveOptions } from './types';
16+
import type { DashboardSaveOptions, SaveDashboardReturn } from './types';
1817
import { coreServices, savedObjectsTaggingService } from '../../services/kibana_services';
19-
import { getDashboardContentManagementService } from '../../services/dashboard_content_management_service';
2018
import type { DashboardState } from '../../../common';
2119
import { DASHBOARD_CONTENT_ID, SAVED_OBJECT_POST_TIME } from '../../utils/telemetry_constants';
2220
import { extractTitleAndCount } from '../../utils/extract_title_and_count';
2321
import { DashboardSaveModal } from './save_modal';
22+
import { checkForDuplicateDashboardTitle } from '../../dashboard_client';
23+
import { saveDashboard } from './save_dashboard';
2424

2525
/**
2626
* @description exclusively for user directed dashboard save actions, also
@@ -51,7 +51,6 @@ export async function openSaveModal({
5151
if (viewMode === 'edit' && isManaged) {
5252
return undefined;
5353
}
54-
const dashboardContentManagementService = getDashboardContentManagementService();
5554
const saveAsTitle = lastSavedId ? await getSaveAsTitle(title) : title;
5655
return new Promise<(SaveDashboardReturn & { savedState: DashboardState }) | undefined>(
5756
(resolve) => {
@@ -73,7 +72,7 @@ export async function openSaveModal({
7372

7473
try {
7574
if (
76-
!(await dashboardContentManagementService.checkForDuplicateDashboardTitle({
75+
!(await checkForDuplicateDashboardTitle({
7776
title: newTitle,
7877
onTitleDuplicate,
7978
lastSavedTitle: title,
@@ -99,7 +98,7 @@ export async function openSaveModal({
9998

10099
const beforeAddTime = window.performance.now();
101100

102-
const saveResult = await dashboardContentManagementService.saveDashboardState({
101+
const saveResult = await saveDashboard({
103102
references,
104103
saveOptions,
105104
dashboardState: dashboardStateToSave,
@@ -178,7 +177,7 @@ function generateDashboardNotSavedToast(title: string, errorMessage: any) {
178177
async function getSaveAsTitle(title: string) {
179178
const [baseTitle, baseCount] = extractTitleAndCount(title);
180179
let saveAsTitle = `${baseTitle} (${baseCount + 1})`;
181-
await getDashboardContentManagementService().checkForDuplicateDashboardTitle({
180+
await checkForDuplicateDashboardTitle({
182181
title: saveAsTitle,
183182
lastSavedTitle: title,
184183
copyOnSave: true,

0 commit comments

Comments
 (0)