diff --git a/backend/src/main/kotlin/no/nav/mulighetsrommet/api/domain/Tiltaksgjennomforing.kt b/backend/src/main/kotlin/no/nav/mulighetsrommet/api/domain/Tiltaksgjennomforing.kt index 9bdb9af0ad..7be9d211c9 100644 --- a/backend/src/main/kotlin/no/nav/mulighetsrommet/api/domain/Tiltaksgjennomforing.kt +++ b/backend/src/main/kotlin/no/nav/mulighetsrommet/api/domain/Tiltaksgjennomforing.kt @@ -1,6 +1,7 @@ package no.nav.mulighetsrommet.api.domain import kotlinx.serialization.Serializable +import no.nav.mulighetsrommet.api.database.PGEnum import no.nav.mulighetsrommet.api.utils.DateSerializer import org.jetbrains.exposed.dao.id.IntIdTable import org.jetbrains.exposed.sql.Column @@ -12,7 +13,7 @@ data class Tiltaksgjennomforing( val id: Int? = 0, val tittel: String, val beskrivelse: String, - val tiltakstypeId: Int, + val tiltakskode: Tiltakskode, val tiltaksnummer: Int, @Serializable(with = DateSerializer::class) val fraDato: LocalDateTime? = null, @@ -21,7 +22,7 @@ data class Tiltaksgjennomforing( ) object TiltaksgjennomforingTable : IntIdTable() { - val tiltakstypeId = reference("tiltakstype_id", TiltakstypeTable) + val tiltakskode: Column = customEnumeration("tiltakskode", "tiltakskode", { value -> Tiltakskode.valueOf(value as String) }, { PGEnum("tiltakskode", it) }).references(TiltakstypeTable.tiltakskode) val tittel: Column = text("tittel") val beskrivelse: Column = text("beskrivelse") val tiltaksnummer: Column = integer("tiltaksnummer") diff --git a/backend/src/main/kotlin/no/nav/mulighetsrommet/api/domain/Tiltakstype.kt b/backend/src/main/kotlin/no/nav/mulighetsrommet/api/domain/Tiltakstype.kt index 5c47bcd08a..278e248b55 100644 --- a/backend/src/main/kotlin/no/nav/mulighetsrommet/api/domain/Tiltakstype.kt +++ b/backend/src/main/kotlin/no/nav/mulighetsrommet/api/domain/Tiltakstype.kt @@ -35,7 +35,7 @@ object TiltakstypeTable : IntIdTable() { val navn: Column = text("navn") val innsatsgruppeId: Column = integer("innsatsgruppe_id").references(InnsatsgruppeTable.id) val sanityId: Column = integer("sanity_id").nullable() - val tiltakskode = customEnumeration("tiltakskode", "tiltakskode", { value -> Tiltakskode.valueOf(value as String) }, { PGEnum("tiltakskode", it) }) + val tiltakskode: Column = customEnumeration("tiltakskode", "tiltakskode", { value -> Tiltakskode.valueOf(value as String) }, { PGEnum("tiltakskode", it) }) val fraDato: Column = datetime("dato_fra").nullable() val tilDato: Column = datetime("dato_til").nullable() val createdBy: Column = text("created_by").nullable() diff --git a/backend/src/main/kotlin/no/nav/mulighetsrommet/api/routes/TiltakstypeRoutes.kt b/backend/src/main/kotlin/no/nav/mulighetsrommet/api/routes/TiltakstypeRoutes.kt index 1368c81d3c..7aa2bdae46 100644 --- a/backend/src/main/kotlin/no/nav/mulighetsrommet/api/routes/TiltakstypeRoutes.kt +++ b/backend/src/main/kotlin/no/nav/mulighetsrommet/api/routes/TiltakstypeRoutes.kt @@ -7,12 +7,14 @@ import io.ktor.response.respondText import io.ktor.routing.Route import io.ktor.routing.get import no.nav.mulighetsrommet.api.domain.Tiltakskode +import no.nav.mulighetsrommet.api.services.TiltaksgjennomforingService import no.nav.mulighetsrommet.api.services.TiltakstypeService import org.koin.ktor.ext.inject fun Route.tiltakstypeRoutes() { val tiltakstypeService: TiltakstypeService by inject() + val tiltaksgjennomforingService: TiltaksgjennomforingService by inject() get("/api/tiltakstyper") { val tiltakstyper = tiltakstypeService.getTiltakstyper() @@ -28,4 +30,12 @@ fun Route.tiltakstypeRoutes() { call.respondText(text = "Fant ikke tiltakstype", status = HttpStatusCode.NotFound) } } + get("/api/tiltakstyper/{tiltakskode}/tiltaksgjennomforinger") { + runCatching { + val tiltakskode = Tiltakskode.valueOf(call.parameters["tiltakskode"]!!) + tiltaksgjennomforingService.getTiltaksgjennomforingerByTiltakskode(tiltakskode) + }.onSuccess { tiltaksgjennomforinger -> + call.respond(tiltaksgjennomforinger) + }.onFailure { call.respondText("Fant ikke tiltakstype", status = HttpStatusCode.NotFound) } + } } diff --git a/backend/src/main/kotlin/no/nav/mulighetsrommet/api/services/TiltaksgjennomforingService.kt b/backend/src/main/kotlin/no/nav/mulighetsrommet/api/services/TiltaksgjennomforingService.kt index bb3fe4caa5..ee3706f398 100644 --- a/backend/src/main/kotlin/no/nav/mulighetsrommet/api/services/TiltaksgjennomforingService.kt +++ b/backend/src/main/kotlin/no/nav/mulighetsrommet/api/services/TiltaksgjennomforingService.kt @@ -3,6 +3,7 @@ package no.nav.mulighetsrommet.api.services import no.nav.mulighetsrommet.api.database.DatabaseFactory import no.nav.mulighetsrommet.api.domain.Tiltaksgjennomforing import no.nav.mulighetsrommet.api.domain.TiltaksgjennomforingTable +import no.nav.mulighetsrommet.api.domain.Tiltakskode import org.jetbrains.exposed.sql.ResultRow import org.jetbrains.exposed.sql.select import org.jetbrains.exposed.sql.selectAll @@ -29,9 +30,9 @@ class TiltaksgjennomforingService(private val db: DatabaseFactory) { } } - suspend fun getTiltaksgjennomforingerByTiltakstypeId(id: Int): List { + suspend fun getTiltaksgjennomforingerByTiltakskode(tiltakskode: Tiltakskode): List { val tiltaksgjennomforingRows = db.dbQuery { - TiltaksgjennomforingTable.select { TiltaksgjennomforingTable.tiltakstypeId eq id }.toList() + TiltaksgjennomforingTable.select { TiltaksgjennomforingTable.tiltakskode eq tiltakskode }.toList() } return tiltaksgjennomforingRows.map { row -> toTiltaksgjennomforing(row) @@ -44,7 +45,7 @@ class TiltaksgjennomforingService(private val db: DatabaseFactory) { tittel = row[TiltaksgjennomforingTable.tittel], beskrivelse = row[TiltaksgjennomforingTable.beskrivelse], tiltaksnummer = row[TiltaksgjennomforingTable.tiltaksnummer], - tiltakstypeId = row[TiltaksgjennomforingTable.tiltakstypeId].value, + tiltakskode = row[TiltaksgjennomforingTable.tiltakskode], fraDato = row[TiltaksgjennomforingTable.fraDato], tilDato = row[TiltaksgjennomforingTable.tilDato] ) diff --git a/backend/src/main/resources/db/migration/V22__alter_tiltakstype_id.sql b/backend/src/main/resources/db/migration/V22__alter_tiltakstype_id.sql new file mode 100644 index 0000000000..87a9d2b3ae --- /dev/null +++ b/backend/src/main/resources/db/migration/V22__alter_tiltakstype_id.sql @@ -0,0 +1,16 @@ +-- Remove constraint +ALTER TABLE tiltaksgjennomforing DROP CONSTRAINT fk_tiltakstype; + +-- Add new column +ALTER TABLE tiltaksgjennomforing ADD COLUMN tiltakskode tiltakskode; +ALTER TABLE tiltaksgjennomforing + ADD CONSTRAINT fk_tiltakskode FOREIGN KEY (tiltakskode) REFERENCES tiltakstype (tiltakskode); + +-- Migrate rows +UPDATE tiltaksgjennomforing t1 +SET tiltakskode = t2.tiltakskode +FROM tiltakstype t2 +WHERE t1.id = t2.id; + +-- Drop old column +ALTER TABLE tiltaksgjennomforing DROP COLUMN tiltakstype_id; diff --git a/backend/src/main/resources/db/migration/testdata/R__1_add_tiltakstyper_data.sql b/backend/src/main/resources/db/migration/testdata/R__1_add_tiltakstyper_data.sql index eb01024e07..d3153bcca1 100644 --- a/backend/src/main/resources/db/migration/testdata/R__1_add_tiltakstyper_data.sql +++ b/backend/src/main/resources/db/migration/testdata/R__1_add_tiltakstyper_data.sql @@ -9,7 +9,7 @@ on conflict (id) do update set tittel = excluded.tittel, -- La til 50, ikke sikkert vi trenger flere. -- insert into tiltakstype (id, innsatsgruppe_id, navn, tiltakskode, dato_fra, dato_til) --- values (1, 1, 'Arbeid med Bistand (AB)', 'ABIST', '2001-01-01', '2019-12-31'), +-- values (1, 1, 'Arbeid med Bistand (AB)', 'ABIST', '2001-01-01', '2019-12-31') -- (2, 1, 'Arbeid med bistand A oppfølging', 'ABOPPF', '2008-08-01', '2013-12-31'), -- (3, 1, 'Arbeid med bistand B', 'ABTBOPPF', '2008-08-01', '2013-12-31'), -- (4, 1, 'Arbeid med bistand A utvidet oppfølging', 'ABUOPPF', '2008-08-01', '2013-12-31'), diff --git a/backend/src/main/resources/db/migration/testdata/R__2_add_tiltaksgjennomforinger_data.sql b/backend/src/main/resources/db/migration/testdata/R__2_add_tiltaksgjennomforinger_data.sql index cce09e378c..4c45c43d86 100644 --- a/backend/src/main/resources/db/migration/testdata/R__2_add_tiltaksgjennomforinger_data.sql +++ b/backend/src/main/resources/db/migration/testdata/R__2_add_tiltaksgjennomforinger_data.sql @@ -1,8 +1,7 @@ --- INSERT INTO tiltaksgjennomforing --- VALUES (1, 13, 'Truckførerkurs i Namsos', --- 'Her kan du lære å kræsje med truck.', 1000, '2020-06-01', '2020-12-01') +-- INSERT INTO tiltaksgjennomforing (id, tittel, beskrivelse, tiltaksnummer, fra_dato, til_dato, tiltakskode) +-- VALUES (1, 'Truckførerkurs i Namsos', +-- 'Her kan du lære å kræsje med truck.', 1000, '2020-06-01', '2020-12-01', 'ABIST') -- ON CONFLICT (id) DO UPDATE SET tittel = EXCLUDED.tittel, --- tiltakstype_id = EXCLUDED.tiltakstype_id, -- beskrivelse = EXCLUDED.beskrivelse; -- -- SELECT setval('tiltaksgjennomforing_id_seq', (SELECT MAX(id) from "tiltaksgjennomforing")); diff --git a/backend/src/main/resources/web/openapi.yml b/backend/src/main/resources/web/openapi.yml index 27f7fc2942..51b390a1b7 100644 --- a/backend/src/main/resources/web/openapi.yml +++ b/backend/src/main/resources/web/openapi.yml @@ -16,7 +16,7 @@ paths: text/plain: schema: type: string - enum: [PONG] + enum: [ PONG ] /api/innsatsgrupper: get: @@ -55,13 +55,35 @@ paths: operationId: getTiltakstype responses: 200: - description: The specified tiltakstype. + description: the specified tiltakstype. content: application/json: schema: $ref: "#/components/schemas/Tiltakstype" 404: - description: The specified tiltakstype was not found. + description: the specified tiltakstype was not found. + content: + text/plain: + schema: + type: string + /api/tiltakstyper/{tiltakskode}/tiltaksgjennomforinger: + parameters: + - $ref: "#/components/parameters/Tiltakskode" + get: + tags: + - mulighetsrommet + operationId: getTiltaksgjennomforingerByTiltakskode + responses: + 200: + description: An array of tiltaksgjennomføringer for specified tiltakskode. + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/Tiltaksgjennomforing" + 404: + description: the specified tiltakstype was not found. content: text/plain: schema: @@ -116,7 +138,7 @@ components: description: Tiltakskode required: true schema: - type: string + $ref: "#/components/schemas/Tiltakskode" schemas: Innsatsgruppe: @@ -132,22 +154,6 @@ components: - id - tittel - beskrivelse - UnsavedTiltakstype: - type: object - properties: - innsatsgruppe: - type: number - nullable: true - tittel: - type: string - beskrivelse: - type: string - ingress: - type: string - required: - - tittel - - beskrivelse - - ingress Tiltakstype: type: object properties: @@ -162,7 +168,7 @@ components: navn: type: string tiltakskode: - type: string + $ref: "#/components/schemas/Tiltakskode" fraDato: type: string nullable: true @@ -190,8 +196,8 @@ components: type: string beskrivelse: type: string - tiltakstypeId: - type: integer + tiltakskode: + $ref: "#/components/schemas/Tiltakskode" tiltaksnummer: type: string fraDato: @@ -211,7 +217,114 @@ components: - id - tittel - beskrivelse - - tiltakstypeId + - tiltakskode - tilataksnummer - fraDato - tilDato + Tiltakskode: + type: string + enum: + - ABIST + - ABOPPF + - ABTBOPPF + - ABUOPPF + - AMBF1 + - AMBF2 + - AMBF3 + - AMO + - AMOB + - AMOE + - AMOY + - ANNUTDANN + - ARBDOGNSM + - ARBFORB + - ARBRDAGSM + - ARBRRDOGN + - ARBRRHBAG + - ARBRRHBSM + - ARBRRHDAG + - ARBTREN + - ASV + - ATG + - AVKLARAG + - AVKLARKV + - AVKLARSP + - AVKLARSV + - AVKLARUS + - BIA + - BIO + - BREVKURS + - DIGIOPPARB + - DIVTILT + - EKSPEBIST + - ENKELAMO + - ENKFAGYRKE + - ETAB + - FLEKSJOBB + - FORSAMOENK + - FORSAMOGRU + - FORSFAGENK + - FORSFAGGRU + - FORSHOYUTD + - FUNKSJASS + - GRUFAGYRKE + - GRUNNSKOLE + - GRUPPEAMO + - HOYEREUTD + - HOYSKOLE + - INDJOBSTOT + - INDOPPFAG + - INDOPPFOLG + - INDOPPFSP + - INDOPPRF + - INKLUTILS + - INST_S + - IPSUNG + - ITGRTILS + - JOBBBONUS + - JOBBFOKUS + - JOBBK + - JOBBKLUBB + - JOBBSKAP + - KAT + - KURS + - LONNTIL + - LONNTILAAP + - LONNTILL + - LONNTILS + - MENTOR + - MIDLONTIL + - NETTAMO + - NETTKURS + - OPPLT2AAR + - PRAKSKJERM + - PRAKSORD + - PV + - REAKTUFOR + - REFINO + - SPA + - STATLAERL + - SUPPEMP + - SYSSLANG + - SYSSOFF + - TIDSUBLONN + - TILPERBED + - TILRETTEL + - TILRTILSK + - TILSJOBB + - UFØREPENLØ + - UTBHLETTPS + - UTBHPSLD + - UTBHSAMLI + - UTDPERMVIK + - UTDYRK + - UTVAOONAV + - UTVOPPFOPL + - VALS + - VARLONTIL + - VASV + - VATIAROR + - VIDRSKOLE + - VIKARBLED + - VV + - YHEMMOFF diff --git a/frontend/.env b/frontend/.env index ca0df793ab..d2b7f0e7d7 100644 --- a/frontend/.env +++ b/frontend/.env @@ -1,2 +1,2 @@ -VITE_BACKEND_API_ROOT='' +VITE_BACKEND_API_ROOT='http://localhost:8080' VITE_ENABLE_MOCK=true diff --git a/frontend/package.json b/frontend/package.json index 5063c125d4..47ed1af195 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -92,7 +92,7 @@ "eslint-plugin-react": "^7.24.0", "faker": "^5.5.3", "msw": "^0.36.2", - "openapi-typescript-codegen": "^0.12.5", + "openapi-typescript-codegen": "^0.20.1", "postcss": "^8.4.6", "prettier": "^2.5.1", "rimraf": "^3.0.2", diff --git a/frontend/src/Routes.tsx b/frontend/src/Routes.tsx index 8e20734d67..3ea9048d1f 100644 --- a/frontend/src/Routes.tsx +++ b/frontend/src/Routes.tsx @@ -7,7 +7,7 @@ import TiltakstypeOversikt from './views/tiltakstype-oversikt/TiltakstypeOversik const Routes = () => { return ( - + { return __request({ method: 'GET', path: `/api/tiltakstyper/${tiltakskode}`, errors: { - 404: `The specified tiltakstype was not found.`, + 404: `the specified tiltakstype was not found.`, + }, + }); + } + + /** + * @returns Tiltaksgjennomforing An array of tiltaksgjennomføringer for specified tiltakskode. + * @throws ApiError + */ + public static getTiltaksgjennomforingerByTiltakskode({ + tiltakskode, + }: { + /** Tiltakskode **/ + tiltakskode: Tiltakskode, + }): CancelablePromise> { + return __request({ + method: 'GET', + path: `/api/tiltakstyper/${tiltakskode}/tiltaksgjennomforinger`, + errors: { + 404: `the specified tiltakstype was not found.`, }, }); } diff --git a/frontend/src/components/tabell/TiltakstypeTabell.tsx b/frontend/src/components/tabell/TiltakstypeTabell.tsx index 7c4922a885..dbea135821 100644 --- a/frontend/src/components/tabell/TiltakstypeTabell.tsx +++ b/frontend/src/components/tabell/TiltakstypeTabell.tsx @@ -20,11 +20,12 @@ const TiltakstypeTabell = ({ tiltakstypeliste }: TiltakstypelisteProps) => { {tiltakstypeliste.map((tiltakstype: Tiltakstype) => ( - - {tiltakstype.tittel} + + {tiltakstype.navn} - {tiltakstype.ingress} + {/* Ingress er fjernet fra tiltakstype. Dette må vi håndtere i Sanity */} + INGRESS FRA SANITY ))} diff --git a/frontend/src/components/tiltakstypeoversikt/Tiltakstypeoversikt.tsx b/frontend/src/components/tiltakstypeoversikt/Tiltakstypeoversikt.tsx index a8057cab2b..efa1febb35 100644 --- a/frontend/src/components/tiltakstypeoversikt/Tiltakstypeoversikt.tsx +++ b/frontend/src/components/tiltakstypeoversikt/Tiltakstypeoversikt.tsx @@ -13,7 +13,7 @@ interface TiltaksoversiktProps { const Tiltakstypeoversikt = (props: TiltaksoversiktProps) => { const { tiltakstyper } = props; const fuse = new Fuse(tiltakstyper ?? [], { - keys: ['id', 'tittel', 'ingress'], + keys: ['id', 'navn', 'ingress'], shouldSort: true, threshold: 0.3, }); diff --git a/frontend/src/hooks/tiltaksgjennomforing/useTiltaksgjennomforingerByTiltakskode.ts b/frontend/src/hooks/tiltaksgjennomforing/useTiltaksgjennomforingerByTiltakskode.ts new file mode 100644 index 0000000000..b7922ba15b --- /dev/null +++ b/frontend/src/hooks/tiltaksgjennomforing/useTiltaksgjennomforingerByTiltakskode.ts @@ -0,0 +1,9 @@ +import { useQuery } from 'react-query'; +import { MulighetsrommetService, Tiltaksgjennomforing, Tiltakskode } from '../../api'; +import { QueryKeys } from '../../core/api/QueryKeys'; + +export default function useTiltaksgjennomforingerByTiltakskode(tiltakskode: Tiltakskode) { + return useQuery([QueryKeys.Tiltaksgjennomforinger, { tiltakskode }], () => + MulighetsrommetService.getTiltaksgjennomforingerByTiltakskode({ tiltakskode }) + ); +} diff --git a/frontend/src/hooks/tiltaksgjennomforing/useTiltaksgjennomforingerByTiltakstypeId.ts b/frontend/src/hooks/tiltaksgjennomforing/useTiltaksgjennomforingerByTiltakstypeId.ts deleted file mode 100644 index 10979b87d8..0000000000 --- a/frontend/src/hooks/tiltaksgjennomforing/useTiltaksgjennomforingerByTiltakstypeId.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { useQuery } from 'react-query'; -import { MulighetsrommetService, Tiltaksgjennomforing } from '../../api'; -import { QueryKeys } from '../../core/api/QueryKeys'; - -export default function useTiltaksgjennomforingerByTiltakstypeId(id: number) { - return useQuery([QueryKeys.Tiltaksgjennomforinger, { tiltakstypeId: id }], () => - MulighetsrommetService.getTiltaksgjennomforingerByTiltakstype({ id }) - ); -} diff --git a/frontend/src/hooks/tiltakstype/useTiltakstype.ts b/frontend/src/hooks/tiltakstype/useTiltakstype.ts index 745757e22a..b47c7e937f 100644 --- a/frontend/src/hooks/tiltakstype/useTiltakstype.ts +++ b/frontend/src/hooks/tiltakstype/useTiltakstype.ts @@ -1,7 +1,9 @@ import { useQuery } from 'react-query'; -import { MulighetsrommetService, Tiltakstype } from '../../api'; +import { MulighetsrommetService, Tiltakskode, Tiltakstype } from '../../api'; import { QueryKeys } from '../../core/api/QueryKeys'; -export default function useTiltakstype(id: number) { - return useQuery([QueryKeys.Tiltakstyper, id], () => MulighetsrommetService.getTiltakstype({ id })); +export default function useTiltakstype(tiltakskode: Tiltakskode) { + return useQuery([QueryKeys.Tiltakstyper, tiltakskode], () => + MulighetsrommetService.getTiltakstype({ tiltakskode }) + ); } diff --git a/frontend/src/index.tsx b/frontend/src/index.tsx index a880828f93..16bbc66549 100644 --- a/frontend/src/index.tsx +++ b/frontend/src/index.tsx @@ -11,8 +11,10 @@ OpenAPI.BASE = String(import.meta.env.VITE_BACKEND_API_ROOT); if (import.meta.env.VITE_ENABLE_MOCK === 'true') { worker.start(); - ReactDOM.render(, document.getElementById('mulighetsrommet-root')); } + +ReactDOM.render(, document.getElementById('mulighetsrommet-root')); + // TODO skal se på dette sammen med Håkon // else if (import.meta.env.VITE_ENABLE_MOCK === 'true') { // Navspa.eksporter('mulighetsrommet-flate', App); diff --git a/frontend/src/mock/api/handlers.ts b/frontend/src/mock/api/handlers.ts index 4bc81e0ebf..e04cb450b0 100644 --- a/frontend/src/mock/api/handlers.ts +++ b/frontend/src/mock/api/handlers.ts @@ -1,9 +1,8 @@ -import { rest, RestHandler, RestRequest } from 'msw'; -import { Tiltakstype } from '../../api'; +import { rest, RestHandler } from 'msw'; import { db } from '../database'; import { toTiltaksgjennomforing } from '../entities/tiltaksgjennomføring'; import { toTiltakstype } from '../entities/tiltakstype'; -import { notFound, ok } from './responses'; +import { badReq, notFound, ok } from './responses'; import { mockFeatures } from './data'; export const handlers: RestHandler[] = [ @@ -18,38 +17,15 @@ export const handlers: RestHandler[] = [ rest.get('*/api/tiltakstyper', () => { return ok(db.tiltakstype.getAll().map(toTiltakstype)); }), - rest.get('*/api/tiltakstyper/:id', req => { - const { id } = req.params; + rest.get('*/api/tiltakstyper/:tiltakskode', req => { + const { tiltakskode } = req.params as any; - const entity = db.tiltakstype.findFirst({ - where: { id: { equals: Number(id) } }, - }); - - if (!entity) { - return notFound(); + if (!tiltakskode) { + return badReq(); } - return ok(toTiltakstype(entity)); - }), - rest.post('*/api/tiltakstyper', (req: RestRequest) => { - const innsatsgruppe = db.innsatsgruppe.findFirst({ - where: { id: { equals: Number(req.body.innsatsgruppe) } }, - }); - - const entity = db.tiltakstype.create({ ...req.body, innsatsgruppe: innsatsgruppe ?? undefined }); - - return ok(entity); - }), - rest.put('*/api/tiltakstyper/:id', (req: RestRequest) => { - const { id } = req.params; - - const innsatsgruppe = db.innsatsgruppe.findFirst({ - where: { id: { equals: Number(req.body.innsatsgruppe) } }, - }); - - const entity = db.tiltakstype.update({ - where: { id: { equals: Number(id) } }, - data: { ...req.body, innsatsgruppe: innsatsgruppe ?? undefined }, + const entity = db.tiltakstype.findFirst({ + where: { tiltakskode: { equals: tiltakskode } }, }); if (!entity) { @@ -58,20 +34,11 @@ export const handlers: RestHandler[] = [ return ok(toTiltakstype(entity)); }), - rest.delete('*/api/tiltakstyper/:id', req => { - const { id } = req.params; - - const entity = db.tiltakstype.delete({ - where: { id: { equals: Number(id) } }, - }); - - return entity ? ok({}) : notFound(); - }), - rest.get('*/api/tiltakstyper/:id/tiltaksgjennomforinger', req => { - const { id } = req.params; + rest.get('*/api/tiltakstyper/:tiltakskode/tiltaksgjennomforinger', req => { + const { tiltakskode } = req.params as any; const items = db.tiltaksgjennomforing.findMany({ - where: { tiltakstypeId: { id: { equals: Number(id) } } }, + where: { tiltakskode: { equals: tiltakskode } }, }); return ok(items.map(toTiltaksgjennomforing)); diff --git a/frontend/src/mock/api/responses.ts b/frontend/src/mock/api/responses.ts index 7d4f4d1098..226bbb95ae 100644 --- a/frontend/src/mock/api/responses.ts +++ b/frontend/src/mock/api/responses.ts @@ -6,6 +6,7 @@ import { context, response } from 'msw'; export const Responses = { ok, notFound, + badReq, }; export function ok(data?: T) { @@ -15,3 +16,7 @@ export function ok(data?: T) { export function notFound(data?: T) { return response(context.delay(), context.status(404), data ? context.json(data) : context.text('Not found')); } + +export function badReq(data?: T) { + return response(context.delay(), context.status(400), data ? context.json(data) : context.text('Bad request')); +} diff --git a/frontend/src/mock/database.ts b/frontend/src/mock/database.ts index d81aaabcae..4f51d5fb17 100644 --- a/frontend/src/mock/database.ts +++ b/frontend/src/mock/database.ts @@ -13,13 +13,12 @@ export const definition = { tiltakstype: { id: idAutoIncrement(), innsatsgruppe: oneOf('innsatsgruppe', { nullable: true }), - tittel: String, - beskrivelse: String, - ingress: String, + tiltakskode: String, + navn: String, }, tiltaksgjennomforing: { id: idAutoIncrement(), - tiltakstypeId: oneOf('tiltakstype'), + tiltakskode: String, tiltaksnummer: String, tittel: String, beskrivelse: String, @@ -47,7 +46,7 @@ export const db = createMockDatabase(definition, (db: any) => { db.tiltakstype.getAll().forEach((tiltakstype: any) => { for (let index = 0; index < faker.datatype.number({ min: 1, max: 5 }); index++) { db.tiltaksgjennomforing.create({ - tiltakstypeId: tiltakstype, + tiltakskode: tiltakstype.tiltakskode, tiltaksnummer: faker.random.alphaNumeric(12), tittel: `Kjøreopplæring av ${faker.vehicle.manufacturer()}`, beskrivelse: faker.lorem.paragraph(1), diff --git "a/frontend/src/mock/entities/tiltaksgjennomf\303\270ring.ts" "b/frontend/src/mock/entities/tiltaksgjennomf\303\270ring.ts" index 9cb8fd0cfe..96efa5e3b0 100644 --- "a/frontend/src/mock/entities/tiltaksgjennomf\303\270ring.ts" +++ "b/frontend/src/mock/entities/tiltaksgjennomf\303\270ring.ts" @@ -1,5 +1,5 @@ import { Entity } from '@mswjs/data/lib/glossary'; -import { Tiltaksgjennomforing } from '../../api'; +import { Tiltaksgjennomforing, Tiltakskode } from '../../api'; import { DatabaseDictionary } from '../database'; export type TiltaksgjennomforingEntity = Entity; @@ -8,7 +8,7 @@ export function toTiltaksgjennomforing(entity: TiltaksgjennomforingEntity): Tilt return { id: entity.id, tiltaksnummer: entity.tiltaksnummer, - tiltakstypeId: entity.tiltakstypeId?.id ?? -1, + tiltakskode: Tiltakskode[entity.tiltakskode as keyof typeof Tiltakskode], tittel: entity.tittel, beskrivelse: entity.beskrivelse, fraDato: entity.fraDato, diff --git a/frontend/src/mock/entities/tiltakstype.ts b/frontend/src/mock/entities/tiltakstype.ts index 229dea74ce..00b4b6c445 100644 --- a/frontend/src/mock/entities/tiltakstype.ts +++ b/frontend/src/mock/entities/tiltakstype.ts @@ -1,5 +1,5 @@ import { Entity } from '@mswjs/data/lib/glossary'; -import { Tiltakstype } from '../../api'; +import { Tiltakskode, Tiltakstype } from '../../api'; import { DatabaseDictionary } from '../database'; export type TiltakstypeEntity = Entity; @@ -8,8 +8,7 @@ export function toTiltakstype(entity: TiltakstypeEntity): Tiltakstype { return { id: entity.id, innsatsgruppe: entity.innsatsgruppe?.id ?? null, - tittel: entity.tittel, - ingress: entity.ingress, - beskrivelse: entity.beskrivelse, + navn: entity.navn, + tiltakskode: Tiltakskode[entity.tiltakskode as keyof typeof Tiltakskode], }; } diff --git a/frontend/src/mock/fixtures/tiltakstyper.ts b/frontend/src/mock/fixtures/tiltakstyper.ts index 144c6cc571..14b5a4823c 100644 --- a/frontend/src/mock/fixtures/tiltakstyper.ts +++ b/frontend/src/mock/fixtures/tiltakstyper.ts @@ -1,137 +1,114 @@ -import faker from 'faker'; -import { UnsavedTiltakstype } from '../../api'; +import { Tiltakskode, Tiltakstype } from '../../api'; -export const tiltakstyper: UnsavedTiltakstype[] = [ +export const tiltakstyper: Tiltakstype[] = [ { innsatsgruppe: 1, - tittel: 'Opplæring', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Opplæring', + tiltakskode: Tiltakskode.ABIST, }, { innsatsgruppe: 1, - tittel: 'Funksjonsassistanse', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Funksjonsassistanse', + tiltakskode: Tiltakskode.ABIST, }, { innsatsgruppe: 1, - tittel: 'Utvidet oppfølging', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Utvidet oppfølging', + tiltakskode: Tiltakskode.ABIST, }, { innsatsgruppe: 1, - tittel: 'Avklaring', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Avklaring', + tiltakskode: Tiltakskode.AMBF1, }, { innsatsgruppe: 1, - tittel: 'Arbeidsmarkedsopplæring (AMO)', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Arbeidsmarkedsopplæring (AMO)', + tiltakskode: Tiltakskode.ARBRDAGSM, }, { innsatsgruppe: 1, - tittel: 'Ekspertbistand', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Ekspertbistand', + tiltakskode: Tiltakskode.ABIST, }, { innsatsgruppe: 1, - tittel: 'Jobbklubb', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Jobbklubb', + tiltakskode: Tiltakskode.ABIST, }, { innsatsgruppe: 2, - tittel: 'Oppfølging', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Oppfølging', + tiltakskode: Tiltakskode.ABOPPF, }, { innsatsgruppe: 2, - tittel: 'Digital jobbklubb', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Digital jobbklubb', + tiltakskode: Tiltakskode.ABOPPF, }, { innsatsgruppe: 2, - tittel: 'Fag- og yrkesopplæring', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Fag- og yrkesopplæring', + tiltakskode: Tiltakskode.ABOPPF, }, { innsatsgruppe: 2, - tittel: 'Arbeidstrening', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Arbeidstrening', + tiltakskode: Tiltakskode.ABOPPF, }, { innsatsgruppe: 2, - tittel: 'Arbeidsforberedende trening', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Arbeidsforberedende trening', + tiltakskode: Tiltakskode.ABTBOPPF, }, { innsatsgruppe: 2, - tittel: 'Midlertidig lønnstilskudd', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Midlertidig lønnstilskudd', + tiltakskode: Tiltakskode.ABTBOPPF, }, { innsatsgruppe: 2, - tittel: 'Varig lønnstilskudd', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Varig lønnstilskudd', + tiltakskode: Tiltakskode.ABTBOPPF, }, { innsatsgruppe: 3, - tittel: 'Varig tilrettelagt arbeid i skjermet virksomhet', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Varig tilrettelagt arbeid i skjermet virksomhet', + tiltakskode: Tiltakskode.ABTBOPPF, }, { innsatsgruppe: 3, - tittel: 'Varig tilrettelagt arbeid i ordinær virksomhet', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Varig tilrettelagt arbeid i ordinær virksomhet', + tiltakskode: Tiltakskode.ABTBOPPF, }, { innsatsgruppe: 3, - tittel: 'Inkluderingstilskudd', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Inkluderingstilskudd', + tiltakskode: Tiltakskode.ABTBOPPF, }, { innsatsgruppe: 3, - tittel: 'Funksjonsassistanse i arbeidslivet', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Funksjonsassistanse i arbeidslivet', + tiltakskode: Tiltakskode.ABTBOPPF, }, { innsatsgruppe: 3, - tittel: 'Mentor', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Mentor', + tiltakskode: Tiltakskode.ABTBOPPF, }, { innsatsgruppe: 3, - tittel: 'Arbeidsrettet rehabilitering', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Arbeidsrettet rehabilitering', + tiltakskode: Tiltakskode.ABTBOPPF, }, { innsatsgruppe: 3, - tittel: 'Individuell jobbstøtte', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Individuell jobbstøtte', + tiltakskode: Tiltakskode.ABTBOPPF, }, { innsatsgruppe: 4, - tittel: 'Tilskudd til sommerjobb', - beskrivelse: faker.lorem.paragraph(1), - ingress: faker.lorem.sentence(10), + navn: 'Tilskudd til sommerjobb', + tiltakskode: Tiltakskode.ABTBOPPF, }, ]; diff --git a/frontend/src/views/tiltakstype-detaljer/TiltakstypeDetaljer.tsx b/frontend/src/views/tiltakstype-detaljer/TiltakstypeDetaljer.tsx index 092611ff5e..6a3d75d6a4 100644 --- a/frontend/src/views/tiltakstype-detaljer/TiltakstypeDetaljer.tsx +++ b/frontend/src/views/tiltakstype-detaljer/TiltakstypeDetaljer.tsx @@ -1,21 +1,22 @@ import React from 'react'; import { useParams } from 'react-router-dom'; import MainView from '../../layouts/MainView'; -import useTiltaksgjennomforingerByTiltakstypeId from '../../hooks/tiltaksgjennomforing/useTiltaksgjennomforingerByTiltakstypeId'; import TiltaksgjennomforingsTabell from '../../components/tabell/TiltaksgjennomforingTabell'; import '../Tiltakstype-tiltaksgjennomforing-detaljer.less'; import { Alert, Loader, Ingress, BodyLong } from '@navikt/ds-react'; import useTiltakstype from '../../hooks/tiltakstype/useTiltakstype'; +import useTiltaksgjennomforingerByTiltakskode from '../../hooks/tiltaksgjennomforing/useTiltaksgjennomforingerByTiltakskode'; +import { Tiltakskode } from '../../api'; interface RouteParams { - id: string; + tiltakskode: string; } const TiltakstypeDetaljer = () => { const params = useParams(); - const id = Number(params.id); - const tiltakstype = useTiltakstype(id); - const tiltaksgjennomforinger = useTiltaksgjennomforingerByTiltakstypeId(id); + const tiltakskode = Tiltakskode[params.tiltakskode as keyof typeof Tiltakskode]; + const tiltakstype = useTiltakstype(tiltakskode); + const tiltaksgjennomforinger = useTiltaksgjennomforingerByTiltakskode(tiltakskode); if (tiltakstype.isError) { return Det skjedde en feil; @@ -29,13 +30,14 @@ const TiltakstypeDetaljer = () => { return null; } - const { tittel, ingress, beskrivelse } = tiltakstype.data; + const { navn } = tiltakstype.data; return ( - +
- {ingress} - {beskrivelse} + {/* Ingress og beskrivelse er fjernet fra tiltakstype. Dette må vi håndtere i Sanity */} + INGRESS FRA SANITY + BESKRIVELSE FRA SANITY