Skip to content

Commit 19c782e

Browse files
authored
Modia dekoratoren v3 (#1247)
Oppgradere til v3 av modia-dekoratøren, og kall modia context holder i stedet for å bruke vårt interne innlogget-bruker-endepunkt.
1 parent 9b8be77 commit 19c782e

14 files changed

+83
-123
lines changed

nais/dev-gcp-intern.yaml

-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,3 @@
88
"modiacontextholder-api-scope": "api://dev-gcp.personoversikt.modiacontextholder/.default"
99
"proxy-cluster": "dev-fss"
1010
"aad-redirect-url": "https://tiltaksgjennomforing.intern.dev.nav.no/oauth2/callback"
11-
"decorator-internal": "https://internarbeidsflatedecorator-q0.dev.adeo.no"
12-
"decorator-internal-script": "/internarbeidsflatedecorator/v2.1/static/js/head.v2.min.js"
13-
"decorator-internal-styling": "/internarbeidsflatedecorator/v2.1/static/css/main.css"

nais/dev-gcp-labs.yaml

-4
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,6 @@ spec:
3737
value: '{{{decorator-external-url}}}'
3838
- name: ENABLE_INTERNAL_MENU
3939
value: '{{{enable-internal-menu}}}'
40-
- name: DECORATOR_INTERNAL_SCRIPT
41-
value: '{{{decorator-external-script}}}'
42-
- name: DECORATOR_INTERNAL_STYLING
43-
value: '{{{decorator-external-styling}}}'
4440
- name: ARBEIDSGIVER_DIALOG_URL
4541
value: {{{arbeidsgiver-dialog}}}
4642
{{#if labs}}

nais/nais-gcp-intern.yaml

-6
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,6 @@ spec:
2727
value: '{{{logout-url}}}'
2828
- name: ENABLE_INTERNAL_MENU
2929
value: 'true'
30-
- name: DECORATOR_INTERNAL
31-
value: '{{{decorator-internal}}}'
32-
- name: DECORATOR_INTERNAL_SCRIPT
33-
value: '{{{decorator-internal-script}}}'
34-
- name: DECORATOR_INTERNAL_STYLING
35-
value: '{{{decorator-internal-styling}}}'
3630
- name: STILLINGSTITLER_URL
3731
value: http://tiltak-stillingstitler
3832
- name: TILTAK_PROXY_API_SCOPE

nais/prod-gcp-intern.yaml

-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,3 @@
88
"modiacontextholder-api-scope": "api://prod-gcp.personoversikt.modiacontextholder/.default"
99
"proxy-cluster": "prod-fss"
1010
"aad-redirect-url": "https://tiltaksgjennomforing.intern.nav.no/oauth2/callback"
11-
"decorator-internal": "https://internarbeidsflatedecorator.intern.nav.no"
12-
"decorator-internal-script": "/internarbeidsflatedecorator/v2.1/static/js/head.v2.min.js"
13-
"decorator-internal-styling": "/internarbeidsflatedecorator/v2.1/static/css/main.css"

server/src/config.ts

+6-8
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,14 @@ export const ARBEIDSGIVER_DIALOG_URL =
2727
MILJO !== Miljo.LOCALHOST ? process.env.ARBEIDSGIVER_DIALOG_URL : 'http://localhost:8080';
2828
export const DECORATOR_EXTERNAL_URL =
2929
MILJO !== Miljo.LOCALHOST ? process.env.DECORATOR_EXTERNAL_URL : 'http://localhost:8080';
30-
export const DECORATOR_INTERNAL =
31-
MILJO !== Miljo.LOCALHOST ? process.env.DECORATOR_INTERNAL : 'https://internarbeidsflatedecorator.intern.nav.no';
3230
export const DECORATOR_INTERNAL_SCRIPT =
33-
MILJO !== Miljo.LOCALHOST
34-
? process.env.DECORATOR_INTERNAL_SCRIPT
35-
: 'https://internarbeidsflatedecorator-q0.dev.adeo.no/internarbeidsflatedecorator/v2.1/static/js/head.v2.min.js';
31+
ENV === Env.PROD
32+
? 'https://cdn.nav.no/personoversikt/internarbeidsflate-decorator-v3/prod/latest/dist/bundle.js'
33+
: 'https://cdn.nav.no/personoversikt/internarbeidsflate-decorator-v3/dev/latest/dist/bundle.js';
3634
export const DECORATOR_INTERNAL_STYLING =
37-
MILJO !== Miljo.LOCALHOST
38-
? process.env.DECORATOR_INTERNAL_STYLING
39-
: 'https://internarbeidsflatedecorator-q0.dev.adeo.no/internarbeidsflatedecorator/v2.1/static/js/head.v2.min.js';
35+
ENV === Env.PROD
36+
? 'https://cdn.nav.no/personoversikt/internarbeidsflate-decorator-v3/prod/latest/dist/index.css'
37+
: 'https://cdn.nav.no/personoversikt/internarbeidsflate-decorator-v3/dev/latest/dist/index.css';
4038
export const ENABLE_EXTERNAL_MENU = process.env.ENABLE_EXTERNAL_MENU === 'true';
4139
export const ENABLE_INTERNAL_MENU = process.env.ENABLE_INTERNAL_MENU === 'true';
4240
export const INTERN_INGRESS = process.env.INTERN_INGRESS === 'true';

server/src/dekorator/appMedModiaDekoratoren.ts

+3-11
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,16 @@
11
import fs from 'node:fs';
22
import jsdom from 'jsdom';
33
import { Request, Response } from 'express';
4-
5-
import { DECORATOR_INTERNAL_STYLING, DECORATOR_INTERNAL_SCRIPT } from '../config';
4+
import { DECORATOR_INTERNAL_SCRIPT, DECORATOR_INTERNAL_STYLING } from '../config';
65

76
const { JSDOM } = jsdom;
87

9-
const scriptAddress: string =
10-
'https://internarbeidsflatedecorator.nais.adeo.no/internarbeidsflatedecorator/v2/static/js/head.v2.min.js';
11-
const styleAddress: string =
12-
'https://internarbeidsflatedecorator.nais.adeo.no/internarbeidsflatedecorator/v2/static/css/main.css';
13-
148
export async function getModiaDekoratoren(indexpath: string, _: Request, res: Response) {
159
const index: string = await getHTMLDocument(indexpath);
1610

1711
const { document } = new JSDOM(index).window;
1812
if (document) {
19-
console.log('document is defined');
2013
const updatedDocument = setInnHTML(document);
21-
console.log('current updated document: ', updatedDocument.documentElement.outerHTML);
2214
res.send(`<!DOCTYPE html>${updatedDocument.documentElement.outerHTML}`);
2315
} else {
2416
throw new Error('Feilet med oppdatering av index.html.');
@@ -41,11 +33,11 @@ async function getHTMLDocument(indexFilepath: string) {
4133

4234
function setInnHTML(document: Document) {
4335
const style = document.createElement('link');
44-
style.href = DECORATOR_INTERNAL_STYLING ?? styleAddress;
36+
style.href = DECORATOR_INTERNAL_STYLING;
4537
style.rel = 'stylesheet';
4638

4739
const script = document.createElement('script');
48-
script.src = DECORATOR_INTERNAL_SCRIPT ?? scriptAddress;
40+
script.src = DECORATOR_INTERNAL_SCRIPT;
4941

5042
insertHTML(document, style);
5143
insertHTML(document, script);

server/src/environment.d.ts

-3
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@ declare global {
66
API_AUDIENCE: string;
77
ARBEIDSGIVER_DIALOG_URL: string;
88
DECORATOR_EXTERNAL_URL: string;
9-
DECORATOR_INTERNAL: string;
10-
DECORATOR_INTERNAL_SCRIPT: string;
11-
DECORATOR_INTERNAL_STYLING: string;
129
ENABLE_EXTERNAL_MENU: string;
1310
ENABLE_INTERNAL_MENU: string;
1411
INTERN_INGRESS: string;
+4-37
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,12 @@
1-
import { createProxyMiddleware, responseInterceptor } from 'http-proxy-middleware';
1+
import { createProxyMiddleware } from 'http-proxy-middleware';
22
import { Express } from 'express';
33

4-
import { APIGW_URL, MODIACONTEXTHOLDER_API_SCOPE, DECORATOR_INTERNAL, TILTAK_PROXY_API_SCOPE } from '../config';
4+
import { MODIACONTEXTHOLDER_API_SCOPE } from '../config';
55
import { requestOboToken } from '../auth';
66

77
export function setup(app: Express) {
8-
console.log('intern proxy');
98
app.use(
10-
'/modiacontextholder/api/decorator',
11-
async (req, res, next) => {
12-
try {
13-
const accessToken = await requestOboToken(TILTAK_PROXY_API_SCOPE, req);
14-
req.headers.authorization = `Bearer ${accessToken}`;
15-
req.headers.cookie = 'innlogget-part=VEILEDER; ' + req.headers.cookie;
16-
next();
17-
} catch (e) {
18-
console.error(e);
19-
res.sendStatus(500);
20-
}
21-
},
22-
createProxyMiddleware({
23-
target: `${APIGW_URL}/tiltaksgjennomforing-api/innlogget-bruker`,
24-
ignorePath: true,
25-
selfHandleResponse: true,
26-
changeOrigin: true,
27-
on: {
28-
proxyRes: responseInterceptor(async (responseBuffer) => {
29-
console.log('interceptor', responseBuffer.toString('utf8'));
30-
const data = JSON.parse(responseBuffer.toString('utf8'));
31-
return JSON.stringify({ ...data, ident: data.identifikator || '' });
32-
}),
33-
},
34-
}),
35-
);
36-
37-
app.use(
38-
'/modiacontextholder/redirect',
9+
'/modiacontextholder',
3910
async (req, res, next) => {
4011
try {
4112
const accessToken = await requestOboToken(MODIACONTEXTHOLDER_API_SCOPE, req);
@@ -47,13 +18,9 @@ export function setup(app: Express) {
4718
}
4819
},
4920
createProxyMiddleware({
50-
target: 'http://modiacontextholder.personoversikt/modiacontextholder/redirect',
21+
target: 'http://modiacontextholder.personoversikt/modiacontextholder',
5122
followRedirects: false,
5223
changeOrigin: true,
5324
}),
5425
);
55-
56-
app.use('/internarbeidsflatedecorator', (req, res) => {
57-
res.redirect(DECORATOR_INTERNAL + req.originalUrl);
58-
});
5926
}

server/src/server.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ if (ENABLE_EXTERNAL_MENU) {
3737
contentSecurityPolicy: {
3838
useDefaults: true,
3939
directives: {
40-
'default-src': ["'self'", '*.nav.no'],
40+
'default-src': ["'self'", 'wss://*.nav.no', '*.nav.no'],
4141
'script-src': ["'self'", '*.nav.no', '*.adeo.no', "'unsafe-inline'"],
4242
'style-src': ["'self'", '*.nav.no', '*.adeo.no', "'unsafe-inline'"],
4343
'font-src': ["'self'", '*.nav.no', 'data:'],

src/AvtaleSide/steg/BeregningTilskudd/Feriepenger.tsx

-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ const Feriepenger: React.FC<Props> = ({ cls }: Props) => {
2828
options={feriepengeAlternativer}
2929
value={avtale.gjeldendeInnhold.feriepengesats + ''}
3030
onChange={(event: React.ChangeEvent<HTMLSelectElement>) => {
31-
console.log('event.target.value', event.target.value);
3231
settOgKalkulerBeregningsverdier({ feriepengesats: parseFloatIfFloatable(event.target.value) });
3332
}}
3433
children=""

src/InnloggingBoundary/InnloggingBoundary.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import Innloggingside from './Innloggingsside';
1616
import useInnlogget from './useInnlogget';
1717

1818
const dekoratorConfig = decoratorconfig();
19-
const InternflateDecorator = NAVSPA.importer<DecoratorProps>('internarbeidsflatefs');
19+
const InternflateDecorator = NAVSPA.importer<DecoratorProps>('internarbeidsflate-decorator-v3');
2020

2121
export const InnloggetBrukerContext = React.createContext<InnloggetBruker>({
2222
identifikator: '',

src/internflateDekorator/decoratorconfig.ts

+12-5
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
import { DecoratorProps } from '@/internflateDekorator/decoratorprops';
2+
import { miljo } from '@/utils/utils';
23

34
const decoratorconfig = (): DecoratorProps => {
45
return {
5-
appname: 'Tiltaksgjennomføring',
6-
useProxy: true,
7-
toggles: {
8-
visVeileder: true,
9-
},
6+
appName: 'Tiltaksgjennomføring',
7+
onEnhetChanged: () => {},
8+
onFnrChanged: () => {},
9+
fetchActiveEnhetOnMount: false,
10+
fetchActiveUserOnMount: false,
11+
showEnheter: false,
12+
showSearchArea: false,
13+
showHotkeys: false,
14+
environment: miljo() === 'prod' ? 'prod' : 'q2',
15+
urlFormat: 'NAV_NO',
16+
proxy: '/modiacontextholder',
1017
};
1118
};
1219

+44-40
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,61 @@
1-
export interface DecoratorProps {
2-
appname: string; // Navn på applikasjon
3-
fnr?: FnrContextvalue; // Konfigurasjon av fødselsnummer-kontekst
4-
enhet?: EnhetContextvalue; // Konfigurasjon av enhet-kontekst
5-
toggles?: TogglesConfig; // Konfigurasjon av hvilke elementer som skal vises i dekoratøren
6-
markup?: Markup; // Ekstra innhold i dekoratøren, kan brukes om man trenger å legge en knapp innenfor dekoratøren
7-
8-
/* Manuell overstyring av urlene til BFFs.
9-
Gjør alle kall til relativt path, og trenger derfor proxy oppsett. Default: false */
10-
useProxy?: boolean;
11-
12-
/* Manuell innsending av JWT, settes som Authorization-header.
13-
Om null sendes cookies vha credentials: 'include' */
14-
accessToken?: string;
15-
}
1+
// OBS: Innholder i denne filen er kopiert fra https://github.com/navikt/internarbeidsflatedecorator
162

17-
export interface TogglesConfig {
18-
visVeileder?: boolean; // Styrer om man skal vise informasjon om innlogget veileder
3+
export interface DecoratorProps {
4+
enhet?: string | undefined; // Konfigurasjon av enhet-kontekst
5+
accessToken?: string | undefined; // Manuell innsending av JWT, settes som Authorization-header. Om null sendes cookies vha credentials: 'include'
6+
fnr?: string | undefined; // Konfigurasjon av fødselsnummer-kontekst
7+
userKey?: string | undefined; // Om man ikke ønsker å bruke fnr i urler, kan andre apper kalle contextholder for å generere en midlertidig kode. Hvis App A skal navigere til App B som har dekoratøren, må App A først sende en post request til /fnr-code/generate med {fnr: string} i bodyen, dette returnerer {fnr: string, code: string} til App A. App A kan så navigere til App B og sende med denne koden. App B kan så sende den koden inn til dekoratøren i userKey propen og så henter dekoratøren fnr for den koden fra contextholderen.
8+
enableHotkeys?: boolean | undefined; // Aktivere hurtigtaster
9+
fetchActiveEnhetOnMount?: boolean | undefined; // Om enhet er undefined fra container appen, og denne er satt til true, henter den sist aktiv enhet og bruker denne.
10+
fetchActiveUserOnMount?: boolean | undefined; // Om fnr er undefined fra container appen, og denne er satt til true for at den skal hente siste aktiv fnr.
11+
onEnhetChanged: (enhetId?: string | null, enhet?: Enhet) => void; // Kalles når enheten endres
12+
onFnrChanged: (fnr?: string | null) => void; // Kalles når fnr enheten endres
13+
onLinkClick?: (link: { text: string; url: string }) => void; // Kan brukes for å legge til callbacks ved klikk på lenker i menyen. Merk at callbacken ikke kan awaites og man må selv håndtere at siden lukkes. Nyttig for å f.eks tracke navigasjon events i amplitude
14+
appName: string; // Navn på applikasjonen
15+
hotkeys?: Hotkey[]; // Konfigurasjon av hurtigtaster
16+
markup?: Markup; // Egen HTML
17+
showEnheter: boolean; // Vis enheter
18+
showSearchArea: boolean; // Vis søkefelt
19+
showHotkeys: boolean; // Vis hurtigtaster
20+
environment: Environment; // Miljø som skal brukes.
21+
urlFormat: UrlFormat; // URL format
22+
proxy?: string | undefined; // Manuell overstyring av urlene til BFFs. Gjør alle kall til relativt path hvis true, og bruker verdien som domene om satt til en string. Default: false
1923
}
2024

2125
export interface Markup {
2226
etterSokefelt?: string; // Gir muligheten for sende inn egen html som blir en del av dekoratøren
2327
}
2428

25-
/* Fnr/Enhet-konfiguration støttet både `Controlled` og `Uncontrolled` operasjon.
26-
// Ved bruk av `Controlled` må konsument-applikasjonen selv ta ansvar for oppdatering av `value` etter enhver `onChange`
27-
Dette er i motsetning til `Uncontrolled`, hvor dette håndteres av dekoratøren.
28-
Og alt konsument-applikasjonen trenger å gjøre er å følge med på `onChange`. */
29-
30-
export interface ControlledContextvalue<T> extends BaseContextvalue<T> {
31-
value: string | null;
29+
export interface Enhet {
30+
readonly enhetId: string;
31+
readonly navn: string;
3232
}
3333

34-
export interface UncontrolledContextvalue<T> extends BaseContextvalue<T> {
35-
initialValue: string | null;
36-
}
34+
// Miljø
35+
export type Environment = 'q0' | 'q1' | 'q2' | 'q3' | 'q4' | 'prod' | 'local' | 'mock';
36+
37+
export type UrlFormat = 'LOCAL' | 'NAV_NO' | 'ANSATT'; // UrlFormat. Brukes om proxy ikke er satt & i url til websocket.
3738

38-
export interface BaseContextvalue<T> {
39-
display: T;
40-
skipModal?: boolean;
41-
ignoreWsEvents?: boolean;
42-
onChange(value: string | null): void;
39+
export interface HotkeyObject {
40+
char: string;
41+
altKey?: boolean;
42+
ctrlKey?: boolean;
43+
metaKey?: boolean;
44+
shiftKey?: boolean;
4345
}
4446

45-
export type Contextvalue<T> = ControlledContextvalue<T> | UncontrolledContextvalue<T>;
47+
export interface HotkeyDescription {
48+
key: HotkeyObject;
49+
description: string;
50+
forceOverride?: boolean;
51+
}
4652

47-
export enum EnhetDisplay {
48-
ENHET = 'ENHET',
49-
ENHET_VALG = 'ENHET_VALG',
53+
export interface ActionHotKey extends HotkeyDescription {
54+
action(event: KeyboardEvent): void;
5055
}
5156

52-
export enum FnrDisplay {
53-
SOKEFELT = 'SOKEFELT',
57+
export interface DocumentingHotKey extends HotkeyDescription {
58+
documentationOnly: boolean;
5459
}
5560

56-
export type EnhetContextvalue = Contextvalue<EnhetDisplay>;
57-
export type FnrContextvalue = Contextvalue<FnrDisplay>;
61+
export type Hotkey = ActionHotKey | DocumentingHotKey;

src/utils/utils.ts

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export const miljo = () => {
2+
switch (window.location.hostname) {
3+
case 'arbeidsgiver.nav.no':
4+
case 'tiltaksgjennomforing.intern.nav.no':
5+
return 'prod';
6+
case 'tiltaksgjennomforing.intern.dev.nav.no':
7+
case 'tiltaksgjennomforing.ekstern.dev.nav.no':
8+
return 'dev';
9+
default:
10+
return 'local';
11+
}
12+
};

0 commit comments

Comments
 (0)