diff --git a/mocks/collections.json b/mocks/collections.json index 60a03376..3d235442 100644 --- a/mocks/collections.json +++ b/mocks/collections.json @@ -1,7 +1,7 @@ [ { "id": "base", - "routes": ["add-headers:enabled", "get-users:success", "get-user:success", "get-haut:success", "get-haku:real"] + "routes": ["add-headers:enabled", "get-users:success", "get-user:success", "get-haut:success", "get-haku:real", "get-hakukohteet:success"] }, { "id": "no-headers", diff --git a/mocks/routes/kouta/hakukohteet.js b/mocks/routes/kouta/hakukohteet.js new file mode 100644 index 00000000..94857fa5 --- /dev/null +++ b/mocks/routes/kouta/hakukohteet.js @@ -0,0 +1,292 @@ +const HAKUKOHTEET = +[ + { + "oid": "1.2.246.562.20.00000000000000045105", + "toteutusOid": "1.2.246.562.17.00000000000000019343", + "hakuOid": "1.2.246.562.29.00000000000000045102", + "tila": "julkaistu", + "nimi": { + "en": "Finnish MAOL competition route, Technology, Sustainable Urban Development, Bachelor and Master of Science (Technology) (3 + 2 yrs)" + }, + "kaytetaanHaunAlkamiskautta": true, + "hakulomakeKuvaus": {}, + "hakulomakeLinkki": { + "fi": "https://untuvaopintopolku.fi/hakemus/hakukohde/1.2.246.562.20.00000000000000045105?lang=fi", + "sv": "https://untuvaopintopolku.fi/hakemus/hakukohde/1.2.246.562.20.00000000000000045105?lang=sv", + "en": "https://untuvaopintopolku.fi/hakemus/hakukohde/1.2.246.562.20.00000000000000045105?lang=en" + }, + "kaytetaanHaunHakulomaketta": true, + "aloituspaikat": 0, + "painotetutArvosanat": [], + "pohjakoulutusvaatimusKoodiUrit": [ + "pohjakoulutusvaatimuskouta_123#1" + ], + "muuPohjakoulutusvaatimus": {}, + "toinenAsteOnkoKaksoistutkinto": false, + "kaytetaanHaunAikataulua": true, + "valintaperusteId": "09ab50f3-fea7-45c5-a58f-5c9352553a6e", + "valintaperusteValintakokeet": [], + "yhdenPaikanSaanto": { + "voimassa": true, + "syy": "Hakukohde on yhden paikan säännön piirissä" + }, + "koulutustyyppikoodi": "koulutustyyppi_3", + "salliikoHakukohdeHarkinnanvaraisuudenKysymisen": false, + "voikoHakukohteessaOllaHarkinnanvaraisestiHakeneita": false, + "liitteetOnkoSamaToimitusaika": false, + "liitteetOnkoSamaToimitusosoite": false, + "liitteet": [ + { + "id": "91ce7bda-3356-4136-aca3-6fbd1490bcd5", + "tyyppi": { + "koodiUri": "liitetyypitamm_3#1", + "nimi": { + "en": "Certificates", + "fi": "Todistukset", + "sv": "Betyg" + } + }, + "nimi": { + "en": "Attachments" + }, + "kuvaus": { + "en": "

You must attach the following documents to your application:

You might also be required to attach a document that demonstrates that you are exempted from paying the tuition fees. Should you be considered a fee-paying student, you will also be asked whether you wish to apply for a scholarship offered within the Tampere University Scholarships Programme and further instructed on the attachments required for the application.

" + }, + "toimitusaika": "2024-04-03T15:00:00", + "toimitustapa": "lomake" + } + ], + "valintakokeet": [], + "hakuajat": [], + "muokkaaja": "1.2.246.562.24.57549617509", + "tarjoaja": "1.2.246.562.10.82941251389", + "organisaatioOid": "1.2.246.562.10.82941251389", + "organisaatioNimi": { + "sv": "Rakennetun ympäristön tiedekunta", + "fi": "Rakennetun ympäristön tiedekunta", + "en": "Faculty of Built Environment" + }, + "kielivalinta": [ + "en" + ], + "modified": "2023-10-30T10:26:15", + "jarjestaaUrheilijanAmmKoulutusta": false, + "uudenOpiskelijanUrl": { + "en": "https://www.tuni.fi/en/students-guide/tampere-university-students-guide/welcome-new-university-students" + }, + "paateltyAlkamiskausi": { + "alkamiskausityyppi": "alkamiskausi ja -vuosi", + "source": "1.2.246.562.29.00000000000000045102", + "kausiUri": "kausi_s#1", + "vuosi": "2024" + }, + "odwKkTasot": { + "alempiKkAste": true, + "ylempiKkAste": true, + "kkTutkinnonTaso": 3, + "kkTutkinnonTasoSykli": 1 + } + }, + { + "oid": "1.2.246.562.20.00000000000000045103", + "toteutusOid": "1.2.246.562.17.00000000000000019346", + "hakuOid": "1.2.246.562.29.00000000000000045102", + "tila": "julkaistu", + "nimi": { + "en": "Finnish MAOL competition route, Natural Sciences and Mathematics, Science and Engineering, Bachelor and Master of Science (Technology) (3 + 2 yrs)" + }, + "kaytetaanHaunAlkamiskautta": true, + "hakulomakeKuvaus": {}, + "hakulomakeLinkki": { + "fi": "https://untuvaopintopolku.fi/hakemus/hakukohde/1.2.246.562.20.00000000000000045103?lang=fi", + "sv": "https://untuvaopintopolku.fi/hakemus/hakukohde/1.2.246.562.20.00000000000000045103?lang=sv", + "en": "https://untuvaopintopolku.fi/hakemus/hakukohde/1.2.246.562.20.00000000000000045103?lang=en" + }, + "kaytetaanHaunHakulomaketta": true, + "aloituspaikat": 0, + "painotetutArvosanat": [], + "pohjakoulutusvaatimusKoodiUrit": [ + "pohjakoulutusvaatimuskouta_123#1" + ], + "muuPohjakoulutusvaatimus": {}, + "toinenAsteOnkoKaksoistutkinto": false, + "kaytetaanHaunAikataulua": true, + "valintaperusteId": "f9a52f7f-9b43-4686-bb5d-14436dca96c0", + "valintaperusteValintakokeet": [], + "yhdenPaikanSaanto": { + "voimassa": true, + "syy": "Hakukohde on yhden paikan säännön piirissä" + }, + "koulutustyyppikoodi": "koulutustyyppi_3", + "salliikoHakukohdeHarkinnanvaraisuudenKysymisen": false, + "voikoHakukohteessaOllaHarkinnanvaraisestiHakeneita": false, + "liitteetOnkoSamaToimitusaika": false, + "liitteetOnkoSamaToimitusosoite": false, + "liitteet": [ + { + "id": "68d9eec4-44be-44cd-9da3-cbf924d5d6b9", + "tyyppi": { + "koodiUri": "liitetyypitamm_3#1", + "nimi": { + "en": "Certificates", + "fi": "Todistukset", + "sv": "Betyg" + } + }, + "nimi": { + "en": "Attachments" + }, + "kuvaus": { + "en": "

You must attach the following documents to your application:

You might also be required to attach a document that demonstrates that you are exempted from paying the tuition fees. Should you be considered a fee-paying student, you will also be asked whether you wish to apply for a scholarship offered within the Tampere University Scholarships Programme and further instructed on the attachments required for the application.

" + }, + "toimitusaika": "2024-04-03T15:00:00", + "toimitustapa": "lomake" + } + ], + "valintakokeet": [], + "hakuajat": [], + "muokkaaja": "1.2.246.562.24.57549617509", + "tarjoaja": "1.2.246.562.10.61176371294", + "organisaatioOid": "1.2.246.562.10.61176371294", + "organisaatioNimi": { + "fi": "Tekniikan ja luonnontieteiden tiedekunta", + "sv": "Tekniikan ja luonnontieteiden tiedekunta", + "en": "Faculty of Engineering and Natural Sciences" + }, + "kielivalinta": [ + "en" + ], + "modified": "2023-10-30T10:26:25", + "jarjestaaUrheilijanAmmKoulutusta": false, + "uudenOpiskelijanUrl": { + "en": "https://www.tuni.fi/en/students-guide/tampere-university-students-guide/welcome-new-university-students" + }, + "paateltyAlkamiskausi": { + "alkamiskausityyppi": "alkamiskausi ja -vuosi", + "source": "1.2.246.562.29.00000000000000045102", + "kausiUri": "kausi_s#1", + "vuosi": "2024" + }, + "odwKkTasot": { + "alempiKkAste": true, + "ylempiKkAste": true, + "kkTutkinnonTaso": 3, + "kkTutkinnonTasoSykli": 1 + } + }, + { + "oid": "1.2.246.562.20.00000000000000045104", + "toteutusOid": "1.2.246.562.17.00000000000000019347", + "hakuOid": "1.2.246.562.29.00000000000000045102", + "tila": "julkaistu", + "nimi": { + "en": "Finnish MAOL competition route, Computing and Electrical Engineering, Science and Engineering, Bachelor and Master of Science (Technology) (3 + 2 yrs)" + }, + "kaytetaanHaunAlkamiskautta": true, + "hakulomakeKuvaus": {}, + "hakulomakeLinkki": { + "fi": "https://untuvaopintopolku.fi/hakemus/hakukohde/1.2.246.562.20.00000000000000045104?lang=fi", + "sv": "https://untuvaopintopolku.fi/hakemus/hakukohde/1.2.246.562.20.00000000000000045104?lang=sv", + "en": "https://untuvaopintopolku.fi/hakemus/hakukohde/1.2.246.562.20.00000000000000045104?lang=en" + }, + "kaytetaanHaunHakulomaketta": true, + "aloituspaikat": 0, + "painotetutArvosanat": [], + "pohjakoulutusvaatimusKoodiUrit": [ + "pohjakoulutusvaatimuskouta_123#1" + ], + "muuPohjakoulutusvaatimus": {}, + "toinenAsteOnkoKaksoistutkinto": false, + "kaytetaanHaunAikataulua": true, + "valintaperusteId": "bd1335bc-c70f-4af3-b238-3e49b973fdc3", + "valintaperusteValintakokeet": [], + "yhdenPaikanSaanto": { + "voimassa": true, + "syy": "Hakukohde on yhden paikan säännön piirissä" + }, + "koulutustyyppikoodi": "koulutustyyppi_3", + "salliikoHakukohdeHarkinnanvaraisuudenKysymisen": false, + "voikoHakukohteessaOllaHarkinnanvaraisestiHakeneita": false, + "liitteetOnkoSamaToimitusaika": false, + "liitteetOnkoSamaToimitusosoite": false, + "liitteet": [ + { + "id": "c332a71c-56d9-4d22-b2fe-5dda56cd7f83", + "tyyppi": { + "koodiUri": "liitetyypitamm_3#1", + "nimi": { + "en": "Certificates", + "fi": "Todistukset", + "sv": "Betyg" + } + }, + "nimi": { + "en": "Attachments" + }, + "kuvaus": { + "en": "

You must attach the following documents to your application:

You might also be required to attach a document that demonstrates that you are exempted from paying the tuition fees. Should you be considered a fee-paying student, you will also be asked whether you wish to apply for a scholarship offered within the Tampere University Scholarships Programme and further instructed on the attachments required for the application.

" + }, + "toimitusaika": "2024-04-03T15:00:00", + "toimitustapa": "lomake" + } + ], + "valintakokeet": [], + "hakuajat": [], + "muokkaaja": "1.2.246.562.24.57549617509", + "tarjoaja": "1.2.246.562.10.61176371294", + "organisaatioOid": "1.2.246.562.10.61176371294", + "organisaatioNimi": { + "fi": "Tekniikan ja luonnontieteiden tiedekunta", + "sv": "Tekniikan ja luonnontieteiden tiedekunta", + "en": "Faculty of Engineering and Natural Sciences" + }, + "kielivalinta": [ + "en" + ], + "modified": "2023-10-30T10:26:20", + "jarjestaaUrheilijanAmmKoulutusta": false, + "uudenOpiskelijanUrl": { + "en": "https://www.tuni.fi/en/students-guide/tampere-university-students-guide/welcome-new-university-students" + }, + "paateltyAlkamiskausi": { + "alkamiskausityyppi": "alkamiskausi ja -vuosi", + "source": "1.2.246.562.29.00000000000000045102", + "kausiUri": "kausi_s#1", + "vuosi": "2024" + }, + "odwKkTasot": { + "alempiKkAste": true, + "ylempiKkAste": true, + "kkTutkinnonTaso": 3, + "kkTutkinnonTasoSykli": 1 + } + } +] + +module.exports = [ + { + id: "get-hakukohteet", + url: "/kouta-internal/hakukohde/search", + method: "GET", + variants: [ + { + id: "success", + type: "json", + options: { + status: 200, + body: HAKUKOHTEET, + }, + }, + { + id: "error", + type: "json", + options: { + status: 400, + body: { + message: "Error", + }, + }, + }, + ], + }]; + \ No newline at end of file diff --git a/mocks/routes/kouta/haut.js b/mocks/routes/kouta/haut.js index bb1c8e2d..e67b5111 100644 --- a/mocks/routes/kouta/haut.js +++ b/mocks/routes/kouta/haut.js @@ -274,6 +274,56 @@ const HAUT = [ ], "modified": "2023-11-14T13:23:41" }, + { + "oid": "1.2.246.562.29.00000000000000045102", + "hakukohdeOids": [ + "1.2.246.562.20.00000000000000045103", + "1.2.246.562.20.00000000000000045104", + "1.2.246.562.20.00000000000000045105" + ], + "tila": "julkaistu", + "nimi": { + "en": "Tampere University Separate Admission/ Finnish MAOL Competition Route 2024" + }, + "hakutapaKoodiUri": "hakutapa_02", + "alkamiskausiKoodiUri": "kausi_s", + "alkamisvuosi": "2024", + "kohdejoukkoKoodiUri": "haunkohdejoukko_12#1", + "hakulomaketyyppi": "ataru", + "hakulomakeAtaruId": "8cbb5397-3199-4e6f-933c-4065627dc3f3", + "hakulomakeKuvaus": {}, + "hakulomakeLinkki": { + "fi": "https://untuvaopintopolku.fi/hakemus/haku/1.2.246.562.29.00000000000000045102?lang=fi", + "sv": "https://untuvaopintopolku.fi/hakemus/haku/1.2.246.562.29.00000000000000045102?lang=sv", + "en": "https://untuvaopintopolku.fi/hakemus/haku/1.2.246.562.29.00000000000000045102?lang=en" + }, + "hakuvuosi": 2024, + "hakukausi": "kausi_k#1", + "metadata": { + "yhteyshenkilot": [], + "tulevaisuudenAikataulu": [], + "koulutuksenAlkamiskausi": { + "alkamiskausityyppi": "alkamiskausi ja -vuosi", + "koulutuksenAlkamiskausi": { + "koodiUri": "kausi_s" + }, + "koulutuksenAlkamisvuosi": "2024" + } + }, + "organisaatioOid": "1.2.246.562.10.79559059674", + "hakuajat": [ + { + "alkaa": "2024-03-13T08:00:00", + "paattyy": "2024-03-27T15:00:00" + } + ], + "valintakokeet": [], + "muokkaaja": "1.2.246.562.24.57549617509", + "kielivalinta": [ + "en" + ], + "modified": "2023-10-30T10:34:31" + } ]; module.exports = [ diff --git a/src/app/components/haku-list.tsx b/src/app/components/haku-list.tsx index d4dede3a..3fd0b6c3 100644 --- a/src/app/components/haku-list.tsx +++ b/src/app/components/haku-list.tsx @@ -2,6 +2,7 @@ import { Link as MuiLink, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from '@mui/material'; import { Haku, Tila, getAlkamisKausi } from "../lib/kouta"; import { Koodi } from '../lib/koodisto'; +import { getTranslation } from '../lib/common'; export const HakuList = ({haut, hakutavat}: {haut : Haku[], hakutavat: Koodi[]}) =>{ @@ -28,7 +29,7 @@ export const HakuList = ({haut, hakutavat}: {haut : Haku[], hakutavat: Koodi[]}) .map((haku: Haku) => ( - {haku.nimi.fi} + {getTranslation(haku.nimi)} {Tila[haku.tila]} {getMatchingHakutapa(haku.hakutapaKoodiUri)} diff --git a/src/app/components/haku-selector.tsx b/src/app/components/haku-selector.tsx index 8f7416c3..2f2dfd7d 100644 --- a/src/app/components/haku-selector.tsx +++ b/src/app/components/haku-selector.tsx @@ -4,6 +4,7 @@ import { ChangeEvent, useState } from "react"; import { Haku, HaunAlkaminen, Tila, getHakuAlkamisKaudet } from "../lib/kouta"; import { Koodi } from "../lib/koodisto"; import { HakuList } from "./haku-list"; +import { getTranslation } from "../lib/common"; const alkamisKausiMatchesSelected = (haku: Haku, selectedAlkamisKausi: HaunAlkaminen): boolean => haku.alkamisVuosi === selectedAlkamisKausi.alkamisVuosi && haku.alkamisKausiKoodiUri.startsWith(selectedAlkamisKausi.alkamisKausiKoodiUri); @@ -20,7 +21,7 @@ export const HakuSelector = ({haut, hakutavat}: {haut : Haku[], hakutavat: Koodi const filterHaut = (search: string, tila: Tila, kausi: HaunAlkaminen | undefined, tapa : Koodi | undefined) => { const filteredValue = haut.filter((haku: Haku) => - haku.tila == tila && haku.nimi.fi?.toLowerCase().includes(search) + haku.tila == tila && getTranslation(haku.nimi).toLowerCase().includes(search) && (!kausi || alkamisKausiMatchesSelected(haku, kausi)) && (!tapa || haku.hakutapaKoodiUri.startsWith(tapa.koodiUri)) ); diff --git a/src/app/haku/[oid]/page.tsx b/src/app/haku/[oid]/page.tsx index ba9e1c56..62b6b10c 100644 --- a/src/app/haku/[oid]/page.tsx +++ b/src/app/haku/[oid]/page.tsx @@ -1,6 +1,7 @@ 'use server'; -import { getHaku } from "../../lib/kouta"; +import { getTranslation } from "@/app/lib/common"; +import { Hakukohde, getHaku, getHakukohteet } from "../../lib/kouta"; export default async function HakuPage({ params @@ -9,12 +10,17 @@ export default async function HakuPage({ }) { const hakuNimi = await getHaku(params.oid); + const hakukohteet = await getHakukohteet(params.oid); return (

Valintojen Toteuttaminen

-

{hakuNimi}

+

{getTranslation(hakuNimi)}

+
    + {hakukohteet.map((hk: Hakukohde) => +
  • {getTranslation(hk.nimi)}
  • )} +
); diff --git a/src/app/lib/common.ts b/src/app/lib/common.ts index f1e7af53..dca03383 100644 --- a/src/app/lib/common.ts +++ b/src/app/lib/common.ts @@ -7,3 +7,17 @@ export type TranslatedName = { export enum Language { FI, EN, SV } + +//TODO: match user's language +export function getTranslation(translated: TranslatedName, userLanguage: Language = Language.FI): string { + const prop = Language[userLanguage].toLowerCase() as keyof TranslatedName; + if (translated[prop] && translated[prop]?.trim().length > 0) { + return translated[prop] || ''; + } else if (translated.fi && translated.fi.trim().length > 0) { + return translated.fi; + } else if (translated.sv && translated.sv.trim().length > 0) { + return translated.sv; + } + return translated.en || ''; +} + diff --git a/src/app/lib/configuration.ts b/src/app/lib/configuration.ts index f89ec1a9..960ca7cd 100644 --- a/src/app/lib/configuration.ts +++ b/src/app/lib/configuration.ts @@ -6,6 +6,7 @@ interface Configuration { sessionCookie: string, hautUrl: string, hakuUrl: string, + hakukohteetUrl: string, kooditUrl: string }; @@ -15,5 +16,6 @@ export const configuration: Configuration = { sessionCookie: process.env.SESSION_COOKIE || 'JSESSIONID', hautUrl: `${DOMAIN}/kouta-internal/haku/search`, hakuUrl: `${DOMAIN}/kouta-internal/haku`, + hakukohteetUrl: `${DOMAIN}/kouta-internal/hakukohde/search?all=false`, kooditUrl: 'https://virkailija.untuvaopintopolku.fi/koodisto-service/rest/codeelement/codes/' }; diff --git a/src/app/lib/kouta.ts b/src/app/lib/kouta.ts index 98ea0e41..b6f811a7 100644 --- a/src/app/lib/kouta.ts +++ b/src/app/lib/kouta.ts @@ -42,6 +42,11 @@ export type Haku = { hakutapaKoodiUri: string } +export type Hakukohde = { + oid: string, + nimi: TranslatedName +} + export enum Tila { JULKAISTU, ARKISTOITU } @@ -63,7 +68,7 @@ export async function getHaut(active: boolean = true) { const response = await axios.get(configuration.hautUrl, { headers, }); - const haut: Haku[] = response.data.map((h: { oid: string; nimi: TranslatedName; tila: string, hakutapaKoodiUri: string, hakuvuosi: string, hakukausi: string}) => { + const haut: Haku[] = response.data.map((h: { oid: string, nimi: TranslatedName, tila: string, hakutapaKoodiUri: string, hakuvuosi: string, hakukausi: string}) => { const haunTila: Tila = Tila[h.tila.toUpperCase() as keyof typeof Tila]; return {oid: h.oid, nimi: h.nimi, tila: haunTila, hakutapaKoodiUri: h.hakutapaKoodiUri, alkamisVuosi: parseInt(h.hakuvuosi), alkamisKausiKoodiUri: h.hakukausi}; @@ -71,9 +76,15 @@ export async function getHaut(active: boolean = true) { return haut; } -export async function getHaku(oid: string): Promise { - const response = await axios.get(`${configuration.hakuUrl}/${oid}`, { - headers, - }) - return response.data.nimi.fi; +export async function getHaku(oid: string): Promise { + const response = await axios.get(`${configuration.hakuUrl}/${oid}`, {headers}) + return response.data.nimi; +} + +export async function getHakukohteet(hakuOid: string): Promise { + const response = await axios.get(`${configuration.hakukohteetUrl}?haku=${hakuOid}`); + const hakukohteet: Hakukohde[] = response.data.map((h: { oid: string; nimi: TranslatedName}) => { + return {oid: h.oid, nimi: h.nimi}; + }); + return hakukohteet; }