Skip to content

Commit

Permalink
feat: hassu 831 hassu 819 kansalaisen hyväksymispäätöksen lukunäkymä (#…
Browse files Browse the repository at this point in the history
…329)

* Kansalaisen hyväksymispäätöksen alkuosa

* Korjaukset kansalaisen hyväksymispäätöksen alkuosan linkkiin.

* Kansalaisen hyväksymispäätöksen asianosaisen oikeudet -osio.

* Eriytä aineistonäkymä omaksi komponentikseen ja käytä sitä kansalaisen nähtävilläolovaiheessa

* Loput kansalaisen hyväksymispäätösvaiheen sivun osiot. Jätä TODO-asioita.

* Kansalaisen hyväksymispäätöksen otsikot monikielisiksi

* Korjaa typo käännösavaimessa

* Poista tarpeeton placeholder eu-logolle.

* Poista 'pdf'

Co-authored-by: Valhe Kouneli <valhe.kouneli@cgi.com>
  • Loading branch information
ValheKouneli and Valhe Kouneli authored Aug 23, 2022
1 parent e1779cb commit 8061730
Show file tree
Hide file tree
Showing 7 changed files with 322 additions and 138 deletions.
167 changes: 167 additions & 0 deletions src/components/projekti/common/KansalaisenAineistoNakyma.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
import React, { Key, ReactElement, useState } from "react";
import useTranslation from "next-translate/useTranslation";
import { formatDate } from "src/util/dateUtils";
import SectionContent from "@components/layout/SectionContent";
import {
Aineisto,
ProjektiJulkinen,
NahtavillaoloVaiheJulkaisuJulkinen,
HyvaksymisPaatosVaiheJulkaisuJulkinen,
} from "@services/api";
import Trans from "next-translate/Trans";
import HassuAccordion from "@components/HassuAccordion";
import { AineistoKategoria, aineistoKategoriat } from "common/aineistoKategoriat";
import { Link, Stack } from "@mui/material";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import ButtonFlat from "@components/button/ButtonFlat";

type Props = {
projekti: ProjektiJulkinen;
kuulutus: NahtavillaoloVaiheJulkaisuJulkinen | HyvaksymisPaatosVaiheJulkaisuJulkinen;
};

export default function KansalaisenAineistoNakyma({ projekti, kuulutus }: Props): ReactElement {
const { t } = useTranslation("projekti");

const [expandedAineistoKategoriat, setExpandedAineistoKategoriat] = useState<Key[]>([]);
const areAineistoKategoriesExpanded = !!expandedAineistoKategoriat.length;

const velho = projekti?.velho;

if (!projekti || !kuulutus || !velho) {
return <div />;
}

let sijainti = "";
if (velho.maakunnat) {
sijainti = sijainti + velho.maakunnat.join(", ") + "; ";
}
if (velho.kunnat) {
sijainti = sijainti + velho.kunnat.join(", ");
}

const getAlaKategoryIds = (aineistoKategoriat: AineistoKategoria[]) => {
const keys: Key[] = [];
aineistoKategoriat.forEach((kategoria) => {
keys.push(kategoria.id);
if (kategoria.alaKategoriat) {
keys.push(...getAlaKategoryIds(kategoria.alaKategoriat));
}
});
return keys;
};

return (
<SectionContent>
<h4 className="vayla-small-title">{t(`ui-otsikot.nahtavillaolo.esittelyaineisto_ja_suunnitelmat`)}</h4>
<Trans
i18nKey="projekti:info.nahtavillaolo.ei-rata.suunnitelmiin_on_mahdollista"
values={{
kuulutusVaihePaattyyPaiva: formatDate(kuulutus.kuulutusVaihePaattyyPaiva),
}}
components={{ p: <p />, b: <b /> }}
/>
<ButtonFlat
type="button"
onClick={() => {
if (areAineistoKategoriesExpanded) {
setExpandedAineistoKategoriat([]);
} else {
setExpandedAineistoKategoriat(getAlaKategoryIds(aineistoKategoriat.listKategoriat()));
}
}}
iconComponent={
<span className="fa-layers">
<FontAwesomeIcon
icon="chevron-down"
transform={`down-6`}
flip={areAineistoKategoriesExpanded ? "vertical" : undefined}
/>
<FontAwesomeIcon
icon="chevron-up"
transform={`up-6`}
flip={areAineistoKategoriesExpanded ? "vertical" : undefined}
/>
</span>
}
>
{areAineistoKategoriesExpanded ? "Sulje" : "Avaa"} kaikki kategoriat
</ButtonFlat>
<AineistoKategoriaAccordion
aineistoKategoriat={aineistoKategoriat.listKategoriat()}
aineistot={kuulutus.aineistoNahtavilla}
expandedState={[expandedAineistoKategoriat, setExpandedAineistoKategoriat]}
/>
</SectionContent>
);
}

interface AineistoKategoriaAccordionProps {
aineistoKategoriat?: AineistoKategoria[];
aineistot?: Aineisto[] | null;
expandedState: [React.Key[], React.Dispatch<React.Key[]>];
}

const AineistoKategoriaAccordion = (props: AineistoKategoriaAccordionProps) => {
const { t } = useTranslation("aineisto");
return props.aineistoKategoriat ? (
<HassuAccordion
items={props.aineistoKategoriat?.map((kategoria) => {
const aineistot = props.aineistot?.filter(
(aineisto) =>
kategoria.id === aineisto.kategoriaId ||
kategoria.alaKategoriat?.some((alakategoria) => alakategoria.id === aineisto.kategoriaId)
);
return {
title: `${t(`aineisto-kategoria-nimi.${kategoria.id}`)} (${aineistot?.length || 0})`,
content: (
<SuunnitelmaAineistoKategoriaContent
aineistot={aineistot}
kategoria={kategoria}
expandedState={props.expandedState}
/>
),
id: kategoria.id,
};
})}
expandedState={props.expandedState}
/>
) : null;
};

interface SuunnitelmaAineistoKategoriaContentProps {
aineistot?: Aineisto[];
kategoria: AineistoKategoria;
expandedState: [React.Key[], React.Dispatch<React.Key[]>];
}

const SuunnitelmaAineistoKategoriaContent = (props: SuunnitelmaAineistoKategoriaContentProps) => {
return (
<>
{!!props.aineistot?.length ? (
<Stack direction="column" rowGap={1.5}>
{props.aineistot
?.filter((aineisto) => typeof aineisto.tiedosto === "string" && aineisto.kategoriaId === props.kategoria.id)
.map((aineisto) => (
<Stack direction="row" alignItems="flex-end" columnGap={2} key={aineisto.dokumenttiOid}>
<Link href={aineisto.tiedosto!} target="_blank" rel="noreferrer">
{aineisto.nimi}
</Link>
<span>({aineisto.nimi.split(".").pop()})</span>
<a href={aineisto.tiedosto!} target="_blank" rel="noreferrer">
<FontAwesomeIcon icon="external-link-alt" size="lg" className="text-primary-dark" />
</a>
</Stack>
))}
</Stack>
) : (
<p>Kategoriassa ei ole aineistoa</p>
)}
<AineistoKategoriaAccordion
aineistoKategoriat={props.kategoria.alaKategoriat}
aineistot={props.aineistot}
expandedState={props.expandedState}
/>
</>
);
};
1 change: 1 addition & 0 deletions src/locales/fi/common.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"kansalaisheader": "KANSALAISHEADER - TBD",
"sivua-ei-loydy": "Sivua ei löydy",
"vayla-tietosuojasivu": "https://www.vayla.fi/tietosuoja",
"polut": {
"etusivu": "Etusivu",
"projektin_perustaminen": "Projektin perustaminen",
Expand Down
10 changes: 10 additions & 0 deletions src/locales/fi/projekti.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,14 @@
"valmistuttuaan_suunnitelma_asetetaan": "Valmistuttuaan suunnitelma asetetaan yleisesti nähtäville, jolloin asianosaisilla on mahdollisuus tehdä kirjallinen muistutus suunnitelmasta. (ratalaki 22 §).",
"vaylavirasto_kasittelee_suunnitelman": "Väylävirasto käsittelee suunnitelman laatimiseen liittyen tarpeellisia henkilötietoja. Halutessasi tietää tarkemmin väyläsuunnittelun tietosuojakäytänteistä, tutustu verkkosivujen tietosuojaosioon osoitteessa www.vayla.fi/tietosuoja."
},
"hyvaksytty": {
"liikenne_ja_viestintavirasto_on_paatoksellaan": "<p>Liikenne- ja viestintävirasto on {{hyvaksymisPaiva}} päätöksellään {{paatosNumero}} hyväksynyt liikennejärjestelmästä ja maanteistä annetun lain (503/2005) mukaisesti tiesuunnitelman {{suunnitelmanNimi}}, {{sijainti}}.</p>",
"paatos_ja_sen_perusteena_olevat": "<p>Päätös (www-versio) ja sen perusteena olevat asiakirjat sekä valitusosoitus ovat nähtävillä sähköisessä muodossa tietoverkossa tämän kuulutuksen nähtävilläolon ajan <b>{{nahtavillaoloaikavali}}</b> <a>{{linkki}}</a> (sekä paperiaineisto osoitteessa {{osoite}}). (LjMTL 103 §).</p>",
"kuulutus_on_julkaistu": "<p>Kuulutus on julkaistu tietoverkossa Väyläviraston verkkosivuilla {{julkaisupaiva}}.</p>",
"tiedoksisaannin_katsotaan_tapahtuneet": "<p>Tiedoksisaannin katsotaan tapahtuneen seitsemäntenä päivänä kuulutuksen julkaisemisajankohdasta (hallintolaki 62 a §), eli {{tiedoksiantopaiva}}.</p>",
"paatokseen_voi_valittamalla": "Päätökseen voi valittamalla hakea muutosta {{hallintoOikeudelta}} 30 päivän kuluessa päätöksen tiedoksisaannista. Muutoksenhaun tarkemmat ohjeet ovat päätöksen liitteenä olevassa valitusosoituksessa.",
"vaylavirasto_kasittelee_suunnitelman": "Väylävirasto käsittelee suunnitelman laatimiseen liittyen tarpeellisia henkilötietoja. Halutessasi tietää tarkemmin väyläsuunnittelun tietosuojakäytänteistä, tutustu verkkosivujen tietosuojaosioon osoitteessa <a>{{linkki}}</a>."
},
"nahtavillaolo": {
"ei-rata": {
"on_laatinut": "on laatinut liikennejärjestelmästä ja maanteistä annetun lain (503/2005) mukaisen",
Expand Down Expand Up @@ -85,6 +93,7 @@
},
"ui-otsikot": {
"kuulutus_suunnitelman_alkamisesta": "Kuulutus suunnittelun aloittamisesta",
"kuulutus_suunnitelman_hyvaksymisesta": "Kuulutus suunnitelman hyväksymisestä",
"nahtavillaoloaika": "Nähtävilläoloaika",
"hankkeen_sijainti": "Hankkeen sijainti",
"suunnitelman_tyyppi": "Suunnitelman tyyppi",
Expand All @@ -109,6 +118,7 @@
"esittelyaineisto_ja_suunnitelmaluonnokset": "Esittelyaineisto ja suunnitelmaluonnokset",
"muut_materiaalit": "Muut esittelymateriaalit",
"video_materiaalit": "Enakkoon kuvattu videoesittely",
"paatos": "Päätös",
"nahtavillaolo": {
"suunnitteluhankkeen_kuvaus": "Suunnitteluhankkeen kuvaus",
"asianosaisen_oikeudet": "Asianosaisen oikeudet",
Expand Down
1 change: 1 addition & 0 deletions src/locales/sv/common.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"kansalaisheader": "RUOTSIKSI KANSALAISHEADER - TBD",
"sivua-ei-loydy": "RUOTSIKSI Sivua ei löydy",
"vayla-tietosuojasivu": "https://vayla.fi/sv/trafikledsverket/kontaktuppgifter/dataskyddspolicy",
"polut": {
"etusivu": "RUOTSIKSI Etusivu",
"projektin_perustaminen": "RUOTSIKSI Projektin perustaminen",
Expand Down
10 changes: 10 additions & 0 deletions src/locales/sv/projekti.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,14 @@
"valmistuttuaan_suunnitelma_asetetaan": "RUOTSIKSI Valmistuttuaan suunnitelma asetetaan yleisesti nähtäville, jolloin asianosaisilla on mahdollisuus tehdä kirjallinen muistutus suunnitelmasta. (ratalaki 22 §).",
"vaylavirasto_kasittelee_suunnitelman": "RUOTSIKSI Väylävirasto käsittelee suunnitelman laatimiseen liittyen tarpeellisia henkilötietoja. Halutessasi tietää tarkemmin väyläsuunnittelun tietosuojakäytänteistä, tutustu verkkosivujen tietosuojaosioon osoitteessa www.vayla.fi/tietosuoja."
},
"hyvaksytty": {
"liikenne_ja_viestintavirasto_on_paatoksellaan": "<p>RUOTSIKSI Liikenne- ja viestintävirasto on {{hyvaksymisPaiva}} päätöksellään {{paatosNumero}} hyväksynyt liikennejärjestelmästä ja maanteistä annetun lain (503/2005) mukaisesti tiesuunnitelman {{suunnitelmanNimi}}, {{sijainti}}.</p>",
"paatos_ja_sen_perusteena_olevat": "<p>RUOTSIKSI Päätös (www-versio) ja sen perusteena olevat asiakirjat sekä valitusosoitus ovat nähtävillä sähköisessä muodossa tietoverkossa tämän kuulutuksen nähtävilläolon ajan <b>{{nahtavillaoloaikavali}}</b> <a>{{linkki}}</a> (sekä paperiaineisto osoitteessa {{osoite}}). (LjMTL 103 §).</p>",
"kuulutus_on_julkaistu": "<p>RUOTSIKSI Kuulutus on julkaistu tietoverkossa Väyläviraston verkkosivuilla {{julkaisupaiva}}.</p>",
"tiedoksisaannin_katsotaan_tapahtuneet": "<p>RUOTSIKSI Tiedoksisaannin katsotaan tapahtuneen seitsemäntenä päivänä kuulutuksen julkaisemisajankohdasta (hallintolaki 62 a §), eli {{tiedoksiantopaiva}}.</p>",
"paatokseen_voi_valittamalla": "RUOTSIKSI Päätökseen voi valittamalla hakea muutosta {{hallintoOikeudelta}} 30 päivän kuluessa päätöksen tiedoksisaannista. Muutoksenhaun tarkemmat ohjeet ovat päätöksen liitteenä olevassa valitusosoituksessa.",
"vaylavirasto_kasittelee_suunnitelman": "RUOTSIKSI Väylävirasto käsittelee suunnitelman laatimiseen liittyen tarpeellisia henkilötietoja. Halutessasi tietää tarkemmin väyläsuunnittelun tietosuojakäytänteistä, tutustu verkkosivujen tietosuojaosioon osoitteessa <a>{{linkki}}</a>."
},
"nahtavillaolo": {
"ei-rata": {
"on_laatinut": "RUOTSIKSI on laatinut liikennejärjestelmästä ja maanteistä annetun lain (503/2005) mukaisen",
Expand Down Expand Up @@ -85,6 +93,7 @@
},
"ui-otsikot": {
"kuulutus_suunnitelman_alkamisesta": "RUOTSIKSI Kuulutus suunnittelun aloittamisesta",
"kuulutus_suunnitelman_hyvaksymisesta": "RUOTSIKSI Kuulutus suunnitelman hyväksymisestä",
"nahtavillaoloaika": "RUOTSIKSI Nähtävilläoloaika",
"hankkeen_sijainti": "RUOTSIKSI Hankkeen sijainti",
"suunnitelman_tyyppi": "RUOTSIKSI Suunnitelman tyyppi",
Expand All @@ -109,6 +118,7 @@
"esittelyaineisto_ja_suunnitelmaluonnokset": "RUOTSIKSI Esittelyaineisto ja suunnitelmaluonnokset",
"muut_materiaalit": "RUOTSIKSI Muut esittelymateriaalit",
"video_materiaalit": "RUOTSIKSI Enakkoon kuvattu videoesittely",
"paatos": "RUOTSIKSI Päätös",
"nahtavillaolo": {
"suunnitteluhankkeen_kuvaus": "RUOTSIKSI Suunnitteluhankkeen kuvaus",
"asianosaisen_oikeudet": "RUOTSIKSI Asianosaisen oikeudet",
Expand Down
135 changes: 129 additions & 6 deletions src/pages/suunnitelma/[oid]/hyvaksymispaatos.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,136 @@
import React, { ReactElement } from "react";
import ProjektiJulkinenPageLayout from "@components/projekti/kansalaisnakyma/ProjektiJulkinenPageLayout";
import { formatDate } from "src/util/dateUtils";
import { useProjektiJulkinen } from "src/hooks/useProjektiJulkinen";
import useTranslation from "next-translate/useTranslation";
import KeyValueTable, { KeyValueData } from "@components/KeyValueTable";
import Section from "@components/layout/Section";

import Trans from "next-translate/Trans";
import { Link } from "@mui/material";
import ExtLink from "@components/ExtLink";
import Notification, { NotificationType } from "@components/notification/Notification";
import KansalaisenAineistoNakyma from "../../../components/projekti/common/KansalaisenAineistoNakyma";
export default function Hyvaksymispaatos(): ReactElement {
const { t } = useTranslation();
const { data: projekti } = useProjektiJulkinen();
const kuulutus = projekti?.hyvaksymisPaatosVaihe;
const velho = kuulutus?.velho;
if (!projekti || !kuulutus || !velho) {
return <div />;
}

let sijainti = "";
if (velho.maakunnat) {
sijainti = sijainti + velho.maakunnat.join(", ") + "; ";
}
if (velho.kunnat) {
sijainti = sijainti + velho.kunnat.join(", ");
}

const aikavali = `${formatDate(kuulutus.kuulutusPaiva)} - ${formatDate(kuulutus.kuulutusVaihePaattyyPaiva)}`;

const keyValueData: KeyValueData[] = [
{
header: t(`projekti:ui-otsikot.nahtavillaoloaika`),
data: aikavali,
},
{ header: t(`projekti:ui-otsikot.hankkeen_sijainti`), data: sijainti },
{
header: t(`projekti:ui-otsikot.suunnitelman_tyyppi`),
data: velho?.tyyppi && t(`projekti:projekti-tyyppi.${velho?.tyyppi}`),
},
];

const kuulutuspaiva = kuulutus.kuulutusPaiva ? new Date(kuulutus.kuulutusPaiva) : null;
const tiedoksiantopaiva = kuulutuspaiva ? kuulutuspaiva.setDate(kuulutuspaiva.getDate() + 7) : null;

const yhteystiedotListana =
kuulutus?.kuulutusYhteystiedot?.map((yhteystieto) => t("common:yhteystieto", yhteystieto)) || [];

return (
<ProjektiJulkinenPageLayout selectedStep={4} title="Tietoa suunnitelmaan liittyvasta hyvaksymispaatoksesta">
<>
<Section></Section>
</>
<ProjektiJulkinenPageLayout selectedStep={4} title={t("projekti:ui-otsikot.kuulutus_suunnitelman_hyvaksymisesta")}>
<Section noDivider>
<KeyValueTable rows={keyValueData}></KeyValueTable>
</Section>
<Section noDivider className="pb-6 mb-6">
<div style={{ marginTop: "1rem" }}>
<Trans
i18nKey="projekti:info.hyvaksytty.liikenne_ja_viestintavirasto_on_paatoksellaan"
values={{
hyvaksymisPaiva: "TODO",
paatosNumero: "TODO",
suunnitelmanNimi: velho.nimi,
sijainti: sijainti,
}}
components={{ p: <p style={{ marginTop: "inherit" }} /> }}
/>
<Trans
i18nKey="projekti:info.hyvaksytty.paatos_ja_sen_perusteena_olevat"
values={{
nahtavillaoloaikavali: aikavali,
linkki: "TODO",
osoite: "TODO",
}}
components={{ p: <p style={{ marginTop: "inherit" }} />, b: <b />, a: <Link href={"TODO"} /> }}
/>
<Trans
i18nKey="projekti:info.hyvaksytty.kuulutus_on_julkaistu"
values={{
julkaisupaiva: formatDate(kuulutus.kuulutusPaiva),
}}
components={{ p: <p style={{ marginTop: "inherit" }} /> }}
/>
<Trans
i18nKey="projekti:info.hyvaksytty.tiedoksisaannin_katsotaan_tapahtuneet"
values={{
tiedoksiantopaiva: formatDate(tiedoksiantopaiva),
}}
components={{ p: <p style={{ marginTop: "inherit" }} /> }}
/>
</div>
</Section>
<Section noDivider>
<h4 className="vayla-small-title">{t("projekti:ui-otsikot.asianosaisen_oikeudet")}</h4>
<Notification hideIcon type={NotificationType.INFO}>
<p>
<Trans
i18nKey="projekti:info.hyvaksytty.paatokseen_voi_valittamalla"
values={{
hallintoOikeudelta: t(`common:hallinto-oikeus-ablatiivi.${kuulutus.hallintoOikeus}`),
}}
/>
</p>
</Notification>
<p>
<Trans
i18nKey="projekti:info.hyvaksytty.vaylavirasto_kasittelee_suunnitelman"
values={{
linkki: t("common:vayla-tietosuojasivu"),
}}
components={{ a: <ExtLink href={t("common:vayla-tietosuojasivu")} /> }}
/>
</p>
</Section>
<Section noDivider>
<h4 className="vayla-small-title">{t("projekti:ui-otsikot.yhteystiedot")}</h4>
<p>
{t("common:lisatietoja_antavat", {
yhteystiedot: yhteystiedotListana.join(", "),
count: yhteystiedotListana.length,
})}
</p>
</Section>
<Section noDivider>
<h5 className="vayla-smallest-title">{t("projekti:ui-otsikot.paatos")}</h5>
<p>TODO (käytä hyväksi viranomaispuolen lukunäkymää, refaktoroi se omaksi komponentikseen, ja käytä täällä)</p>
</Section>
<Section noDivider>
<KansalaisenAineistoNakyma projekti={projekti} kuulutus={kuulutus} />
</Section>
<Section noDivider>
<h5 className="vayla-smallest-title">{t("projekti:ui-otsikot.ladattava_kuulutus")}</h5>
TODO (toteuta kun pdf on toteutettu bäkissä)
</Section>
</ProjektiJulkinenPageLayout>
);
}
}
Loading

0 comments on commit 8061730

Please sign in to comment.