Skip to content

Commit

Permalink
Janzz (#249)
Browse files Browse the repository at this point in the history
* Janzz-element for å søke opp janz-stilling

* Deploy to dev

* Bytt ut styrk-felt med janzz

* Manglet PAM_ONTOLOGI_URL

* pam-ontologi-kall krever Nav-CallId

* crypto ikke tilgjengelig, men det er uuid

* Sjekk melding fra azure om hvorfor det er feil

* Må lese ut av body

* Må lese ut av body

* Må lese ut av body

* Må lese ut av body

* Må lese ut av body

* Må lese ut av body

* Må lese ut av body

* Kall til pam-ontologi ser ikke ut til å kreve token

* Kallet skal være en GET, ikke en delete

* pam-ontologi må være i outbound for service-discovery

* Lagre Janzz i stilling i stedet for styrk

* Feil i adValidationReducer.ts

* Fjern Styrk-referanser

* Mangler css

* Feil i referanse til css-fil

* Initiell verdi på stilling

* bygg-feil på grunn av mock

* Legg til lokal mocking av pam-ontologi

* categoryList skal være en array, ikke en objekt

* Dispatch bare endring på categoryList om ny yrkestittel er valgt

* Fiks mock

* Les tittel-felt istedet for styrkEllerTittel

* Bruk tittel-felt hvis tilgjengelig

* Default mocktittel på stilling

* Bruk tittel-felt alltid

* Fjern styrkEllerTittel til fordel for det nye tittel-feltet

* fiks metode for å hente tittel, skal ikke ha default verdi

* Janzz felt skal kunne tømmes helt

* Janzz felt skal ikke under opprettelse ha stilling uten valgt jobbtittel

* Janzz felt skal ikke under opprettelse ha stilling uten valgt jobbtittel

* Legg på validering på janzz-feltet

* Legg på validering av janzz med feilmelding

* Bytt til combobox

* Fiks feil med at ingenting kan skrives inn

* Prøv med typeahead for yrke på første bokstav

* Refactor løsning

* Sett til minimum to bokstaver i yrkestypeahead

* Lag use metode for janzz titler

* Fiks url mot ontologi

* Fiks url ontologi

* Legg på headers slik at vi kan kalle arbeidsplassen for janzz kall

* Se om det går fint uten å sende unndefined janzz ved sletting av ykestittel

* FIlterer bort jobbmessetittel, og legg på påkrevd label for yrkestittel

* Legg inn nyhetssak for yrkestittel

* Legg til filteroptions

---------

Co-authored-by: Joar Aurdal <[email protected]>
  • Loading branch information
frodank and joarau authored Nov 1, 2024
1 parent f197306 commit de0da31
Show file tree
Hide file tree
Showing 33 changed files with 264 additions and 749 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ jobs:
deploy-til-dev:
name: Deploy til dev-gcp
needs: bygg-og-push-docker-image
if: github.event_name == 'workflow_dispatch' || github.ref == 'refs/heads/master' || github.ref == 'refs/heads/finn-kandidat-for-stilling'
if: github.event_name == 'workflow_dispatch' || github.ref == 'refs/heads/master' || github.ref == 'refs/heads/janzz'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
Expand Down
4 changes: 4 additions & 0 deletions deploy/nais.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ spec:
- application: presenterte-kandidater-api
- application: modiacontextholder
namespace: personoversikt
- application: pam-ontologi
namespace: teampam
external:
- host: {{ statistikkApiHost }}
- host: {{ kandidatApiHost }}
Expand Down Expand Up @@ -91,3 +93,5 @@ spec:
value: http://modiacontextholder.personoversikt
- name: KANDIDATVARSEL_API_URL
value: http://rekrutteringsbistand-kandidatvarsel-api
- name: PAM_ONTOLOGI_URL
value: http://pam-ontologi.teampam
8 changes: 5 additions & 3 deletions mock/stilling-api/mockStilling.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ export const mockStilling /* : Stilling */ = {
mediaList: [],
contactList: [],
title: 'TITTEL FRA ARBEIDSPLASSEN',
tittel: 'Tittel på stilling',
status: Status.Aktiv,
privacy: Privacy.Intern,
source: Kilde.Intern,
Expand All @@ -71,6 +72,7 @@ export const mockStilling /* : Stilling */ = {
categoryList: [
{
name: 'Kokk',
code: '1234',
categoryType: 'STYRK08NAV',
},
],
Expand Down Expand Up @@ -391,7 +393,7 @@ export const mockFormidling = {
phone: '',
},
],
styrkEllerTittel: 'Formidling',
tittel: 'Formidling',
},
stillingsinfo: {
eierNavident: null,
Expand All @@ -407,7 +409,7 @@ export const mockFormidlingMin = {
...mockFormidling,
stilling: {
...mockFormidling.stilling,
styrkEllerTittel: 'Formidling MIN',
tittel: 'Formidling MIN',
uuid: 'minFormidling',
administration: {
...mockFormidling.stilling.administration,
Expand All @@ -425,7 +427,7 @@ export const mockStoppetStilling = {
...mockStilling,
stilling: {
...mockFormidling.stilling,
styrkEllerTittel: 'Stoppet stilling',
tittel: 'Stoppet stilling',
uuid: 'stoppet',
status: Status.Stoppet,
// administration: {
Expand Down
8 changes: 4 additions & 4 deletions mock/stillingssok-proxy/mockEsStilling.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export const mockEsRekrutteringsbistandstilling: EsRekrutteringsbistandstilling
stilling: {
...mockStilling,
uuid: 'intern',
styrkEllerTittel: 'Intern stilling',
tittel: 'Intern stilling',
annonsenr: String(mockStilling.id),
categories: [
{
Expand Down Expand Up @@ -44,7 +44,7 @@ export const mockEsRekrutteringsbistandstillingMin: EsRekrutteringsbistandstilli
stilling: {
...mockEsRekrutteringsbistandstilling.stilling,
uuid: 'minIntern',
styrkEllerTittel: 'Intern stilling MIN',
tittel: 'Intern stilling MIN',
administration: {
...(mockEsRekrutteringsbistandstilling.stilling.administration as Administration),
navIdent: 'Z123456',
Expand All @@ -63,7 +63,7 @@ export const mockEsRekrutteringsbistandstillingEkstern: EsRekrutteringsbistandst
uuid: 'ekstern',
source: Kilde.Finn,
medium: Medium.Ass,
styrkEllerTittel: 'Ekstern stilling',
tittel: 'Ekstern stilling',
annonsenr: String(mockStilling.id),
categories: [
{
Expand Down Expand Up @@ -96,7 +96,7 @@ export const mockEsRekrutteringsbistandstillingEksternMin: EsRekrutteringsbistan
stilling: {
...mockEsRekrutteringsbistandstillingEkstern.stilling,
uuid: 'minEkstern',
styrkEllerTittel: 'Ekstern stilling MIN',
tittel: 'Ekstern stilling MIN',
administration: {
...(mockEsRekrutteringsbistandstillingEkstern.stilling
.administration as Administration),
Expand Down
4 changes: 2 additions & 2 deletions server/src/onBehalfOfToken.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,8 @@ async function hentNyttOnBehalfOfToken(accessToken: string, scope: string): Prom
return body as OboToken;
} else {
logger.info(
`Klarte ikke å hente on behalf of token for scope "${scope}", fikk status ${response.status} (${response.statusText}) årsak: `,
body
`Klarte ikke å hente on behalf of token for scope "${scope}", fikk status ${response.status} (${response.statusText}) årsak: ` +
JSON.stringify(body, null, 2)
);

throw response;
Expand Down
3 changes: 3 additions & 0 deletions server/src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ const scopes = {
presenterteKandidater: `api://${cluster}.toi.presenterte-kandidater-api/.default`,
kandidatsøk: `api://${cluster}.toi.rekrutteringsbistand-kandidatsok-api/.default`,
kandidatvarsel: `api://${cluster}.toi.rekrutteringsbistand-kandidatvarsel-api/.default`,
pamOntologi: `api://${cluster}.teampam.pam-ontologi/.default`,
};

const {
Expand All @@ -45,6 +46,7 @@ const {
PRESENTERTE_KANDIDATER_API,
MODIA_CONTEXT_HOLDER_API,
KANDIDATVARSEL_API_URL,
PAM_ONTOLOGI_URL,
} = process.env;

const startServer = () => {
Expand All @@ -64,6 +66,7 @@ const startServer = () => {
proxyMedOboToken('/stilling-api', STILLING_API_URL, scopes.stilling);
proxyMedOboToken('/kandidat-api', KANDIDAT_API_URL, scopes.kandidat);
proxyMedOboToken('/kandidatsok-api', KANDIDATSOK_API_URL, scopes.kandidatsøk);
proxyUtenToken('/pam-ontologi', PAM_ONTOLOGI_URL);
proxyMedOboToken('/kandidatvarsel-api', KANDIDATVARSEL_API_URL, scopes.kandidatvarsel);
proxyMedOboToken(
'/foresporsel-om-deling-av-cv-api',
Expand Down
2 changes: 2 additions & 0 deletions src/api/api.msw.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ import { foresporselApiMock } from './foresporsel-om-deling-av-cv-api/mock.msw';
import { kandidatApiMock } from './kandidat-api/mock.msw';
import { kandidatSokApiMock } from './kandidat-søk-api/mock.msw';
import { statistikkApiMock } from './statistikk-api/mock.msw';
import { pamOntologiMock } from './pam-ontologi/mock.msw';

export const apiMockHandlers = [
...kandidatApiMock,
...foresporselApiMock,
...statistikkApiMock,
...kandidatSokApiMock,
...stillingApiMock,
...pamOntologiMock,
];
12 changes: 9 additions & 3 deletions src/api/fetcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,23 @@ import { z, ZodSchema } from 'zod';

const basePath = import.meta.env.VITEST ? 'http://localhost:3000' : '';

export const getAPIwithSchema = <T>(schema: ZodSchema<T>): ((url: string) => Promise<T>) => {
export const getAPIwithSchema = <T>(
schema: ZodSchema<T>,
headers?: HeadersInit
): ((url: string) => Promise<T>) => {
return async (url: string) => {
const data = await getAPI(url);
const data = await getAPI(url, headers);
return schema.parse(data);
};
};

export const getAPI = async (url: string) => {
export const getAPI = async (url: string, headers?: HeadersInit) => {
const response = await fetch(basePath + url, {
method: 'GET',
credentials: 'include',
headers: {
...headers,
},
});

if (response.ok) {
Expand Down
3 changes: 3 additions & 0 deletions src/api/pam-ontologi/mock.msw.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { pamOntologiMockMsw } from './pamOntologi';

export const pamOntologiMock = [pamOntologiMockMsw];
37 changes: 37 additions & 0 deletions src/api/pam-ontologi/pamOntologi.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/**
* Endepunkt /statistikk
*/
import { HttpResponse, http } from 'msw';
import { z } from 'zod';

export const pamOntologiEndepunkt = `/pam-ontologi/rest/typeahead/stilling*`;

const janzzKategoriDTOSchema = z.object({
konseptId: z.number(),
styrk08: z.string(),
esco: z.string(),
escoLabel: z.string(),
label: z.string(),
undertype: z.string(),
});

export type janzzKategoriDTO = z.infer<typeof janzzKategoriDTOSchema>;

const janzzKategoriMock = (): janzzKategoriDTO[] | null => {
return [
{
konseptId: 358507,
styrk08: '1112',
esco: 'http://data.europa.eu/esco/isco/C1112',
escoLabel: 'Toppledere i offentlig administrasjon',
label: 'Departementsråd',
undertype: '',
},
];
};

export const pamOntologiMockMsw = http.get(pamOntologiEndepunkt, ({ request }) => {
const janzzKategorier = janzzKategoriMock();

return HttpResponse.json(janzzKategorier);
});
36 changes: 36 additions & 0 deletions src/api/stillings-api/hentJanzzyrker.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import useSWR from 'swr';
import { getAPIwithSchema } from '../fetcher';
import { z } from 'zod';
import { api } from 'felles/api';
import { v4 as uuidv4 } from 'uuid';

export const hentJanzzYrkerEndepunkt = `${api.pamOntologi}/rest/typeahead/stilling`;

export const janzzStillingSchema = z.object({
label: z.string(),
konseptId: z.number(),
styrk08: z.any().optional(),
esco: z.any().optional(),
escoLabel: z.any().optional(),
undertype: z.any().optional(),
});

const hentJanzzYrkerSchema = z.array(janzzStillingSchema);

export type JanzzStillingDTO = z.infer<typeof janzzStillingSchema>;
export type HentJanzzYrkerDTO = z.infer<typeof hentJanzzYrkerSchema>;

export const useHentJanzzYrker = (query: string) => {
const shouldFetch = query.length > 1;
const endpoint = shouldFetch
? `${hentJanzzYrkerEndepunkt}?stillingstittel=${encodeURIComponent(query)}`
: null;

const headers = {
'X-Requested-With': 'XMLHttpRequest',
'Cache-Control': 'no-cache, no-store',
'Nav-CallId': uuidv4(),
};

return useSWR(endpoint, getAPIwithSchema(hentJanzzYrkerSchema, headers));
};
5 changes: 5 additions & 0 deletions src/dev/DevMockModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { stillingsapiMock } from '../api/stillings-api/mock.msw';
import DevMockApi from './DevMockApi';
import DevRoller from './DevMockMeg';
import style from './DevTools.module.css';
import { pamOntologiMock } from '../api/pam-ontologi/mock.msw';

export interface IDevMockModal {
children?: React.ReactNode | undefined;
Expand Down Expand Up @@ -85,6 +86,10 @@ const mockConfig = [
navn: 'Stilling api',
mock: stillingsapiMock,
},
{
navn: 'Pam Ontologi',
mock: pamOntologiMock,
},
];

const DevMockModal: React.FC<IDevMockModal> = ({ children }) => {
Expand Down
1 change: 1 addition & 0 deletions src/felles/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export const api = {
modiaContextHolder: '/modiacontextholder/api',
arbeidsgiverNotifikasjon: '/arbeidsgiver-notifikasjon-api',
kandidatSokApi: '/kandidatsok-api',
pamOntologi: '/pam-ontologi',
};

export const videresendTilInnlogging = () => {
Expand Down
2 changes: 1 addition & 1 deletion src/felles/domene/stilling/EsStilling.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export type EsStilling = Stillingbase & {
contacts: Kontaktinfo[];
employer: EsArbeidsgiver | null;
properties: EsProperties;
styrkEllerTittel: string;
tittel: string;
};

export type EsProperties = Partial<{
Expand Down
15 changes: 2 additions & 13 deletions src/felles/domene/stilling/Stilling.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,24 +43,12 @@ export type Stilling = Stillingbase & {
};
};

// TODO: Fjern nå vi har byttet om
export const USE_STYRK_AS_TITLE_FEATURE_TOGGLE = true;
export const hentTittelFraStilling = (stilling: Stilling) => {
if (!USE_STYRK_AS_TITLE_FEATURE_TOGGLE) {
return stilling.title;
}

if (stilling.source !== 'DIR') {
return stilling.title;
}

const passendeStyrkkoder =
stilling.categoryList?.filter(({ categoryType }) => categoryType === 'STYRK08NAV') ?? [];

if (passendeStyrkkoder.length === 0) {
return 'Stilling uten valgt jobbtittel';
}
return passendeStyrkkoder.map((it) => it.name).join('/');
return stilling.categoryList?.find(({ categoryType }) => categoryType === 'JANZZ')?.name || '';
};

export enum System {
Expand Down Expand Up @@ -122,6 +110,7 @@ export type EsStyrkCategory = {

export type StyrkCategory = {
categoryType: string;
code: string;
name: string;
};

Expand Down
15 changes: 15 additions & 0 deletions src/felles/header/nyheter/nyhetssaker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,21 @@ const tilDato = (dag: number, måned: number, år: number, timer = 0, minutter =
new Date(år, måned - 1, dag, timer, minutter);

const nyhetssaker: Nyhet[] = [
{
dato: tilDato(1, 11, 2024),
tittel: 'STYRK byttet ut med yrkestittel i stillingsregistreringen',
innhold: (
<>
<p>Vi har byttet ut STYRK i stillingsregistreringen.</p>
<p>
Vi har byttet ut STYRK i stillingsregistreringen til en bedre løsning som lar
deg velge mer detaljerte og treffsikre stillingstyper. Valgt yrkestittel vil bli
tittel på stillingen. Yrkestittel setter du i feltet med overskriften
«Yrkestittel som vises på stillingen».
</p>
</>
),
},
{
dato: tilDato(13, 6, 2024),
tittel: 'Ny tilgangsstyring',
Expand Down
30 changes: 30 additions & 0 deletions src/stilling/api/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import Stilling, {
import { Miljø, getMiljø } from 'felles/miljø';
import { fetchGet, fetchPost, fetchPut } from './apiUtils';
import devVirksomheter from './devVirksomheter';
import { v4 as uuidv4 } from 'uuid';

export const postStilling = async (
stilling: Partial<Stilling>,
Expand Down Expand Up @@ -129,6 +130,35 @@ export const fetchOrgnrSuggestions = async (orgnummer: string): Promise<Enhetsre
];
};

export type JanzzStilling = {
konseptId: number;
label: string;
};

export const fetchJanzzYrker = async (typeahead: string): Promise<JanzzStilling[]> => {
const response = await fetch(
`${api.pamOntologi}/rest/typeahead/stilling?stillingstittel=${typeahead}`,
{
method: 'GET',
credentials: 'include',
headers: {
'X-Requested-With': 'XMLHttpRequest',
'Cache-Control': 'no-cache, no-store',
'Nav-CallId': uuidv4(),
},
}
);
const result = await response.json();
return result.map((janzzStilling: any) => ({
konseptId: janzzStilling.konseptId,
styrk08: janzzStilling.styrk08,
esco: janzzStilling.esco,
escoLabel: janzzStilling.escoLabel,
label: janzzStilling.label,
undertype: janzzStilling.undertype,
}));
};

/**
* TODO: Dette er en workaround, fordi det finnes annonser med ad.administration=null i databasen.
* Når databasen er migrert og ikke inneholder administration=null kan denne workarounden fjernes.
Expand Down
Loading

0 comments on commit de0da31

Please sign in to comment.