diff --git a/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/VastaanottajaHaku.tsx b/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/VastaanottajaHaku.tsx
new file mode 100644
index 00000000..58b2866b
--- /dev/null
+++ b/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/VastaanottajaHaku.tsx
@@ -0,0 +1,50 @@
+'use client';
+import { FormControl, FormLabel, InputLabel, MenuItem, Select, TextField } from '@mui/material';
+import { usePathname, useRouter, useSearchParams } from 'next/navigation';
+import { useDebouncedCallback } from 'use-debounce';
+import { useCallback } from 'react';
+
+export default function VastaanottajaHaku() {
+ const router = useRouter()
+ const pathname = usePathname()
+ const searchParams = useSearchParams()
+
+ const { replace } = useRouter();
+
+ // lisätään hakuparametreihin uusi key-value-pari
+ const createQueryString = useCallback(
+ (name: string, value: any) => {
+ const params = new URLSearchParams(searchParams?.toString() || '')
+ params.set(name, value)
+
+ return params.toString()
+ },
+ [searchParams]
+ )
+
+ // päivitetään 3s viiveellä hakuparametrit
+ const handleTypedSearch = useDebouncedCallback((term) => {
+ const params = new URLSearchParams(searchParams?.toString() || '');
+ if (term) {
+ params.set('hakusana', term);
+ } else {
+ params.delete('hakusana');
+ }
+ replace(`${pathname}?${params.toString()}`);
+ }, 3000);
+
+ return (
+
+ Hae vastaanottajia
+ {
+ handleTypedSearch(e.target.value);
+ }}
+ defaultValue={searchParams?.get('hakutermi')?.toString()}/>
+
+ );
+}
diff --git a/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/Vastaanottajat.tsx b/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/Vastaanottajat.tsx
new file mode 100644
index 00000000..853cd56a
--- /dev/null
+++ b/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/Vastaanottajat.tsx
@@ -0,0 +1,50 @@
+'use client'
+import { DataGrid, GridColDef } from "@mui/x-data-grid";
+import { VastaanotonTila, Vastaanottaja } from "../../lib/types";
+import { getLahetysStatus } from "../../lib/util";
+import { Box, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from "@mui/material";
+import { StatusIcon } from "@/app/components/LahetysStatus";
+
+ const lahetyksenStatus = (tila: VastaanotonTila): string => {
+ const status = 'Lähetys ' + getLahetysStatus([tila])
+ return status
+ }
+
+ const toiminnot = (tila: VastaanotonTila): string => {
+ if(getLahetysStatus([tila])==='epäonnistui') {
+ return 'Lähetä uudelleen'
+ }
+ return ''
+ }
+
+const VastaanottajatTable = ({vastaanottajat}: {vastaanottajat: Vastaanottaja[]}) => {
+ return (
+
+
+
+
+ Nimi
+ Sähköposti
+ Tila
+ Toiminnot
+
+
+
+ {vastaanottajat
+ .map((row) => (
+
+ {row.nimi}
+ {row.sahkoposti}
+ {lahetyksenStatus(row.tila)}
+ {toiminnot(row.tila)}
+
+ ))}
+
+
+
+)}
+
+export default VastaanottajatTable
diff --git a/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/page.tsx b/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/page.tsx
index a289cf79..8bc861a0 100644
--- a/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/page.tsx
+++ b/viestinvalitys-raportointi/src/app/lahetys/[tunniste]/page.tsx
@@ -1,11 +1,12 @@
import { Suspense } from 'react'
import { fetchLahetyksenVastaanottajat, fetchLahetys } from "../../lib/data";
-import { Grid, Skeleton } from '@mui/material';
+import { FormControl, FormLabel, Grid, Skeleton, TextField } 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 { LahetysStatus } from '@/app/components/LahetysStatus';
+import VastaanottajaHaku from './VastaanottajaHaku';
export default async function Page({ params }: { params: { tunniste: string } }) {
const lahetys: Lahetys = await fetchLahetys(params.tunniste)
@@ -33,6 +34,8 @@ import { LahetysStatus } from '@/app/components/LahetysStatus';
Vastaanottajat
+
+
}>