From e9636d3d7770c693d7f2e5ac2c112b6eddbc2a39 Mon Sep 17 00:00:00 2001 From: David Ovrelid Date: Wed, 12 Nov 2025 09:36:52 +0100 Subject: [PATCH 1/7] update urls for back to innboks --- src/utils/urls/urlHelper.test.ts | 8 ++++---- src/utils/urls/urlHelper.ts | 24 ++++++++++++++++++++---- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/utils/urls/urlHelper.test.ts b/src/utils/urls/urlHelper.test.ts index 600c284a28..3793200bdd 100644 --- a/src/utils/urls/urlHelper.test.ts +++ b/src/utils/urls/urlHelper.test.ts @@ -79,10 +79,10 @@ describe('Shared urlHelper.ts', () => { }); test('returnUrlToArchive() returning correct environments', () => { - expect(returnUrlToArchive(hostTT)).toBe('https://tt02.altinn.no/ui/messagebox/archive'); - expect(returnUrlToArchive(hostAT)).toBe('https://at21.altinn.cloud/ui/messagebox/archive'); - expect(returnUrlToArchive(hostYT)).toBe('https://yt01.altinn.cloud/ui/messagebox/archive'); - expect(returnUrlToArchive(hostProd)).toBe('https://altinn.no/ui/messagebox/archive'); + expect(returnUrlToArchive(hostTT)).toBe('https://af.tt.altinn.no/'); + expect(returnUrlToArchive(hostAT)).toBe('https://af.at.altinn.cloud/'); + expect(returnUrlToArchive(hostYT)).toBe('https://af.yt.altinn.cloud/'); + expect(returnUrlToArchive(hostProd)).toBe('https://af.altinn.no/'); expect(returnUrlToArchive(hostDocker)).toBe('http://local.altinn.cloud/'); expect(returnUrlToArchive(hostPodman)).toBe('http://local.altinn.cloud:8000/'); expect(returnUrlToArchive(hostStudio)).toBe(undefined); diff --git a/src/utils/urls/urlHelper.ts b/src/utils/urls/urlHelper.ts index f517bcd1f2..4b89e68d20 100644 --- a/src/utils/urls/urlHelper.ts +++ b/src/utils/urls/urlHelper.ts @@ -42,12 +42,28 @@ export const returnUrlToArchive = (host: string): string | undefined => { return `http://${host}/`; } - const baseUrl = returnBaseUrlToAltinn(host); - if (!baseUrl) { - return; + const prodStagingMatch = host.match(prodStagingRegex); + if (prodStagingMatch) { + const altinnHost = prodStagingMatch[1]; + // Production: af.altinn.no + // Test environments: af.{env}.altinn.{no|cloud} (without numbers like tt02, at21, yt01) + if (altinnHost === 'altinn.no') { + return 'https://af.altinn.no/'; + } + + // Match test environments like tt02.altinn.no, at21.altinn.cloud, yt01.altinn.cloud + const envMatch = altinnHost.match(/^(at|tt|yt)\d+\.(altinn\.(no|cloud))$/); + if (envMatch) { + const env = envMatch[1]; // at, tt, or yt (without numbers) + const domain = envMatch[2]; // altinn.no or altinn.cloud + return `https://af.${env}.${domain}/`; + } + + // Fallback for other environments + return `https://af.${altinnHost}/`; } - return `${baseUrl}ui/messagebox/archive`; + return undefined; }; export const returnUrlToProfile = (host: string, partyId?: number | undefined): string | undefined => { From 01813fb95ad7e7c5b4c1889094a688b08b6f5ce3 Mon Sep 17 00:00:00 2001 From: David Ovrelid Date: Wed, 12 Nov 2025 09:43:19 +0100 Subject: [PATCH 2/7] comment --- src/utils/urls/urlHelper.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utils/urls/urlHelper.ts b/src/utils/urls/urlHelper.ts index 4b89e68d20..e21a58beb0 100644 --- a/src/utils/urls/urlHelper.ts +++ b/src/utils/urls/urlHelper.ts @@ -51,7 +51,6 @@ export const returnUrlToArchive = (host: string): string | undefined => { return 'https://af.altinn.no/'; } - // Match test environments like tt02.altinn.no, at21.altinn.cloud, yt01.altinn.cloud const envMatch = altinnHost.match(/^(at|tt|yt)\d+\.(altinn\.(no|cloud))$/); if (envMatch) { const env = envMatch[1]; // at, tt, or yt (without numbers) From f5c470d837a660e2e2ee506c6570dc199e5cc9ce Mon Sep 17 00:00:00 2001 From: David Ovrelid Date: Wed, 12 Nov 2025 10:23:10 +0100 Subject: [PATCH 3/7] updates --- src/utils/urls/urlHelper.test.ts | 8 +-- src/utils/urls/urlHelper.ts | 88 ++++++++++++++++++++------------ 2 files changed, 58 insertions(+), 38 deletions(-) diff --git a/src/utils/urls/urlHelper.test.ts b/src/utils/urls/urlHelper.test.ts index 3793200bdd..adea528033 100644 --- a/src/utils/urls/urlHelper.test.ts +++ b/src/utils/urls/urlHelper.test.ts @@ -23,13 +23,13 @@ const hostUnknown = 'www.vg.no'; describe('Shared urlHelper.ts', () => { test('returnUrlToMessageBox() returning correct environemnts', () => { jest.spyOn(window, 'location', 'get').mockReturnValueOnce({ host: hostTT } as Location); - expect(getMessageBoxUrl()).toBe('https://tt02.altinn.no/ui/messagebox'); + expect(getMessageBoxUrl()).toBe('https://af.tt.altinn.no/'); jest.spyOn(window, 'location', 'get').mockReturnValueOnce({ host: hostAT } as Location); - expect(getMessageBoxUrl()).toBe('https://at21.altinn.cloud/ui/messagebox'); + expect(getMessageBoxUrl()).toBe('https://af.at.altinn.cloud/'); jest.spyOn(window, 'location', 'get').mockReturnValueOnce({ host: hostYT } as Location); - expect(getMessageBoxUrl()).toBe('https://yt01.altinn.cloud/ui/messagebox'); + expect(getMessageBoxUrl()).toBe('https://af.yt.altinn.cloud/'); jest.spyOn(window, 'location', 'get').mockReturnValueOnce({ host: hostProd } as Location); - expect(getMessageBoxUrl()).toBe('https://altinn.no/ui/messagebox'); + expect(getMessageBoxUrl()).toBe('https://af.altinn.no/'); jest.spyOn(window, 'location', 'get').mockReturnValueOnce({ host: hostDocker } as Location); expect(getMessageBoxUrl()).toBe('http://local.altinn.cloud/'); jest.spyOn(window, 'location', 'get').mockReturnValueOnce({ host: hostPodman } as Location); diff --git a/src/utils/urls/urlHelper.ts b/src/utils/urls/urlHelper.ts index e21a58beb0..3adc61870f 100644 --- a/src/utils/urls/urlHelper.ts +++ b/src/utils/urls/urlHelper.ts @@ -6,63 +6,83 @@ const redirectAndChangeParty = (goTo: string, partyId: number) => const prodStagingRegex = /^\w+\.apps\.((\w+\.)?altinn\.(no|cloud))$/; const localRegex = /^local\.altinn\.cloud(:\d+)?$/; +const testEnvironmentRegex = /^(at|tt|yt)\d+\.(altinn\.(no|cloud))$/; -export const returnBaseUrlToAltinn = (host: string): string | undefined => { - const prodStagingMatch = host.match(prodStagingRegex); - if (prodStagingMatch) { - const altinnHost = prodStagingMatch[1]; +function isLocalEnvironment(host: string): boolean { + return localRegex.test(host); +} + +function extractAltinnHost(host: string): string | undefined { + const match = host.match(prodStagingRegex); + return match?.[1]; +} + +function isProductionEnvironment(altinnHost: string): boolean { + return altinnHost === 'altinn.no'; +} + +function buildArbeidsflateUrl(altinnHost: string): string { + if (isProductionEnvironment(altinnHost)) { + return 'https://af.altinn.no/'; + } + + const envMatch = altinnHost.match(testEnvironmentRegex); + if (envMatch) { + const [, env, domain] = envMatch; + return `https://af.${env}.${domain}/`; + } + + return `https://af.${altinnHost}/`; +} + +function addPartyRedirect(arbeidsflateUrl: string, partyId: number, host: string): string | undefined { + const baseUrl = returnBaseUrlToAltinn(host); + if (!baseUrl) { + return undefined; + } + return `${baseUrl}${redirectAndChangeParty(arbeidsflateUrl, partyId)}`; +} - return `https://${altinnHost}/`; +export const returnBaseUrlToAltinn = (host: string): string | undefined => { + const altinnHost = extractAltinnHost(host); + if (!altinnHost) { + return undefined; } + return `https://${altinnHost}/`; }; -export const getMessageBoxUrl = (partyId?: number | undefined): string | undefined => { +export const getMessageBoxUrl = (partyId?: number): string | undefined => { const host = window.location.host; - if (host.match(localRegex)) { + if (isLocalEnvironment(host)) { return `http://${host}/`; } - const baseUrl = returnBaseUrlToAltinn(host); - if (!baseUrl) { - return; + const altinnHost = extractAltinnHost(host); + if (!altinnHost) { + return undefined; } - const messageBoxUrl = `${baseUrl}ui/messagebox`; + const arbeidsflateUrl = buildArbeidsflateUrl(altinnHost); - if (partyId === undefined) { - return messageBoxUrl; + if (partyId !== undefined) { + return addPartyRedirect(arbeidsflateUrl, partyId, host); } - return `${baseUrl}${redirectAndChangeParty(messageBoxUrl, partyId)}`; + return arbeidsflateUrl; }; export const returnUrlToArchive = (host: string): string | undefined => { - if (host.match(localRegex)) { + if (isLocalEnvironment(host)) { return `http://${host}/`; } - const prodStagingMatch = host.match(prodStagingRegex); - if (prodStagingMatch) { - const altinnHost = prodStagingMatch[1]; - // Production: af.altinn.no - // Test environments: af.{env}.altinn.{no|cloud} (without numbers like tt02, at21, yt01) - if (altinnHost === 'altinn.no') { - return 'https://af.altinn.no/'; - } - - const envMatch = altinnHost.match(/^(at|tt|yt)\d+\.(altinn\.(no|cloud))$/); - if (envMatch) { - const env = envMatch[1]; // at, tt, or yt (without numbers) - const domain = envMatch[2]; // altinn.no or altinn.cloud - return `https://af.${env}.${domain}/`; - } - - // Fallback for other environments - return `https://af.${altinnHost}/`; + const altinnHost = extractAltinnHost(host); + if (!altinnHost) { + return undefined; } - return undefined; + return buildArbeidsflateUrl(altinnHost); }; export const returnUrlToProfile = (host: string, partyId?: number | undefined): string | undefined => { From e42417a9869869270d1fb30522924b8e9838eb1a Mon Sep 17 00:00:00 2001 From: David Ovrelid Date: Wed, 12 Nov 2025 10:48:01 +0100 Subject: [PATCH 4/7] go directly to arbeidsflate, avoid redirectAndChangeParty --- src/utils/urls/urlHelper.ts | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/src/utils/urls/urlHelper.ts b/src/utils/urls/urlHelper.ts index 3adc61870f..81db1f6291 100644 --- a/src/utils/urls/urlHelper.ts +++ b/src/utils/urls/urlHelper.ts @@ -35,14 +35,6 @@ function buildArbeidsflateUrl(altinnHost: string): string { return `https://af.${altinnHost}/`; } -function addPartyRedirect(arbeidsflateUrl: string, partyId: number, host: string): string | undefined { - const baseUrl = returnBaseUrlToAltinn(host); - if (!baseUrl) { - return undefined; - } - return `${baseUrl}${redirectAndChangeParty(arbeidsflateUrl, partyId)}`; -} - export const returnBaseUrlToAltinn = (host: string): string | undefined => { const altinnHost = extractAltinnHost(host); if (!altinnHost) { @@ -51,7 +43,7 @@ export const returnBaseUrlToAltinn = (host: string): string | undefined => { return `https://${altinnHost}/`; }; -export const getMessageBoxUrl = (partyId?: number): string | undefined => { +export const getMessageBoxUrl = (): string | undefined => { const host = window.location.host; if (isLocalEnvironment(host)) { @@ -63,13 +55,7 @@ export const getMessageBoxUrl = (partyId?: number): string | undefined => { return undefined; } - const arbeidsflateUrl = buildArbeidsflateUrl(altinnHost); - - if (partyId !== undefined) { - return addPartyRedirect(arbeidsflateUrl, partyId, host); - } - - return arbeidsflateUrl; + return buildArbeidsflateUrl(altinnHost); }; export const returnUrlToArchive = (host: string): string | undefined => { From 7a3a5c23bca0db892460a31f8bb373270654c50e Mon Sep 17 00:00:00 2001 From: David Ovrelid Date: Wed, 12 Nov 2025 10:54:06 +0100 Subject: [PATCH 5/7] partyid as deprecated instead of removing --- src/utils/urls/urlHelper.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/utils/urls/urlHelper.ts b/src/utils/urls/urlHelper.ts index 81db1f6291..7be65c70a9 100644 --- a/src/utils/urls/urlHelper.ts +++ b/src/utils/urls/urlHelper.ts @@ -43,7 +43,11 @@ export const returnBaseUrlToAltinn = (host: string): string | undefined => { return `https://${altinnHost}/`; }; -export const getMessageBoxUrl = (): string | undefined => { +/** + * Returns the URL to the arbeidsflate (workspace) inbox. + * @param _partyId - Deprecated: Party selection is now handled by arbeidsflate itself + */ +export const getMessageBoxUrl = (_partyId?: number): string | undefined => { const host = window.location.host; if (isLocalEnvironment(host)) { From c5bc026552d32c16b6de8637e70e231c137d5ae7 Mon Sep 17 00:00:00 2001 From: David Ovrelid Date: Wed, 12 Nov 2025 14:07:54 +0100 Subject: [PATCH 6/7] feat: added new link to profile --- src/utils/urls/urlHelper.test.ts | 12 ++++++------ src/utils/urls/urlHelper.ts | 21 ++++++++------------- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/utils/urls/urlHelper.test.ts b/src/utils/urls/urlHelper.test.ts index adea528033..c632df988e 100644 --- a/src/utils/urls/urlHelper.test.ts +++ b/src/utils/urls/urlHelper.test.ts @@ -55,12 +55,12 @@ describe('Shared urlHelper.ts', () => { }); test('returnUrlTProfile() returning correct environments', () => { - expect(returnUrlToProfile(hostTT)).toBe('https://tt02.altinn.no/ui/profile'); - expect(returnUrlToProfile(hostAT)).toBe('https://at21.altinn.cloud/ui/profile'); - expect(returnUrlToProfile(hostYT)).toBe('https://yt01.altinn.cloud/ui/profile'); - expect(returnUrlToProfile(hostProd)).toBe('https://altinn.no/ui/profile'); - expect(returnUrlToProfile(hostDocker)).toBe('http://local.altinn.cloud/'); - expect(returnUrlToProfile(hostPodman)).toBe('http://local.altinn.cloud:8000/'); + expect(returnUrlToProfile(hostTT)).toBe('https://af.tt.altinn.no/profile'); + expect(returnUrlToProfile(hostAT)).toBe('https://af.at.altinn.cloud/profile'); + expect(returnUrlToProfile(hostYT)).toBe('https://af.yt.altinn.cloud/profile'); + expect(returnUrlToProfile(hostProd)).toBe('https://af.altinn.no/profile'); + expect(returnUrlToProfile(hostDocker)).toBe('http://local.altinn.cloud/profile'); + expect(returnUrlToProfile(hostPodman)).toBe('http://local.altinn.cloud:8000/profile'); expect(returnUrlToProfile(hostStudio)).toBe(undefined); expect(returnUrlToProfile(hostStudioDev)).toBe(undefined); expect(returnUrlToProfile(hostUnknown)).toBe(undefined); diff --git a/src/utils/urls/urlHelper.ts b/src/utils/urls/urlHelper.ts index 7be65c70a9..7cdd486269 100644 --- a/src/utils/urls/urlHelper.ts +++ b/src/utils/urls/urlHelper.ts @@ -75,23 +75,18 @@ export const returnUrlToArchive = (host: string): string | undefined => { return buildArbeidsflateUrl(altinnHost); }; -export const returnUrlToProfile = (host: string, partyId?: number | undefined): string | undefined => { - if (host.match(localRegex)) { - return `http://${host}/`; - } - - const baseUrl = returnBaseUrlToAltinn(host); - if (!baseUrl) { - return; +export const returnUrlToProfile = (host: string, _partyId?: number | undefined): string | undefined => { + if (isLocalEnvironment(host)) { + return `http://${host}/profile`; } - const profileUrl = `${baseUrl}ui/profile`; - - if (partyId === undefined) { - return profileUrl; + const altinnHost = extractAltinnHost(host); + if (!altinnHost) { + return undefined; } - return `${baseUrl}${redirectAndChangeParty(profileUrl, partyId)}`; + const arbeidsflateUrl = buildArbeidsflateUrl(altinnHost); + return `${arbeidsflateUrl.replace(/\/$/, '')}/profile`; }; export const returnUrlToAllForms = (host: string): string | undefined => { From a93f0a22baf779e5f58069a8c9282ad909323574 Mon Sep 17 00:00:00 2001 From: David Ovrelid Date: Wed, 12 Nov 2025 14:29:05 +0100 Subject: [PATCH 7/7] af now supports env-number --- src/utils/urls/urlHelper.test.ts | 18 +++++++++--------- src/utils/urls/urlHelper.ts | 10 ---------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/src/utils/urls/urlHelper.test.ts b/src/utils/urls/urlHelper.test.ts index c632df988e..4b59d506a8 100644 --- a/src/utils/urls/urlHelper.test.ts +++ b/src/utils/urls/urlHelper.test.ts @@ -23,11 +23,11 @@ const hostUnknown = 'www.vg.no'; describe('Shared urlHelper.ts', () => { test('returnUrlToMessageBox() returning correct environemnts', () => { jest.spyOn(window, 'location', 'get').mockReturnValueOnce({ host: hostTT } as Location); - expect(getMessageBoxUrl()).toBe('https://af.tt.altinn.no/'); + expect(getMessageBoxUrl()).toBe('https://af.tt02.altinn.no/'); jest.spyOn(window, 'location', 'get').mockReturnValueOnce({ host: hostAT } as Location); - expect(getMessageBoxUrl()).toBe('https://af.at.altinn.cloud/'); + expect(getMessageBoxUrl()).toBe('https://af.at21.altinn.cloud/'); jest.spyOn(window, 'location', 'get').mockReturnValueOnce({ host: hostYT } as Location); - expect(getMessageBoxUrl()).toBe('https://af.yt.altinn.cloud/'); + expect(getMessageBoxUrl()).toBe('https://af.yt01.altinn.cloud/'); jest.spyOn(window, 'location', 'get').mockReturnValueOnce({ host: hostProd } as Location); expect(getMessageBoxUrl()).toBe('https://af.altinn.no/'); jest.spyOn(window, 'location', 'get').mockReturnValueOnce({ host: hostDocker } as Location); @@ -55,9 +55,9 @@ describe('Shared urlHelper.ts', () => { }); test('returnUrlTProfile() returning correct environments', () => { - expect(returnUrlToProfile(hostTT)).toBe('https://af.tt.altinn.no/profile'); - expect(returnUrlToProfile(hostAT)).toBe('https://af.at.altinn.cloud/profile'); - expect(returnUrlToProfile(hostYT)).toBe('https://af.yt.altinn.cloud/profile'); + expect(returnUrlToProfile(hostTT)).toBe('https://af.tt02.altinn.no/profile'); + expect(returnUrlToProfile(hostAT)).toBe('https://af.at21.altinn.cloud/profile'); + expect(returnUrlToProfile(hostYT)).toBe('https://af.yt01.altinn.cloud/profile'); expect(returnUrlToProfile(hostProd)).toBe('https://af.altinn.no/profile'); expect(returnUrlToProfile(hostDocker)).toBe('http://local.altinn.cloud/profile'); expect(returnUrlToProfile(hostPodman)).toBe('http://local.altinn.cloud:8000/profile'); @@ -79,9 +79,9 @@ describe('Shared urlHelper.ts', () => { }); test('returnUrlToArchive() returning correct environments', () => { - expect(returnUrlToArchive(hostTT)).toBe('https://af.tt.altinn.no/'); - expect(returnUrlToArchive(hostAT)).toBe('https://af.at.altinn.cloud/'); - expect(returnUrlToArchive(hostYT)).toBe('https://af.yt.altinn.cloud/'); + expect(returnUrlToArchive(hostTT)).toBe('https://af.tt02.altinn.no/'); + expect(returnUrlToArchive(hostAT)).toBe('https://af.at21.altinn.cloud/'); + expect(returnUrlToArchive(hostYT)).toBe('https://af.yt01.altinn.cloud/'); expect(returnUrlToArchive(hostProd)).toBe('https://af.altinn.no/'); expect(returnUrlToArchive(hostDocker)).toBe('http://local.altinn.cloud/'); expect(returnUrlToArchive(hostPodman)).toBe('http://local.altinn.cloud:8000/'); diff --git a/src/utils/urls/urlHelper.ts b/src/utils/urls/urlHelper.ts index 7cdd486269..c547365025 100644 --- a/src/utils/urls/urlHelper.ts +++ b/src/utils/urls/urlHelper.ts @@ -1,12 +1,8 @@ export const altinnAppsIllustrationHelpCircleSvgUrl = 'https://altinncdn.no/img/illustration-help-circle.svg'; export const orgsListUrl = 'https://altinncdn.no/orgs/altinn-orgs.json'; -const redirectAndChangeParty = (goTo: string, partyId: number) => - `ui/Reportee/ChangeReporteeAndRedirect?goTo=${encodeURIComponent(goTo)}&R=${partyId}`; - const prodStagingRegex = /^\w+\.apps\.((\w+\.)?altinn\.(no|cloud))$/; const localRegex = /^local\.altinn\.cloud(:\d+)?$/; -const testEnvironmentRegex = /^(at|tt|yt)\d+\.(altinn\.(no|cloud))$/; function isLocalEnvironment(host: string): boolean { return localRegex.test(host); @@ -26,12 +22,6 @@ function buildArbeidsflateUrl(altinnHost: string): string { return 'https://af.altinn.no/'; } - const envMatch = altinnHost.match(testEnvironmentRegex); - if (envMatch) { - const [, env, domain] = envMatch; - return `https://af.${env}.${domain}/`; - } - return `https://af.${altinnHost}/`; }