Skip to content

Commit 05f3b84

Browse files
authored
IS-2300: Decorator v3 (#508)
1 parent 3666def commit 05f3b84

10 files changed

+103
-99
lines changed

.env.template

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ AUTH_REDIRECT_URI=http://localhost:8080/oauth2/callback
44
EREG_HOST=ereg-services-q1.dev-fss-pub.nais.io
55
FLEXJAR_AAD_APP_CLIENT_ID=dev-gcp.flex.flexjar-backend
66
FLEXJAR_HOST=http://flexjar-backend.intern.dev.nav.no
7-
INTERNARBEIDSFLATEDECORATOR_HOST=internarbeidsflatedecorator-q0.dev.intern.nav.no
87
MODIACONTEXTHOLDER_HOST=modiacontextholder.dev.intern.nav.no
98
MODIACONTEXTHOLDER_AAD_APP_CLIENT_ID="dev-gcp.personoversikt.modiacontextholder"
109
SYFOOVERSIKTSRV_HOST=syfooversiktsrv.intern.nav.no

.nais/naiserator-dev.yaml

-3
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ spec:
5151
outbound:
5252
external:
5353
- host: "login.microsoftonline.com"
54-
- host: "internarbeidsflatedecorator-q1.dev-fss-pub.nais.io"
5554
- host: "ereg-services-q1.dev-fss-pub.nais.io"
5655
- host: "teamsykefravr-unleash-api.nav.cloud.nais.io"
5756
rules:
@@ -77,8 +76,6 @@ spec:
7776
value: "syfooversikt-redis"
7877
- name: EREG_HOST
7978
value: "https://ereg-services-q1.dev-fss-pub.nais.io"
80-
- name: INTERNARBEIDSFLATEDECORATOR_HOST
81-
value: "https://internarbeidsflatedecorator-q1.dev-fss-pub.nais.io"
8279
- name: SYFOOVERSIKTSRV_AAD_APP_CLIENT_ID
8380
value: "dev-gcp.teamsykefravr.syfooversiktsrv"
8481
- name: SYFOPERSON_AAD_APP_CLIENT_ID

.nais/naiserator-prod.yaml

-3
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ spec:
5151
outbound:
5252
external:
5353
- host: "login.microsoftonline.com"
54-
- host: "internarbeidsflatedecorator.prod-fss-pub.nais.io"
5554
- host: "ereg-services.prod-fss-pub.nais.io"
5655
- host: "teamsykefravr-unleash-api.nav.cloud.nais.io"
5756
rules:
@@ -76,8 +75,6 @@ spec:
7675
value: "syfooversikt-redis"
7776
- name: EREG_HOST
7877
value: "https://ereg-services.prod-fss-pub.nais.io"
79-
- name: INTERNARBEIDSFLATEDECORATOR_HOST
80-
value: "https://internarbeidsflatedecorator.prod-fss-pub.nais.io"
8178
- name: SYFOOVERSIKTSRV_AAD_APP_CLIENT_ID
8279
value: "prod-gcp.teamsykefravr.syfooversiktsrv"
8380
- name: SYFOPERSON_AAD_APP_CLIENT_ID

public/index.html

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@
66
<meta charset="UTF-8" />
77
<meta name="viewport" content="width=device-width, initial-scale=1" />
88
<% if (process.env.NODE_ENV !== 'development') { %>
9-
<script src="/internarbeidsflatedecorator/v2.1/static/js/head.v2.min.js"></script>
9+
<script src="https://cdn.nav.no/personoversikt/internarbeidsflate-decorator-v3/prod/latest/dist/bundle.js"></script>
1010
<link
1111
rel="stylesheet"
12-
href="/internarbeidsflatedecorator/v2.1/static/css/main.css"
12+
href="https://cdn.nav.no/personoversikt/internarbeidsflate-decorator-v3/prod/latest/dist/index.css"
1313
/>
1414
<% } %> <% if (process.env.NODE_ENV === 'development') { %>
15-
<script src="https://internarbeidsflatedecorator-q0.intern.dev.nav.no/internarbeidsflatedecorator/v2.1/static/js/head.v2.min.js"></script>
15+
<script src="https://cdn.nav.no/personoversikt/internarbeidsflate-decorator-v3/dev/latest/dist/bundle.js"></script>
1616
<link
1717
rel="stylesheet"
18-
href="https://internarbeidsflatedecorator-q0.intern.dev.nav.no/internarbeidsflatedecorator/v2.1/static/css/main.css"
18+
href="https://cdn.nav.no/personoversikt/internarbeidsflate-decorator-v3/dev/latest/dist/index.css"
1919
/>
2020
<% } %>
2121
</head>

server/config.ts

+1-4
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,6 @@ export const auth = {
107107
responseMode: 'query',
108108
tokenEndpointAuthSigningAlg: 'RS256',
109109

110-
internarbeidsflatedecoratorHost: envVar({
111-
name: 'INTERNARBEIDSFLATEDECORATOR_HOST',
112-
}),
113-
114110
ereg: {
115111
applicationName: 'ereg',
116112
clientId: '',
@@ -126,6 +122,7 @@ export const auth = {
126122
host: envVar({
127123
name: 'MODIACONTEXTHOLDER_HOST',
128124
}),
125+
removePathPrefix: true,
129126
},
130127
syfooversiktsrv: {
131128
applicationName: 'syfooversiktsrv',

server/proxy.ts

-22
Original file line numberDiff line numberDiff line change
@@ -230,28 +230,6 @@ export const setupProxy = (
230230
}
231231
);
232232

233-
router.use(
234-
'/internarbeidsflatedecorator',
235-
expressHttpProxy(Config.auth.internarbeidsflatedecoratorHost, {
236-
https: true,
237-
proxyReqPathResolver: (req) => {
238-
return `/internarbeidsflatedecorator${req.url}`;
239-
},
240-
proxyErrorHandler: (err, res, next) => {
241-
console.log(
242-
`Error in proxy for internarbeidsflatedecorator ${err.message}, ${err.code}`
243-
);
244-
if (err && err.code === 'ECONNREFUSED') {
245-
console.log('proxyErrorHandler: Got ECONNREFUSED');
246-
return res
247-
.status(503)
248-
.send({ message: `Could not contact internarbeidsflatedecorator` });
249-
}
250-
next(err);
251-
},
252-
})
253-
);
254-
255233
router.use(
256234
'/flexjar-backend/*',
257235
(

src/decorator/Decorator.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { useAktivBruker } from '@/data/modiacontext/useAktivBruker';
77
import { linkToNewHostAndPath, Subdomain } from '@/utils/miljoUtil';
88

99
const InternflateDecorator = NAVSPA.importer<DecoratorProps>(
10-
'internarbeidsflatefs'
10+
'internarbeidsflate-decorator-v3'
1111
);
1212

1313
const Decorator = () => {

src/decorator/decoratorConfig.ts

+39-26
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,51 @@
1-
import { DecoratorProps, EnhetDisplay, FnrDisplay } from './decoratorProps';
2-
3-
const RESET_VALUE = '\u0000';
1+
import {
2+
DecoratorProps,
3+
Enhet,
4+
Environment,
5+
UrlFormat,
6+
} from './decoratorProps';
7+
import { isAnsattDev, isDev, isLocal, isProd } from '@/utils/miljoUtil';
48

59
const decoratorConfig = (
610
setFnr: (fnr: string) => void,
711
setEnhet: (enhet: string) => void
812
): DecoratorProps => {
913
return {
10-
appname: 'Sykefraværsoppfølging',
11-
fnr: {
12-
initialValue: RESET_VALUE,
13-
display: FnrDisplay.SOKEFELT,
14-
ignoreWsEvents: true,
15-
skipModal: true,
16-
onChange: (value) => {
17-
if (value) {
18-
setFnr(value);
19-
}
20-
},
21-
},
22-
enhet: {
23-
initialValue: undefined,
24-
display: EnhetDisplay.ENHET_VALG,
25-
onChange(value): void {
26-
if (value) {
27-
setEnhet(value);
28-
}
29-
},
14+
appName: 'Sykefraværsoppfølging',
15+
fetchActiveEnhetOnMount: true,
16+
onEnhetChanged: (enhetId?: string | null, enhet?: Enhet) => {
17+
setEnhet(enhetId || enhet?.enhetId || '');
3018
},
31-
toggles: {
32-
visVeileder: true,
19+
onFnrChanged: (fnr?: string | null) => {
20+
if (fnr) {
21+
setFnr(fnr);
22+
}
3323
},
34-
useProxy: true,
24+
showEnheter: true,
25+
showSearchArea: true,
26+
showHotkeys: false,
27+
environment: getEnvironment(),
28+
urlFormat: getUrlFormat(),
29+
proxy: '/modiacontextholder',
3530
};
3631
};
3732

33+
const getEnvironment = (): Environment => {
34+
if (isProd()) {
35+
return 'prod';
36+
} else if (isDev()) {
37+
return 'q2';
38+
} else {
39+
return 'local';
40+
}
41+
};
42+
43+
const getUrlFormat = (): UrlFormat => {
44+
if (isAnsattDev()) {
45+
return 'ANSATT';
46+
} else if (isLocal()) {
47+
return 'LOCAL';
48+
} else return 'NAV_NO';
49+
};
50+
3851
export default decoratorConfig;

src/decorator/decoratorProps.ts

+53-34
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,67 @@
1-
interface TogglesConfig {
2-
visVeileder: boolean;
1+
export interface DecoratorProps {
2+
enhet?: string | undefined; // Konfigurasjon av enhet-kontekst
3+
accessToken?: string | undefined; // Manuell innsending av JWT, settes som Authorization-header. Om null sendes cookies vha credentials: 'include'
4+
fnr?: string | undefined; // Konfigurasjon av fødselsnummer-kontekst
5+
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.
6+
enableHotkeys?: boolean | undefined; // Aktivere hurtigtaster
7+
fetchActiveEnhetOnMount?: boolean | undefined; // Om enhet er undefined fra container appen, og denne er satt til true, henter den sist aktiv enhet og bruker denne.
8+
fetchActiveUserOnMount?: boolean | undefined; // Om fnr er undefined fra container appen, og denne er satt til true for at den skal hente siste aktiv fnr.
9+
onEnhetChanged: (enhetId?: string | null, enhet?: Enhet) => void; // Kalles når enheten endres
10+
onFnrChanged: (fnr?: string | null) => void; // Kalles når fnr enheten endres
11+
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
12+
appName: string; // Navn på applikasjonen
13+
hotkeys?: Hotkey[]; // Konfigurasjon av hurtigtaster
14+
markup?: Markup; // Egen HTML
15+
showEnheter: boolean; // Vis enheter
16+
showSearchArea: boolean; // Vis søkefelt
17+
showHotkeys: boolean; // Vis hurtigtaster
18+
environment: Environment; // Miljø som skal brukes.
19+
urlFormat: UrlFormat; // URL format
20+
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
321
}
422

5-
interface Markup {
6-
etterSokefelt?: string;
23+
export interface Markup {
24+
etterSokefelt?: string; // Gir muligheten for sende inn egen html som blir en del av dekoratøren
725
}
826

9-
export interface ControlledContextvalue<T> extends BaseContextvalue<T> {
10-
value?: string;
11-
}
12-
interface UncontrolledContextvalue<T> extends BaseContextvalue<T> {
13-
initialValue?: string;
27+
export interface Enhet {
28+
readonly enhetId: string;
29+
readonly navn: string;
1430
}
1531

16-
interface BaseContextvalue<T> {
17-
display: T;
18-
onChange(value?: string): void;
19-
skipModal?: boolean;
20-
ignoreWsEvents?: boolean;
21-
}
32+
// Miljø
33+
export type Environment =
34+
| 'q0'
35+
| 'q1'
36+
| 'q2'
37+
| 'q3'
38+
| 'q4'
39+
| 'prod'
40+
| 'local'
41+
| 'mock';
2242

23-
export type Contextvalue<T> =
24-
| ControlledContextvalue<T>
25-
| UncontrolledContextvalue<T>;
43+
export type UrlFormat = 'LOCAL' | 'NAV_NO' | 'ANSATT'; // UrlFormat. Brukes om proxy ikke er satt & i url til websocket.
2644

27-
export enum EnhetDisplay {
28-
ENHET = 'ENHET',
29-
ENHET_VALG = 'ENHET_VALG',
45+
export interface HotkeyObject {
46+
char: string;
47+
altKey?: boolean;
48+
ctrlKey?: boolean;
49+
metaKey?: boolean;
50+
shiftKey?: boolean;
3051
}
3152

32-
export enum FnrDisplay {
33-
SOKEFELT = 'SOKEFELT',
53+
export interface HotkeyDescription {
54+
key: HotkeyObject;
55+
description: string;
56+
forceOverride?: boolean;
3457
}
3558

36-
type EnhetContextvalue = Contextvalue<EnhetDisplay>;
37-
type FnrContextvalue = Contextvalue<FnrDisplay>;
38-
type ProxyConfig = boolean | string;
59+
export interface ActionHotKey extends HotkeyDescription {
60+
action(event: KeyboardEvent): void;
61+
}
3962

40-
export interface DecoratorProps {
41-
appname: string;
42-
fnr?: FnrContextvalue;
43-
enhet?: EnhetContextvalue;
44-
toggles?: TogglesConfig;
45-
markup?: Markup;
46-
useProxy?: ProxyConfig;
47-
accessToken?: string;
63+
export interface DocumentingHotKey extends HotkeyDescription {
64+
documentationOnly: boolean;
4865
}
66+
67+
export type Hotkey = ActionHotKey | DocumentingHotKey;

src/utils/miljoUtil.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,14 @@ export function isDev(): boolean {
22
return (
33
window.location.href.indexOf('dev.intern.nav.no') > -1 ||
44
window.location.href.indexOf('intern.dev.nav.no') > -1 ||
5-
window.location.href.indexOf('ansatt.dev.nav.no') > -1
5+
isAnsattDev()
66
);
77
}
88

9+
export const isAnsattDev = (): boolean => {
10+
return window.location.href.indexOf('ansatt.dev.nav.no') > -1;
11+
};
12+
913
export function isLocal(): boolean {
1014
return window.location.host.indexOf('localhost') > -1;
1115
}

0 commit comments

Comments
 (0)