diff --git a/src/Framework/Framework/Resources/Scripts/spa/navigation.ts b/src/Framework/Framework/Resources/Scripts/spa/navigation.ts index b0298a7df8..75bbe69481 100644 --- a/src/Framework/Framework/Resources/Scripts/spa/navigation.ts +++ b/src/Framework/Framework/Resources/Scripts/spa/navigation.ts @@ -58,7 +58,7 @@ export async function navigateCore(url: string, options: PostbackOptions, handle clearApiCachedValues(); } updater.updateViewModelAndControls(response.result, replaceTypeInfo); - updateInitialUrl(url); + updateInitialUrl(response.result.url ?? url); isSpaReady(true); } else if (response.result.action === "redirect") { // always replace current page in history on navigation redirect, otherwise back button doesn't work (only navigates back to redirect) diff --git a/src/Framework/Framework/Resources/Scripts/tests/eventArgs.test.ts b/src/Framework/Framework/Resources/Scripts/tests/eventArgs.test.ts index 535e945451..4ac1e5d1c9 100644 --- a/src/Framework/Framework/Resources/Scripts/tests/eventArgs.test.ts +++ b/src/Framework/Framework/Resources/Scripts/tests/eventArgs.test.ts @@ -1,6 +1,6 @@ import { postBack, applyPostbackHandlers } from "../postback/postback"; import { initDotvvmWithSpa, watchEvents, getEventHistory } from "./helper"; -import { getViewModel, updateViewModelCache, replaceViewModel } from "../dotvvm-base"; +import { getViewModel, getInitialUrl, updateViewModelCache, replaceViewModel } from "../dotvvm-base"; import { DotvvmPostbackError } from "../shared-classes"; import { keys } from "../utils/objects"; import { WrappedResponse } from "../postback/http"; @@ -475,6 +475,42 @@ test("spaNavigation + success", async () => { }); +test("spaNavigation updates initial url from server response", async () => { + fetchJson = async () => ({ + viewModel: { + $type: "t2", + PropertyA: 1, + PropertyB: 2 + }, + typeMetadata: { + t2: { + type: "object", + properties: { + PropertyA: { + type: "Int32" + }, + PropertyB: { + type: "Int32" + } + } + } + }, + action: "successfulCommand", + url: "/subpath/test", + virtualDirectory: "", + resources: {}, + updatedControls: { + "c01": "new html" + } + } as any); + + const link = document.createElement("a"); + link.href = "/test"; + await spa.handleSpaNavigation(link, (u: string) => {}); + + expect(getInitialUrl()).toBe("/subpath/test"); +}); + test("spaNavigation + redirect", async () => { fetchJson = fetchDefinitions.spaNavigateRedirect;