diff --git a/lambdat/raportointi/src/main/scala/fi/oph/viestinvalitys/raportointi/configuration/SecurityConfiguration.scala b/lambdat/raportointi/src/main/scala/fi/oph/viestinvalitys/raportointi/configuration/SecurityConfiguration.scala index 5798d110..fca6e20d 100644 --- a/lambdat/raportointi/src/main/scala/fi/oph/viestinvalitys/raportointi/configuration/SecurityConfiguration.scala +++ b/lambdat/raportointi/src/main/scala/fi/oph/viestinvalitys/raportointi/configuration/SecurityConfiguration.scala @@ -129,7 +129,7 @@ class SecurityConfiguration { @Bean def cookieSerializer(): CookieSerializer = { val serializer = new DefaultCookieSerializer(); - serializer.setCookieName("viestinvalitys-raportointi-cookie"); + serializer.setCookieName("JSESSIONID"); serializer.setCookiePath(RaportointiAPIConstants.RAPORTOINTI_API_PREFIX) serializer; } diff --git a/lambdat/raportointi/src/main/scala/fi/oph/viestinvalitys/raportointi/resource/LahetysResource.scala b/lambdat/raportointi/src/main/scala/fi/oph/viestinvalitys/raportointi/resource/LahetysResource.scala index 64612e11..515eadce 100644 --- a/lambdat/raportointi/src/main/scala/fi/oph/viestinvalitys/raportointi/resource/LahetysResource.scala +++ b/lambdat/raportointi/src/main/scala/fi/oph/viestinvalitys/raportointi/resource/LahetysResource.scala @@ -359,7 +359,6 @@ class LahetysResource { else Optional.of(vastaanottajat.last.kontakti.sahkoposti) } - ResponseEntity.status(HttpStatus.OK).body(VastaanottajatSuccessResponse( vastaanottajat.map(vastaanottaja => VastaanottajaResponse(vastaanottaja.tunniste.toString, Optional.ofNullable(vastaanottaja.kontakti.nimi.getOrElse(null)), vastaanottaja.kontakti.sahkoposti, diff --git a/lambdat/raportointi/src/main/scala/fi/oph/viestinvalitys/raportointi/resource/Util.scala b/lambdat/raportointi/src/main/scala/fi/oph/viestinvalitys/raportointi/resource/Util.scala index c65f475c..6ee2f8da 100644 --- a/lambdat/raportointi/src/main/scala/fi/oph/viestinvalitys/raportointi/resource/Util.scala +++ b/lambdat/raportointi/src/main/scala/fi/oph/viestinvalitys/raportointi/resource/Util.scala @@ -47,21 +47,22 @@ object ParametriUtil { else Option.apply(parametri.get()) - def asValidRaportointitila(parametri: Optional[String]): Option[String] = - // TODO tee fiksummin - if (!parametri.isPresent || !parametri.equals(RaportointiTila.epaonnistui) || !parametri.equals(RaportointiTila.kesken) || !parametri.equals(RaportointiTila.valmis)) - Option.empty + def asValidRaportointitila(tila: Optional[String]): Option[String] = + if(tila.isPresent) + tila.get match + case t if RaportointiTila.values.exists(_.toString.equals(t)) => Option.apply(t) + case _ => Option.empty else - Option.apply(parametri.get()) + Option.empty def valmis(p: VastaanottajanTila): Boolean = - raportointiTilat.valmiit.filter(tila => p.equals(tila)).size > 0 + raportointiTilat.valmiit.contains(p) def kesken(p: VastaanottajanTila): Boolean = - raportointiTilat.kesken.filter(tila => p.equals(tila)).size > 0 + raportointiTilat.kesken.contains(p) def epaonnistui(p: VastaanottajanTila): Boolean = - raportointiTilat.epaonnistuneet.filter(tila => p.equals(tila)).size > 0 + raportointiTilat.epaonnistuneet.contains(p) def getRaportointiTila(tila: VastaanottajanTila): Option[String] = tila match case t if valmis(t) => Option.apply("valmis") diff --git a/shared/src/main/scala/fi/oph/viestinvalitys/business/KantaOperaatiot.scala b/shared/src/main/scala/fi/oph/viestinvalitys/business/KantaOperaatiot.scala index 74c27449..521d3273 100644 --- a/shared/src/main/scala/fi/oph/viestinvalitys/business/KantaOperaatiot.scala +++ b/shared/src/main/scala/fi/oph/viestinvalitys/business/KantaOperaatiot.scala @@ -634,10 +634,9 @@ class KantaOperaatiot(db: JdbcBackend.JdbcDatabaseDef) { sql""" SELECT lahetykset.tunniste, otsikko, omistaja, lahettavapalvelu, lahettavanvirkailijanoid, lahettajannimi, lahettajansahkoposti, replyto, prioriteetti, to_json(luotu::timestamptz)#>>'{}' FROM lahetykset - JOIN lahetykset_kayttooikeudet ON lahetykset_kayttooikeudet.lahetys_tunniste=lahetykset.tunniste - JOIN kayttooikeudet ON lahetykset_kayttooikeudet.kayttooikeus_tunniste=kayttooikeudet.tunniste + #${queryUtil.lahetyksenKayttooikeudetJoin(kayttooikeudet)} WHERE lahetykset.tunniste=${tunniste.toString}::uuid - AND kayttooikeudet.organisaatio || '_' || kayttooikeudet.oikeus IN (#${kayttooikeudet.map(oikeus => "'" + oikeus.organisaatio.get + "_" + oikeus.oikeus + "'").mkString(",")}) + #${queryUtil.kayttooikeudetWhere(kayttooikeudet)} """.as[(String, String, String, String, String, String, String, String, String, String)].headOption), DB_TIMEOUT) .map((tunniste, otsikko, omistaja, lahettavapalvelu, lahettavanVirkailijanOid, lahettajanNimi, lahettajanSahkoposti, replyto, prioriteetti, luotu) => Lahetys(UUID.fromString(tunniste), otsikko, omistaja, lahettavapalvelu, Option.apply(lahettavanVirkailijanOid), diff --git a/viestinvalitys-raportointi/.env.template b/viestinvalitys-raportointi/.env.template index 5cee7d67..fa9540a9 100644 --- a/viestinvalitys-raportointi/.env.template +++ b/viestinvalitys-raportointi/.env.template @@ -3,4 +3,4 @@ VIESTINTAPALVELU_URL=http://localhost:8080/ LOGIN_URL=http://localhost:8080/login # matchattava viestintäpalvelun asettaman raportointisession cookien nimeen -COOKIE_NAME=viestinvalitys-raportointi-cookie \ No newline at end of file +COOKIE_NAME=JSESSIONID \ No newline at end of file diff --git a/viestinvalitys-raportointi/src/app/Lahetykset.tsx b/viestinvalitys-raportointi/src/app/Lahetykset.tsx index 21b44454..dc2c3720 100644 --- a/viestinvalitys-raportointi/src/app/Lahetykset.tsx +++ b/viestinvalitys-raportointi/src/app/Lahetykset.tsx @@ -1,12 +1,11 @@ 'use client' -import { Box, Link as MuiLink, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from '@mui/material'; +import { Link as MuiLink, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from '@mui/material'; // importoidaan MUI Link ja Nextjs Link komponentit eri nimillä import FolderOutlinedIcon from '@mui/icons-material/FolderOutlined'; import NextLink from 'next/link'; import { Lahetys } from './lib/types'; import LocalDateTime from './components/LocalDateTime'; import { LahetysStatus} from './components/LahetysStatus'; -import { lahetyksenStatus } from './lib/util'; const LahetyksetTable = ({lahetykset}: {lahetykset: Lahetys[]}) => { return ( diff --git a/viestinvalitys-raportointi/src/app/LahetyksetSivutus.tsx b/viestinvalitys-raportointi/src/app/LahetyksetSivutus.tsx index 3288740d..0493daaf 100644 --- a/viestinvalitys-raportointi/src/app/LahetyksetSivutus.tsx +++ b/viestinvalitys-raportointi/src/app/LahetyksetSivutus.tsx @@ -1,7 +1,8 @@ 'use client' import { useSearchParams } from "next/navigation" import { useCallback } from "react" -import { Link as MuiLink } from '@mui/material'; +import ChevronRightIcon from '@mui/icons-material/ChevronRight'; +import { Button } from '@mui/material'; // importoidaan MUI Link ja Nextjs Link komponentit eri nimillä import NextLink from 'next/link'; @@ -18,12 +19,13 @@ const LahetyksetSivutus = ({ seuraavatAlkaen }: { seuraavatAlkaen?: string }) => }, [searchParams] ) - + return ( - seuraavatAlkaen ? - - Seuraavat - + seuraavatAlkaen ? + : <> ) } diff --git a/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/VastaanottajaHaku.tsx b/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/VastaanottajaHaku.tsx index 58b2866b..7e0dca94 100644 --- a/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/VastaanottajaHaku.tsx +++ b/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/VastaanottajaHaku.tsx @@ -1,5 +1,5 @@ 'use client'; -import { FormControl, FormLabel, InputLabel, MenuItem, Select, TextField } from '@mui/material'; +import { FormControl, FormControlLabel, FormGroup, FormLabel, InputLabel, MenuItem, Select, TextField } from '@mui/material'; import { usePathname, useRouter, useSearchParams } from 'next/navigation'; import { useDebouncedCallback } from 'use-debounce'; import { useCallback } from 'react'; @@ -36,15 +36,28 @@ export default function VastaanottajaHaku() { return ( Hae vastaanottajia - { handleTypedSearch(e.target.value); - }} + }} defaultValue={searchParams?.get('hakutermi')?.toString()}/> + Tila + ); } diff --git a/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/Vastaanottajat.tsx b/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/Vastaanottajat.tsx index 853cd56a..32ca409a 100644 --- a/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/Vastaanottajat.tsx +++ b/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/Vastaanottajat.tsx @@ -1,5 +1,5 @@ 'use client' -import { DataGrid, GridColDef } from "@mui/x-data-grid"; +import FolderOutlinedIcon from '@mui/icons-material/FolderOutlined'; import { VastaanotonTila, Vastaanottaja } from "../../lib/types"; import { getLahetysStatus } from "../../lib/util"; import { Box, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from "@mui/material"; @@ -47,4 +47,15 @@ const VastaanottajatTable = ({vastaanottajat}: {vastaanottajat: Vastaanottaja[]} )} -export default VastaanottajatTable +const Vastaanottajat = ({vastaanottajat}: {vastaanottajat: Vastaanottaja[]}) => { + + return ( + vastaanottajat.length > 0 + ? + :
+ +

Hakuehdoilla ei löytynyt tuloksia

+
+)} + +export default Vastaanottajat diff --git a/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/actions.ts b/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/actions.ts index 74f91527..65f3cf6a 100644 --- a/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/actions.ts +++ b/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/actions.ts @@ -4,7 +4,7 @@ export async function retrySend(formData: FormData) { const rawFormData = { lahetystunniste: formData.get('lahetysTunniste'), - vastaanottajaTunniste: formData.get('vastaaottajaTunniste'), + vastaanottajaTunniste: formData.get('vastaanottajaTunniste'), } // param validation // api call diff --git a/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/page.tsx b/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/page.tsx index 3ae0d2ac..6990be2f 100644 --- a/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/page.tsx +++ b/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/page.tsx @@ -1,16 +1,26 @@ import { Suspense } from 'react' import { fetchLahetyksenVastaanottajat, fetchLahetys } from "../../lib/data"; -import { FormControl, FormLabel, Grid, Skeleton, TextField } from '@mui/material'; +import { Grid, Skeleton } from '@mui/material'; import { Lahetys } from '@/app/lib/types'; import LocalDateTime from '@/app/components/LocalDateTime'; -import { lahetyksenStatus } from '@/app/lib/util'; -import VastaanottajatTable from './Vastaanottajat'; +import Vastaanottajat from './Vastaanottajat'; import { LahetysStatus } from '@/app/components/LahetysStatus'; import VastaanottajaHaku from './VastaanottajaHaku'; +import VastaanottajatSivutus from './VastaanottajatSivutus'; +import VirheAlert from '@/app/components/VirheAlert'; - export default async function Page({ params }: { params: { tunniste: string } }) { + export default async function Page({ params, searchParams }: { params: { tunniste: string }, + searchParams?: { + alkaen?: string + sivutustila?: string + hakukentta?: string + hakusana?: string + tila?: string + } }) { const lahetys: Lahetys = await fetchLahetys(params.tunniste) - const data = await fetchLahetyksenVastaanottajat(params.tunniste) + const data = await fetchLahetyksenVastaanottajat(params.tunniste, + {alkaen: searchParams?.alkaen, sivutustila: searchParams?.sivutustila}) + const virheet = data?.virhe return (

Lähetysraportti

@@ -26,18 +36,20 @@ import VastaanottajaHaku from './VastaanottajaHaku'; {lahetys.replyTo} Palvelu {lahetys.lahettavaPalvelu} - Hakuehdot - TODO onko tämä kohta kälisuunnitelmassa lähetyksen metadata??? + Metadata-avain TODO + Metadata-avaimen arvot TODO Lähetystunnus {lahetys.lahetysTunniste} Lähetyksen tila

Vastaanottajat

+ }> - + +
diff --git a/viestinvalitys-raportointi/src/app/layout.tsx b/viestinvalitys-raportointi/src/app/layout.tsx index cecbf9fd..b5d254b0 100644 --- a/viestinvalitys-raportointi/src/app/layout.tsx +++ b/viestinvalitys-raportointi/src/app/layout.tsx @@ -3,6 +3,7 @@ import { AppRouterCacheProvider } from '@mui/material-nextjs/v13-appRouter'; import './globals.css' import Link from 'next/link'; import { Roboto } from 'next/font/google' +import HomeIconLink from './components/HomeIconLink'; const roboto = Roboto({ weight: ['400', '500'], @@ -25,7 +26,8 @@ export default function RootLayout({
{children} diff --git a/viestinvalitys-raportointi/src/app/lib/data.ts b/viestinvalitys-raportointi/src/app/lib/data.ts index def42ee7..acd13dca 100644 --- a/viestinvalitys-raportointi/src/app/lib/data.ts +++ b/viestinvalitys-raportointi/src/app/lib/data.ts @@ -1,16 +1,18 @@ import { cookies, headers } from 'next/headers' -import { LahetysHakuParams } from './types' +import { LahetysHakuParams, VastaanottajatHakuParams } from './types' import { apiUrl, cookieName, loginUrl } from './configurations' import { redirect } from 'next/navigation' +const LAHETYKSET_SIVUTUS_KOKO = 20 +const VASTAANOTTAJAT_SIVUTUS_KOKO = 10 // TODO apuwrapperi headerien asettamiseen ja virheenkäsittelyyn -export async function fetchLahetykset(hakuParams: LahetysHakuParams) { +export async function fetchLahetykset(hakuParams: LahetysHakuParams) { const sessionCookie = cookies().get(cookieName) if (sessionCookie === undefined) { console.info('no session cookie, redirect to login') redirect(loginUrl) } - const fetchUrlBase = `${apiUrl}/lahetykset/lista?enintaan=20` + const fetchUrlBase = `${apiUrl}/lahetykset/lista?enintaan=${LAHETYKSET_SIVUTUS_KOKO}` console.info(hakuParams) var fetchParams = hakuParams.seuraavatAlkaen ? `&alkaen=${hakuParams.seuraavatAlkaen}` : '' if(hakuParams?.hakukentta && hakuParams.hakusana) { @@ -48,7 +50,7 @@ export async function fetchLahetykset(hakuParams: LahetysHakuParams) { cache: 'no-store' }) console.log(res.status) - if (!res.ok || res.status===400 || res.status===410) { + if (!(res.ok || res.status===400 || res.status===410)) { if(res.status===401) { redirect(loginUrl) } @@ -58,22 +60,24 @@ export async function fetchLahetykset(hakuParams: LahetysHakuParams) { return res.json() } - export async function fetchLahetyksenVastaanottajat(lahetysTunnus: string) { + export async function fetchLahetyksenVastaanottajat(lahetysTunnus: string, hakuParams: VastaanottajatHakuParams) { const sessionCookie = cookies().get(cookieName) if (sessionCookie === undefined) { console.info('no session cookie, redirect to login') redirect(loginUrl) } const headersInstance = headers() - const url = `${apiUrl}/lahetykset/${lahetysTunnus}/vastaanottajat` + const url = `${apiUrl}/lahetykset/${lahetysTunnus}/vastaanottajat?enintaan=${VASTAANOTTAJAT_SIVUTUS_KOKO}` console.log(url) + var fetchParams = hakuParams.alkaen ? `&alkaen=${hakuParams.alkaen}&sivutustila=${hakuParams.sivutustila || 'kesken'}` : '' + console.log(url.concat(fetchParams)) const cookieParam = sessionCookie.name+'='+sessionCookie.value - const res = await fetch(url,{ + const res = await fetch(url.concat(fetchParams),{ headers: { cookie: cookieParam ?? '' }, // Forward the authorization header cache: 'no-store' }) console.log(res.status) - if (!res.ok) { + if (!(res.ok || res.status===400 || res.status===410)) { if(res.status===401) { redirect(loginUrl) } diff --git a/viestinvalitys-raportointi/src/app/lib/types.ts b/viestinvalitys-raportointi/src/app/lib/types.ts index 2bf8e253..0da3338a 100644 --- a/viestinvalitys-raportointi/src/app/lib/types.ts +++ b/viestinvalitys-raportointi/src/app/lib/types.ts @@ -4,6 +4,14 @@ export type LahetysHakuParams = { hakusana?: string } +export type VastaanottajatHakuParams = { + alkaen?: string + sivutustila?: string + hakukentta?: string + hakusana?: string + tila?: string +} + export type LahetyksenVastaanottoTila = { vastaanottotila: VastaanotonTila vastaanottajaLkm: number