[Dashboard] Fix missing state on short URL alias match redirect (#163658)

Fixes an issue where URL state from short URLs could be lost on an alias match redirect.
This commit is contained in:
Devon Thomson 2023-08-11 12:15:18 -04:00 committed by GitHub
parent f73746d73b
commit 4de61111b1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 2 deletions

View file

@ -51,7 +51,7 @@ test('throws error when provided validation function returns invalid', async ()
}).rejects.toThrow('Dashboard failed saved object result validation');
});
test('returns undefined when provided validation function returns redireted', async () => {
test('returns undefined when provided validation function returns redirected', async () => {
const creationOptions: DashboardCreationOptions = {
validateLoadedSavedObject: jest.fn().mockImplementation(() => 'redirected'),
};
@ -59,6 +59,24 @@ test('returns undefined when provided validation function returns redireted', as
expect(dashboard).toBeUndefined();
});
/**
* Because the getInitialInput function may have side effects, we only want to call it once we are certain that the
* the loaded saved object passes validation.
*
* This is especially relevant in the Dashboard App case where calling the getInitialInput function removes the _a
* param from the URL. In alais match situations this caused a bug where the state from the URL wasn't properly applied
* after the redirect.
*/
test('does not get initial input when provided validation function returns redirected', async () => {
const creationOptions: DashboardCreationOptions = {
validateLoadedSavedObject: jest.fn().mockImplementation(() => 'redirected'),
getInitialInput: jest.fn(),
};
const dashboard = await createDashboard(creationOptions, 0, 'test-id');
expect(dashboard).toBeUndefined();
expect(creationOptions.getInitialInput).not.toHaveBeenCalled();
});
test('pulls state from dashboard saved object when given a saved object id', async () => {
pluginServices.getServices().dashboardContentManagement.loadDashboardState = jest
.fn()

View file

@ -137,7 +137,6 @@ export const initializeDashboard = async ({
useUnifiedSearchIntegration,
useSessionStorageIntegration,
} = creationOptions ?? {};
const overrideInput = getInitialInput?.();
// --------------------------------------------------------------------------------------
// Run validation.
@ -161,6 +160,7 @@ export const initializeDashboard = async ({
// --------------------------------------------------------------------------------------
// Combine input from saved object, session storage, & passed input to create initial input.
// --------------------------------------------------------------------------------------
const overrideInput = getInitialInput?.();
const initialInput: DashboardContainerInput = cloneDeep({
...DEFAULT_DASHBOARD_INPUT,
...(loadDashboardReturn?.dashboardInput ?? {}),