From fe417507ce34925a4d397b0647a4e87c508a1a16 Mon Sep 17 00:00:00 2001 From: Tomi Korkalainen <77731851+tkork@users.noreply.github.com> Date: Mon, 14 Nov 2022 14:34:05 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20Muokkaa=20tabit=20k=C3=A4ytt=C3=A4ytym?= =?UTF-8?q?=C3=A4=C3=A4n=20linkkien=20tavalla=20automaattitestiongelmien?= =?UTF-8?q?=20v=C3=A4hent=C3=A4miseksi=20=20(#469)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * wip * korvaa tabit vuorovaikutussivulla * muokkaa nahtavillaolovaiheen tabit kuntoon * hyvaksymisvaiheen tabit * aloita paatoskomponenttien muutokset - muuta kansion nimi hyvaksyminen -> paatos * poista jatkopaatos komponentit - muutokset tehdään paatos-kansion komponentteihin * aloita jatkopaatosmuutosten tekemista paatos-komponentteihin * jatkopaatos1 kuntoon * korjaa jatkopaatoksien teksteja aineistosivuilla * poista turhat importit * korjaa testejä ja korjaa toteutusta, että testit menee taas läpi * kansalaispuolen tabit uusiks * korjaa siirrä menneisyyteen painikkeiden siirtämään julkaisua PaatosTyyppiin perustuen * uudelleennimeä testejä ja korjaile niitä; autotestit saattasi jopa mennä läpi --- ...elhohaku.spec.js => 001-velhohaku.spec.js} | 0 ...{2-perusta.spec.js => 002-perusta.spec.js} | 0 ...tiedot.spec.js => 003-perustiedot.spec.js} | 0 ...us.spec.js => 004-aloituskuulutus.spec.js} | 0 ...s => 005-aloituskuulutus-julkinen.spec.js} | 0 ... 006-suunnitteluvaihe-perustiedot.spec.js} | 0 ...07-suunnitteluvaihe-vuorovaikutus.spec.js} | 0 ...08-nahtavillaolovaihe-perustiedot.spec.js} | 0 ...he.spec.js => 009-hyvaksyntavaihe.spec.js} | 14 +- ....spec.js => 010-imoitustaulusyote.spec.js} | 0 ...avaihe.spec.js => 011-jatkopaatos.spec.js} | 23 +- .../2-perusta-projekti/hyvaksyntavaihe.js | 6 +- .../4-migraatio/1-migraatio.spec.js | 19 +- i18n.js | 10 +- .../kansalaisenEtusivu/Hakutulokset.tsx | 5 +- src/components/layout/Breadcrumbs.tsx | 62 +++-- .../layout/HassuMuiThemeProvider.tsx | 34 +++ src/components/layout/LinkTab.tsx | 11 + src/components/layout/tabs/Tabs.tsx | 2 +- src/components/projekti/ProjektiConsumer.tsx | 17 ++ .../projekti/ProjektiSideNavigation.tsx | 3 +- .../common/SuunnitelmatJaAineistot.tsx | 2 +- .../hyvaksyminen/aineistot/Lukunakyma.tsx | 114 -------- .../hyvaksyminen/aineistot/Muokkausnakyma.tsx | 111 -------- .../projekti/hyvaksyminen/aineistot/index.tsx | 15 -- .../KuulutusJaJulkaisuPaiva.tsx | 67 ----- .../kuulutuksenTiedot/MuutoksenHaku.tsx | 61 ----- .../jatkopaatos1/aineistot/Jatkopaatos1.tsx | 49 ---- .../aineistot/Jatkopaatos1Tiedostot.tsx | 80 ------ .../aineistot/Jatkopaatos1VaihePainikkeet.tsx | 65 ----- .../jatkopaatos1/aineistot/Muokkausnakyma.tsx | 111 -------- .../projekti/jatkopaatos1/aineistot/index.tsx | 15 -- .../IlmoituksenVastaanottajat.tsx | 250 ------------------ .../JatkoPaatos1KuulutusPainikkeet.tsx | 205 -------------- .../KuulutuksenJaIlmoituksenEsikatselu.tsx | 131 --------- .../KuulutuksessaEsitettavatYhteystiedot.tsx | 205 -------------- .../kuulutuksenTiedot/Lukunakyma.tsx | 222 ---------------- .../kuulutuksenTiedot/Modaalit.tsx | 145 ---------- .../jatkopaatos1/kuulutuksenTiedot/index.tsx | 143 ---------- .../HyvaksymispaatosTiedot.tsx | 8 +- .../kansalaisnakyma/PaatosPageLayout.tsx | 77 ++++++ .../ProjektiJulkinenPageLayout.tsx | 7 +- .../ProjektiJulkinenStepper.tsx | 35 ++- .../JatkoPaatos1VaiheAineistotLukutila.tsx | 23 -- ...kutila.tsx => PaatosAineistotLukutila.tsx} | 4 +- .../nahtavillaolo/NahtavillaoloPageLayout.tsx | 172 ++++++++++++ .../kuulutuksentiedot/KuulutuksenTiedot.tsx | 22 +- .../Muokkausnakyma.tsx | 16 +- .../NahtavilleAsetettavatAineistot.tsx | 8 +- .../projekti/paatos/PaatosAineistotPage.tsx | 26 ++ .../paatos/PaatosKuulutuksenTiedotPage.tsx | 25 ++ .../projekti/paatos/PaatosPageLayout.tsx | 162 ++++++++++++ .../aineistot/HyvaksymisPaatosTiedostot.tsx | 0 .../HyvaksymisPaatosVaihePainikkeet.tsx | 21 +- .../aineistot/Hyvaksymispaatos.tsx | 0 .../aineistot/Lukunakyma.tsx | 27 +- .../paatos/aineistot/Muokkausnakyma.tsx | 133 ++++++++++ .../projekti/paatos/aineistot/index.tsx | 19 ++ .../IlmoituksenVastaanottajat.tsx | 75 ++---- .../KuulutuksenJaIlmoituksenEsikatselu.tsx | 49 ++-- .../KuulutuksessaEsitettavatYhteystiedot.tsx | 51 ++-- .../KuulutusJaJulkaisuPaiva.tsx | 23 +- .../kuulutuksenTiedot/Lukunakyma.tsx | 66 +++-- .../kuulutuksenTiedot/Modaalit.tsx | 0 .../kuulutuksenTiedot/MuutoksenHaku.tsx | 17 +- .../kuulutuksenTiedot/PaatoksenPaiva.tsx | 15 +- .../kuulutuksenTiedot/Painikkeet.tsx | 27 +- .../kuulutuksenTiedot/Voimassaolovuosi.tsx | 0 .../kuulutuksenTiedot/index.tsx | 90 ++++--- .../SuunnitteluvaihePageLayout.tsx | 91 +++++++ .../SuunnitteluvaiheenPerustiedot.tsx | 22 +- .../SuunnitteluvaiheenVuorovaikuttaminen.tsx | 8 +- src/hooks/useIsOnAllowedProjektiRoute.tsx | 16 +- src/hooks/useProjekti.tsx | 8 +- src/hooks/useProjektiJulkinen.tsx | 2 +- src/locales/fi/paatos.json | 6 + src/locales/fi/projekti.json | 1 + src/locales/sv/paatos.json | 6 + src/locales/sv/projekti.json | 1 + .../suunnitelma/[oid]/hyvaksymispaatos.tsx | 71 +---- src/pages/suunnitelma/[oid]/jatkopaatos1.tsx | 21 ++ .../projekti/[oid]/hyvaksymispaatos.tsx | 169 ------------ .../[oid]/hyvaksymispaatos/aineisto.tsx | 12 + .../projekti/[oid]/hyvaksymispaatos/index.tsx | 12 + .../yllapito/projekti/[oid]/jatkaminen1.tsx | 157 ----------- .../projekti/[oid]/jatkaminen1/aineisto.tsx | 12 + .../projekti/[oid]/jatkaminen1/index.tsx | 12 + .../yllapito/projekti/[oid]/nahtavillaolo.tsx | 196 -------------- .../projekti/[oid]/nahtavillaolo/aineisto.tsx | 27 ++ .../projekti/[oid]/nahtavillaolo/index.tsx | 27 ++ .../yllapito/projekti/[oid]/suunnittelu.tsx | 122 --------- .../projekti/[oid]/suunnittelu/index.tsx | 42 +++ .../vuorovaikuttaminen/[kierrosId].tsx | 60 +++++ src/schemas/hyvaksymispaatosKuulutus.tsx | 2 +- src/schemas/jatkopaatos1Kuulutus.tsx | 18 -- src/util/getPaatosSpecificData.ts | 79 ++++++ src/util/getValidatedKierrosId.ts | 13 + 97 files changed, 1501 insertions(+), 3107 deletions(-) rename cypress/integration/2-perusta-projekti/{1-velhohaku.spec.js => 001-velhohaku.spec.js} (100%) rename cypress/integration/2-perusta-projekti/{2-perusta.spec.js => 002-perusta.spec.js} (100%) rename cypress/integration/2-perusta-projekti/{3-perustiedot.spec.js => 003-perustiedot.spec.js} (100%) rename cypress/integration/2-perusta-projekti/{4-aloituskuulutus.spec.js => 004-aloituskuulutus.spec.js} (100%) rename cypress/integration/2-perusta-projekti/{5-aloituskuulutus-julkinen.spec.js => 005-aloituskuulutus-julkinen.spec.js} (100%) rename cypress/integration/2-perusta-projekti/{5-suunnitteluvaihe-perustiedot.spec.js => 006-suunnitteluvaihe-perustiedot.spec.js} (100%) rename cypress/integration/2-perusta-projekti/{6-suunnitteluvaihe-vuorovaikutus.spec.js => 007-suunnitteluvaihe-vuorovaikutus.spec.js} (100%) rename cypress/integration/2-perusta-projekti/{8-nahtavillaolovaihe-perustiedot.spec.js => 008-nahtavillaolovaihe-perustiedot.spec.js} (100%) rename cypress/integration/2-perusta-projekti/{9-hyvaksyntavaihe.spec.js => 009-hyvaksyntavaihe.spec.js} (83%) rename cypress/integration/2-perusta-projekti/{99-imoitustaulusyote.spec.js => 010-imoitustaulusyote.spec.js} (100%) rename cypress/integration/2-perusta-projekti/{10-hyvaksyntavaihe.spec.js => 011-jatkopaatos.spec.js} (88%) create mode 100644 src/components/layout/LinkTab.tsx create mode 100644 src/components/projekti/ProjektiConsumer.tsx delete mode 100644 src/components/projekti/hyvaksyminen/aineistot/Lukunakyma.tsx delete mode 100644 src/components/projekti/hyvaksyminen/aineistot/Muokkausnakyma.tsx delete mode 100644 src/components/projekti/hyvaksyminen/aineistot/index.tsx delete mode 100644 src/components/projekti/hyvaksyminen/kuulutuksenTiedot/KuulutusJaJulkaisuPaiva.tsx delete mode 100644 src/components/projekti/hyvaksyminen/kuulutuksenTiedot/MuutoksenHaku.tsx delete mode 100644 src/components/projekti/jatkopaatos1/aineistot/Jatkopaatos1.tsx delete mode 100644 src/components/projekti/jatkopaatos1/aineistot/Jatkopaatos1Tiedostot.tsx delete mode 100644 src/components/projekti/jatkopaatos1/aineistot/Jatkopaatos1VaihePainikkeet.tsx delete mode 100644 src/components/projekti/jatkopaatos1/aineistot/Muokkausnakyma.tsx delete mode 100644 src/components/projekti/jatkopaatos1/aineistot/index.tsx delete mode 100644 src/components/projekti/jatkopaatos1/kuulutuksenTiedot/IlmoituksenVastaanottajat.tsx delete mode 100644 src/components/projekti/jatkopaatos1/kuulutuksenTiedot/JatkoPaatos1KuulutusPainikkeet.tsx delete mode 100644 src/components/projekti/jatkopaatos1/kuulutuksenTiedot/KuulutuksenJaIlmoituksenEsikatselu.tsx delete mode 100644 src/components/projekti/jatkopaatos1/kuulutuksenTiedot/KuulutuksessaEsitettavatYhteystiedot.tsx delete mode 100644 src/components/projekti/jatkopaatos1/kuulutuksenTiedot/Lukunakyma.tsx delete mode 100644 src/components/projekti/jatkopaatos1/kuulutuksenTiedot/Modaalit.tsx delete mode 100644 src/components/projekti/jatkopaatos1/kuulutuksenTiedot/index.tsx create mode 100644 src/components/projekti/kansalaisnakyma/PaatosPageLayout.tsx delete mode 100644 src/components/projekti/lukutila/JatkoPaatos1VaiheAineistotLukutila.tsx rename src/components/projekti/lukutila/{HyvakysmisVaiheAineistotLukutila.tsx => PaatosAineistotLukutila.tsx} (81%) create mode 100644 src/components/projekti/nahtavillaolo/NahtavillaoloPageLayout.tsx create mode 100644 src/components/projekti/paatos/PaatosAineistotPage.tsx create mode 100644 src/components/projekti/paatos/PaatosKuulutuksenTiedotPage.tsx create mode 100644 src/components/projekti/paatos/PaatosPageLayout.tsx rename src/components/projekti/{hyvaksyminen => paatos}/aineistot/HyvaksymisPaatosTiedostot.tsx (100%) rename src/components/projekti/{hyvaksyminen => paatos}/aineistot/HyvaksymisPaatosVaihePainikkeet.tsx (76%) rename src/components/projekti/{hyvaksyminen => paatos}/aineistot/Hyvaksymispaatos.tsx (100%) rename src/components/projekti/{jatkopaatos1 => paatos}/aineistot/Lukunakyma.tsx (79%) create mode 100644 src/components/projekti/paatos/aineistot/Muokkausnakyma.tsx create mode 100644 src/components/projekti/paatos/aineistot/index.tsx rename src/components/projekti/{hyvaksyminen => paatos}/kuulutuksenTiedot/IlmoituksenVastaanottajat.tsx (70%) rename src/components/projekti/{hyvaksyminen => paatos}/kuulutuksenTiedot/KuulutuksenJaIlmoituksenEsikatselu.tsx (77%) rename src/components/projekti/{hyvaksyminen => paatos}/kuulutuksenTiedot/KuulutuksessaEsitettavatYhteystiedot.tsx (79%) rename src/components/projekti/{jatkopaatos1 => paatos}/kuulutuksenTiedot/KuulutusJaJulkaisuPaiva.tsx (77%) rename src/components/projekti/{hyvaksyminen => paatos}/kuulutuksenTiedot/Lukunakyma.tsx (75%) rename src/components/projekti/{hyvaksyminen => paatos}/kuulutuksenTiedot/Modaalit.tsx (100%) rename src/components/projekti/{jatkopaatos1 => paatos}/kuulutuksenTiedot/MuutoksenHaku.tsx (83%) rename src/components/projekti/{hyvaksyminen => paatos}/kuulutuksenTiedot/PaatoksenPaiva.tsx (61%) rename src/components/projekti/{hyvaksyminen => paatos}/kuulutuksenTiedot/Painikkeet.tsx (86%) rename src/components/projekti/{jatkopaatos1 => paatos}/kuulutuksenTiedot/Voimassaolovuosi.tsx (100%) rename src/components/projekti/{hyvaksyminen => paatos}/kuulutuksenTiedot/index.tsx (52%) create mode 100644 src/components/projekti/suunnitteluvaihe/SuunnitteluvaihePageLayout.tsx create mode 100644 src/locales/fi/paatos.json create mode 100644 src/locales/sv/paatos.json create mode 100644 src/pages/suunnitelma/[oid]/jatkopaatos1.tsx delete mode 100644 src/pages/yllapito/projekti/[oid]/hyvaksymispaatos.tsx create mode 100644 src/pages/yllapito/projekti/[oid]/hyvaksymispaatos/aineisto.tsx create mode 100644 src/pages/yllapito/projekti/[oid]/hyvaksymispaatos/index.tsx delete mode 100644 src/pages/yllapito/projekti/[oid]/jatkaminen1.tsx create mode 100644 src/pages/yllapito/projekti/[oid]/jatkaminen1/aineisto.tsx create mode 100644 src/pages/yllapito/projekti/[oid]/jatkaminen1/index.tsx delete mode 100644 src/pages/yllapito/projekti/[oid]/nahtavillaolo.tsx create mode 100644 src/pages/yllapito/projekti/[oid]/nahtavillaolo/aineisto.tsx create mode 100644 src/pages/yllapito/projekti/[oid]/nahtavillaolo/index.tsx delete mode 100644 src/pages/yllapito/projekti/[oid]/suunnittelu.tsx create mode 100644 src/pages/yllapito/projekti/[oid]/suunnittelu/index.tsx create mode 100644 src/pages/yllapito/projekti/[oid]/suunnittelu/vuorovaikuttaminen/[kierrosId].tsx delete mode 100644 src/schemas/jatkopaatos1Kuulutus.tsx create mode 100644 src/util/getPaatosSpecificData.ts create mode 100644 src/util/getValidatedKierrosId.ts diff --git a/cypress/integration/2-perusta-projekti/1-velhohaku.spec.js b/cypress/integration/2-perusta-projekti/001-velhohaku.spec.js similarity index 100% rename from cypress/integration/2-perusta-projekti/1-velhohaku.spec.js rename to cypress/integration/2-perusta-projekti/001-velhohaku.spec.js diff --git a/cypress/integration/2-perusta-projekti/2-perusta.spec.js b/cypress/integration/2-perusta-projekti/002-perusta.spec.js similarity index 100% rename from cypress/integration/2-perusta-projekti/2-perusta.spec.js rename to cypress/integration/2-perusta-projekti/002-perusta.spec.js diff --git a/cypress/integration/2-perusta-projekti/3-perustiedot.spec.js b/cypress/integration/2-perusta-projekti/003-perustiedot.spec.js similarity index 100% rename from cypress/integration/2-perusta-projekti/3-perustiedot.spec.js rename to cypress/integration/2-perusta-projekti/003-perustiedot.spec.js diff --git a/cypress/integration/2-perusta-projekti/4-aloituskuulutus.spec.js b/cypress/integration/2-perusta-projekti/004-aloituskuulutus.spec.js similarity index 100% rename from cypress/integration/2-perusta-projekti/4-aloituskuulutus.spec.js rename to cypress/integration/2-perusta-projekti/004-aloituskuulutus.spec.js diff --git a/cypress/integration/2-perusta-projekti/5-aloituskuulutus-julkinen.spec.js b/cypress/integration/2-perusta-projekti/005-aloituskuulutus-julkinen.spec.js similarity index 100% rename from cypress/integration/2-perusta-projekti/5-aloituskuulutus-julkinen.spec.js rename to cypress/integration/2-perusta-projekti/005-aloituskuulutus-julkinen.spec.js diff --git a/cypress/integration/2-perusta-projekti/5-suunnitteluvaihe-perustiedot.spec.js b/cypress/integration/2-perusta-projekti/006-suunnitteluvaihe-perustiedot.spec.js similarity index 100% rename from cypress/integration/2-perusta-projekti/5-suunnitteluvaihe-perustiedot.spec.js rename to cypress/integration/2-perusta-projekti/006-suunnitteluvaihe-perustiedot.spec.js diff --git a/cypress/integration/2-perusta-projekti/6-suunnitteluvaihe-vuorovaikutus.spec.js b/cypress/integration/2-perusta-projekti/007-suunnitteluvaihe-vuorovaikutus.spec.js similarity index 100% rename from cypress/integration/2-perusta-projekti/6-suunnitteluvaihe-vuorovaikutus.spec.js rename to cypress/integration/2-perusta-projekti/007-suunnitteluvaihe-vuorovaikutus.spec.js diff --git a/cypress/integration/2-perusta-projekti/8-nahtavillaolovaihe-perustiedot.spec.js b/cypress/integration/2-perusta-projekti/008-nahtavillaolovaihe-perustiedot.spec.js similarity index 100% rename from cypress/integration/2-perusta-projekti/8-nahtavillaolovaihe-perustiedot.spec.js rename to cypress/integration/2-perusta-projekti/008-nahtavillaolovaihe-perustiedot.spec.js diff --git a/cypress/integration/2-perusta-projekti/9-hyvaksyntavaihe.spec.js b/cypress/integration/2-perusta-projekti/009-hyvaksyntavaihe.spec.js similarity index 83% rename from cypress/integration/2-perusta-projekti/9-hyvaksyntavaihe.spec.js rename to cypress/integration/2-perusta-projekti/009-hyvaksyntavaihe.spec.js index a3361b2b2..c7283f20c 100644 --- a/cypress/integration/2-perusta-projekti/9-hyvaksyntavaihe.spec.js +++ b/cypress/integration/2-perusta-projekti/009-hyvaksyntavaihe.spec.js @@ -2,7 +2,7 @@ import dayjs from "dayjs"; import { formatDate } from "../../../src/util/dateUtils"; import { ProjektiTestCommand } from "../../../common/testUtil.dev"; -import { lisaaPaatosJaAineistot, tallennaKasittelynTilaJaSiirraMenneisyyteen } from './hyvaksyntavaihe'; +import { lisaaPaatosJaAineistot, tallennaKasittelynTilaJaSiirraMenneisyyteen } from "./hyvaksyntavaihe"; const projektiNimi = Cypress.env("projektiNimi"); const oid = Cypress.env("oid"); @@ -50,17 +50,17 @@ describe("9 - Projektin hyvaksymispaatosavaiheen kuulutustiedot", () => { cy.get("#kuulutuksentiedot_tab").click(); const today = formatDate(dayjs()); - cy.get('[name="hyvaksymisPaatosVaihe.kuulutusPaiva"]').should("be.enabled").type(today, { + cy.get('[name="paatos.kuulutusPaiva"]').should("be.enabled").type(today, { waitForAnimations: true, }); - cy.get('[name="hyvaksymisPaatosVaihe.hallintoOikeus"]').select("HELSINKI"); - cy.get('[name="hyvaksymisPaatosVaihe.ilmoituksenVastaanottajat.kunnat.0.sahkoposti"]').clear().type("test@vayla.fi"); - cy.get('[name="hyvaksymisPaatosVaihe.ilmoituksenVastaanottajat.kunnat.1.sahkoposti"]').clear().type("test@vayla.fi"); + cy.get('[name="paatos.hallintoOikeus"]').select("HELSINKI"); + cy.get('[name="paatos.ilmoituksenVastaanottajat.kunnat.0.sahkoposti"]').clear().type("test@vayla.fi"); + cy.get('[name="paatos.ilmoituksenVastaanottajat.kunnat.1.sahkoposti"]').clear().type("test@vayla.fi"); cy.get("#save_and_send_for_acceptance").click(); cy.contains("Lähetys onnistui", { timeout: 30000 }); - cy.get("#kuulutuksentiedot_luku_tab").click(); + cy.get("#kuulutuksentiedot_tab").click(); cy.get("#button_open_acceptance_dialog") .should("be.enabled") .scrollIntoView({ offset: { top: 500, left: 0 } }) @@ -70,7 +70,7 @@ describe("9 - Projektin hyvaksymispaatosavaiheen kuulutustiedot", () => { cy.contains("Hyväksyminen onnistui", { timeout: 30000 }); cy.reload(); - cy.get("#kuulutuksentiedot_luku_tab").click(); + cy.get("#kuulutuksentiedot_tab").click(); cy.contains("Kuulutus nähtäville asettamisesta on julkaistu"); diff --git a/cypress/integration/2-perusta-projekti/99-imoitustaulusyote.spec.js b/cypress/integration/2-perusta-projekti/010-imoitustaulusyote.spec.js similarity index 100% rename from cypress/integration/2-perusta-projekti/99-imoitustaulusyote.spec.js rename to cypress/integration/2-perusta-projekti/010-imoitustaulusyote.spec.js diff --git a/cypress/integration/2-perusta-projekti/10-hyvaksyntavaihe.spec.js b/cypress/integration/2-perusta-projekti/011-jatkopaatos.spec.js similarity index 88% rename from cypress/integration/2-perusta-projekti/10-hyvaksyntavaihe.spec.js rename to cypress/integration/2-perusta-projekti/011-jatkopaatos.spec.js index 4bfa1ddde..84afa90f8 100644 --- a/cypress/integration/2-perusta-projekti/10-hyvaksyntavaihe.spec.js +++ b/cypress/integration/2-perusta-projekti/011-jatkopaatos.spec.js @@ -75,11 +75,11 @@ describe("10 - Projektin jatkopaatos1vaiheen kuulutustiedot", () => { // Test that navigation now has "1. jatkaminen" link - cy.visit(Cypress.env("host") + "/yllapito/projekti/" + oid + "/jatkaminen1", { timeout: 30000 }).reload(); - cy.contains("Päätös ja päätöksen liitteenä oleva aineistot"); + cy.visit(Cypress.env("host") + "/yllapito/projekti/" + oid + "/jatkaminen1/aineisto", { timeout: 30000 }).reload(); + cy.contains("Päätös ja päätöksen liitteenä oleva aineisto"); }); - it("Lisaa paatokset ja aineistot", { scrollBehavior: "center" }, () => { + it("Lisää päätökset ja aineistot", { scrollBehavior: "center" }, () => { cy.login("A1"); cy.visit(Cypress.env("host") + "/yllapito/projekti/" + oid + "/jatkaminen1", { timeout: 30000 }); @@ -95,7 +95,7 @@ describe("10 - Projektin jatkopaatos1vaiheen kuulutustiedot", () => { selectAllAineistotFromCategory("#aineisto_accordion_Toimeksianto1"); cy.get("#select_valitut_aineistot_button").click(); - cy.get("#save_jatkopaatos1vaihe_draft").click(); + cy.get("#save_hyvaksymispaatosvaihe_draft").click(); cy.contains("Tallennus onnistui").wait(2000); // extra wait added because somehow the next test brings blank page otherwise cy.reload(); @@ -120,21 +120,21 @@ describe("10 - Projektin jatkopaatos1vaiheen kuulutustiedot", () => { cy.get("#kuulutuksentiedot_tab").click(); const today = formatDate(dayjs()); - cy.get('[name="jatkoPaatos1Vaihe.kuulutusPaiva"]').should("be.enabled").type(today, { + cy.get('[name="paatos.kuulutusPaiva"]').should("be.enabled").type(today, { waitForAnimations: true, }); const plus4years = dayjs().add(4, "year").year().toString(); cy.get("#voimassaolovuosi").select(plus4years); - cy.get('[name="jatkoPaatos1Vaihe.hallintoOikeus"]').select("HELSINKI"); - cy.get('[name="jatkoPaatos1Vaihe.ilmoituksenVastaanottajat.kunnat.0.sahkoposti"]').clear().type("test@vayla.fi"); - cy.get('[name="jatkoPaatos1Vaihe.ilmoituksenVastaanottajat.kunnat.1.sahkoposti"]').clear().type("test@vayla.fi"); + cy.get('[name="paatos.hallintoOikeus"]').select("HELSINKI"); + cy.get('[name="paatos.ilmoituksenVastaanottajat.kunnat.0.sahkoposti"]').clear().type("test@vayla.fi"); + cy.get('[name="paatos.ilmoituksenVastaanottajat.kunnat.1.sahkoposti"]').clear().type("test@vayla.fi"); cy.get("#save_and_send_for_acceptance").click(); cy.contains("Lähetys onnistui", { timeout: 30000 }); - cy.get("#kuulutuksentiedot_luku_tab").click(); + cy.get("#kuulutuksentiedot_tab").click(); cy.get("#button_open_acceptance_dialog") .should("be.enabled") .scrollIntoView({ offset: { top: 500, left: 0 } }) @@ -144,12 +144,11 @@ describe("10 - Projektin jatkopaatos1vaiheen kuulutustiedot", () => { cy.contains("Hyväksyminen onnistui", { timeout: 15000 }); cy.reload(); - cy.get("#kuulutuksentiedot_luku_tab").click(); + cy.get("#kuulutuksentiedot_tab").click(); cy.contains("Kuulutus nähtäville asettamisesta on julkaistu"); //TODO: vaihda jatkovaiheen tekstit - cy.visit(Cypress.env("host") + "/suunnitelma/" + oid + "/hyvaksymispaatos"); - cy.get("#jatkopaatos_tab").click(); + cy.visit(Cypress.env("host") + "/suunnitelma/" + oid + "/jatkopaatos1"); cy.contains("Kuulutus hyväksymispäätöksen jatkamisesta"); // cy.visit(Cypress.env("host") + "/sv/suunnitelma/" + oid + "/hyvaksymispaatos"); diff --git a/cypress/integration/2-perusta-projekti/hyvaksyntavaihe.js b/cypress/integration/2-perusta-projekti/hyvaksyntavaihe.js index bbad02516..8c67a3d65 100644 --- a/cypress/integration/2-perusta-projekti/hyvaksyntavaihe.js +++ b/cypress/integration/2-perusta-projekti/hyvaksyntavaihe.js @@ -1,6 +1,6 @@ -import { formatDate } from '../../../src/util/dateUtils'; -import dayjs from 'dayjs'; -import { selectAllAineistotFromCategory } from '../../support/util'; +import { formatDate } from "../../../src/util/dateUtils"; +import dayjs from "dayjs"; +import { selectAllAineistotFromCategory } from "../../support/util"; export function tallennaKasittelynTilaJaSiirraMenneisyyteen(oid, projektiNimi, asianumero) { cy.visit(Cypress.env("host") + "/yllapito/projekti/" + oid + "/kasittelyntila", { diff --git a/cypress/integration/4-migraatio/1-migraatio.spec.js b/cypress/integration/4-migraatio/1-migraatio.spec.js index 4448cac19..9bef1abaa 100644 --- a/cypress/integration/4-migraatio/1-migraatio.spec.js +++ b/cypress/integration/4-migraatio/1-migraatio.spec.js @@ -159,17 +159,17 @@ describe("Migraatio", () => { cy.get("#kuulutuksentiedot_tab").click({ force: true }); const today = formatDate(dayjs()); - cy.get('[name="hyvaksymisPaatosVaihe.kuulutusPaiva"]').should("be.enabled").type(today, { + cy.get('[name="paatos.kuulutusPaiva"]').should("be.enabled").type(today, { waitForAnimations: true, }); - cy.get('[name="hyvaksymisPaatosVaihe.hallintoOikeus"]').select("HELSINKI"); - cy.get('[name="hyvaksymisPaatosVaihe.ilmoituksenVastaanottajat.kunnat.0.sahkoposti"]').clear().type("test@vayla.fi"); - cy.get('[name="hyvaksymisPaatosVaihe.ilmoituksenVastaanottajat.kunnat.1.sahkoposti"]').clear().type("test@vayla.fi"); + cy.get('[name="paatos.hallintoOikeus"]').select("HELSINKI"); + cy.get('[name="paatos.ilmoituksenVastaanottajat.kunnat.0.sahkoposti"]').clear().type("test@vayla.fi"); + cy.get('[name="paatos.ilmoituksenVastaanottajat.kunnat.1.sahkoposti"]').clear().type("test@vayla.fi"); cy.get("#save_and_send_for_acceptance").click(); cy.contains("Lähetys onnistui", { timeout: 30000 }); - cy.get("#kuulutuksentiedot_luku_tab").click({ force: true }); + cy.get("#kuulutuksentiedot_tab").click({ force: true }); cy.get("#button_open_acceptance_dialog") .should("be.enabled") .scrollIntoView({ offset: { top: 500, left: 0 } }) @@ -179,7 +179,7 @@ describe("Migraatio", () => { cy.contains("Hyväksyminen onnistui", { timeout: 30000 }); cy.reload(); - cy.get("#kuulutuksentiedot_luku_tab").click({ force: true }); + cy.get("#kuulutuksentiedot_tab").click({ force: true }); cy.contains("Kuulutus nähtäville asettamisesta on julkaistu"); }); @@ -194,12 +194,13 @@ describe("Migraatio", () => { cy.get("p").contains("Navigoi vaiheita").click(); cy.get("#sidenavi_0").should("exist").click({ force: true }); - cy.contains("span", "Aloituskuulutus"); + cy.contains("span", "Suunnittelun käynnistäminen"); + cy.contains("Suunnitelma on tuotu toisesta järjestelmästä, joten tiedoissa voi olla puutteita."); cy.get("#sidenavi_1").should("exist").click({ force: true }); - cy.contains("span", "Suunnittelu"); + cy.contains("span", "Suunnittelussa"); cy.contains("Suunnitelma on tuotu toisesta järjestelmästä, joten tiedoissa voi olla puutteita."); cy.get("#sidenavi_2").should("exist").click({ force: true }); - cy.contains("span", "Nähtävilläolo"); + cy.contains("span", "Suunnitteluaineisto nähtävillä"); cy.contains("Suunnitelma on tuotu toisesta järjestelmästä, joten tiedoissa voi olla puutteita."); cy.get("#sidenavi_3").should("exist").click({ force: true }); cy.contains("span", "Hyväksymismenettelyssä"); diff --git a/i18n.js b/i18n.js index 49abe987f..d08c61d19 100644 --- a/i18n.js +++ b/i18n.js @@ -8,9 +8,13 @@ module.exports = { "/yllapito/perusta": ["velho-haku"], "/suunnitelma/[oid]/nahtavillaolo": ["aineisto"], "/suunnitelma/[oid]/lausuntopyyntoaineistot": ["aineisto"], - "/yllapito/projekti/[oid]/nahtavillaolo": ["aineisto"], - "/yllapito/projekti/[oid]/hyvaksymispaatos": ["aineisto"], - "/yllapito/projekti/[oid]/jatkaminen1": ["aineisto"], + "/suunnitelma/[oid]/hyvaksymispaatos": ["aineisto", "paatos"], + "/suunnitelma/[oid]/jatkopaatos1": ["aineisto", "paatos"], + "/suunnitelma/[oid]/jatkopaatos2": ["aineisto", "paatos"], + "/yllapito/projekti/[oid]/nahtavillaolo/aineisto": ["aineisto"], + "/yllapito/projekti/[oid]/hyvaksymispaatos/aineisto": ["aineisto"], + "/yllapito/projekti/[oid]/jatkaminen1/aineisto": ["aineisto"], + "/yllapito/projekti/[oid]/jatkaminen2/aineisto": ["aineisto"], "/suunnitelma/[oid]/hyvaksymismenettelyssa": ["hyvaksymismenettelyssa"], "/suunnitelma/[oid]/suunnittelu": ["suunnittelu"], }, diff --git a/src/components/kansalaisenEtusivu/Hakutulokset.tsx b/src/components/kansalaisenEtusivu/Hakutulokset.tsx index b95ff10e8..54ccc73a8 100644 --- a/src/components/kansalaisenEtusivu/Hakutulokset.tsx +++ b/src/components/kansalaisenEtusivu/Hakutulokset.tsx @@ -21,9 +21,6 @@ type Props = { }; export function getSivuTilanPerusteella(tila: Status | null | undefined) { - if (!tila) { - return ""; - } switch (tila) { case Status.ALOITUSKUULUTUS: return "aloituskuulutus"; @@ -35,6 +32,8 @@ export function getSivuTilanPerusteella(tila: Status | null | undefined) { return "hyvaksymismenettelyssa"; case Status.HYVAKSYTTY: return "hyvaksymispaatos"; + case Status.JATKOPAATOS_1: + return "jatkopaatos1"; default: return ""; } diff --git a/src/components/layout/Breadcrumbs.tsx b/src/components/layout/Breadcrumbs.tsx index 67ead1e1f..0865500d7 100644 --- a/src/components/layout/Breadcrumbs.tsx +++ b/src/components/layout/Breadcrumbs.tsx @@ -6,9 +6,18 @@ import { Container, styled } from "@mui/material"; import { ProjektiLisatiedolla, useProjekti } from "src/hooks/useProjekti"; import { ProjektiJulkinen } from "@services/api"; import { useProjektiJulkinen } from "src/hooks/useProjektiJulkinen"; +import { getValidatedKierrosId } from "src/util/getValidatedKierrosId"; +import classNames from "classnames"; +import { ParsedUrlQueryInput } from "querystring"; interface RouteLabels { - [key: string]: { label: string; hideWhenNotCurrentRoute?: boolean; preventTranslation?: boolean }; + [key: string]: { + label: string; + hideWhenNotCurrentRoute?: boolean; + preventTranslation?: boolean; + disableRoute?: boolean; + queryParams?: ParsedUrlQueryInput; + }; } const Breadcrumbs = () => { @@ -40,7 +49,7 @@ function BreadcrumbsVirkamies(): ReactElement { const routeLabels: RouteLabels = useMemo(() => { let routes: RouteLabels = {}; if (router.isReady) { - const routeLabels = getVirkamiesRouteLabels(projekti); + const routeLabels = getVirkamiesRouteLabels(router, projekti); routes = generateRoutes(router, routeLabels); } return routes; @@ -49,23 +58,35 @@ function BreadcrumbsVirkamies(): ReactElement { return ; } -const getVirkamiesRouteLabels: (projekti: ProjektiLisatiedolla | null | undefined) => RouteLabels = (projekti) => { +const getVirkamiesRouteLabels: (router: NextRouter, projekti: ProjektiLisatiedolla | null | undefined) => RouteLabels = ( + router, + projekti +) => { const projektiLabel = projekti?.velho.nimi || projekti?.oid || "..."; + const kierrosId = projekti && getValidatedKierrosId(router, projekti); return { "/yllapito": { label: "Etusivu", hideWhenNotCurrentRoute: true }, "/yllapito/perusta": { label: "Projektin perustaminen" }, "/yllapito/perusta/[oid]": { label: projektiLabel }, "/yllapito/projekti": { label: "Projektit" }, - "/yllapito/projekti/[oid]": { label: projektiLabel }, - "/yllapito/projekti/[oid]/aloituskuulutus": { label: "Aloituskuulutus" }, - "/yllapito/projekti/[oid]/kasittelyntila": { label: "Käsittelyn tila" }, - "/yllapito/projekti/[oid]/henkilot": { label: "Henkilöt ja käyttöoikeushallinta" }, - "/yllapito/projekti/[oid]/suunnittelu": { label: "Suunnittelu ja vuorovaikutus" }, - "/yllapito/projekti/[oid]/suunnittelu/vuorovaikuttaminen": { label: "Vuorovaikutus" }, - "/yllapito/projekti/[oid]/suunnittelu/vuorovaikuttaminen/[kierrosId]": { label: "Vuorovaikutus" }, - "/yllapito/projekti/[oid]/nahtavillaolo": { label: "Nähtävilläolovaihe" }, - "/yllapito/projekti/[oid]/hyvaksymispaatos": { label: "Hyväksymispäätös" }, - "/yllapito/projekti/[oid]/jatkaminen1": { label: "1. jatkaminen" }, + "/yllapito/projekti/[oid]": { label: projektiLabel, queryParams: { oid: projekti?.oid } }, + "/yllapito/projekti/[oid]/aloituskuulutus": { label: "Aloituskuulutus", queryParams: { oid: projekti?.oid } }, + "/yllapito/projekti/[oid]/kasittelyntila": { label: "Käsittelyn tila", queryParams: { oid: projekti?.oid } }, + "/yllapito/projekti/[oid]/henkilot": { label: "Henkilöt ja käyttöoikeushallinta", queryParams: { oid: projekti?.oid } }, + "/yllapito/projekti/[oid]/suunnittelu": { label: "Suunnittelu ja vuorovaikutus", queryParams: { oid: projekti?.oid } }, + "/yllapito/projekti/[oid]/suunnittelu/vuorovaikuttaminen": { + label: "Vuorovaikutus", + disableRoute: true, + queryParams: { oid: projekti?.oid }, + }, + "/yllapito/projekti/[oid]/suunnittelu/vuorovaikuttaminen/[kierrosId]": { + label: kierrosId ? `${kierrosId}. vuorovaikuttaminen` : "Vuorovaikuttaminen", + queryParams: { oid: projekti?.oid, kierrosId }, + }, + "/yllapito/projekti/[oid]/nahtavillaolo": { label: "Nähtävilläolovaihe", queryParams: { oid: projekti?.oid } }, + "/yllapito/projekti/[oid]/nahtavillaolo/aineisto": { label: "Aineisto", queryParams: { oid: projekti?.oid } }, + "/yllapito/projekti/[oid]/hyvaksymispaatos": { label: "Hyväksymispäätös", queryParams: { oid: projekti?.oid } }, + "/yllapito/projekti/[oid]/jatkaminen1": { label: "1. jatkaminen", queryParams: { oid: projekti?.oid } }, "/yllapito/ohjeet": { label: "Ohjeet" }, "/_error": { label: "Virhe" }, }; @@ -109,9 +130,8 @@ export const generateRoutes = (nextRouter: NextRouter, labels: RouteLabels): Rou const jointPathname = joinPath(pathnameSplitted, index); if (isRouteVisible(jointPathname)) { const routeLabel = labels[jointPathname]; - const label = routeLabel?.label || pathname; - const preventTranslation = !!routeLabel ? routeLabel.preventTranslation : true; - reducer[jointPathname] = { label, preventTranslation }; + const { label = pathname, preventTranslation = true, disableRoute, queryParams } = routeLabel || {}; + reducer[jointPathname] = { label, preventTranslation, disableRoute, queryParams }; } return reducer; }, {}); @@ -128,16 +148,18 @@ const BreadcrumbComponent: FC<{ routeLabels: RouteLabels; isYllapito?: boolean }
  • {t("common:sivustonimi")}
  • - {Object.entries(routeLabels).map(([pathname, { label, preventTranslation }]) => ( + {Object.entries(routeLabels).map(([pathname, { label, preventTranslation, disableRoute, queryParams }]) => ( - {!isCurrentRoute(pathname, router) ? ( - + {!isCurrentRoute(pathname, router) && !disableRoute ? ( + {!isYllapito && !preventTranslation ? t(`common:polut.${label}`) : label} ) : ( - {!isYllapito && !preventTranslation ? t(`common:polut.${label}`) : label} + + {!isYllapito && !preventTranslation ? t(`common:polut.${label}`) : label} + )} ))} diff --git a/src/components/layout/HassuMuiThemeProvider.tsx b/src/components/layout/HassuMuiThemeProvider.tsx index e75f99a47..96ae51049 100644 --- a/src/components/layout/HassuMuiThemeProvider.tsx +++ b/src/components/layout/HassuMuiThemeProvider.tsx @@ -226,6 +226,40 @@ export const createLocalizedTheme = (locale: Localization) => }, }, }, + MuiTab: { + styleOverrides: { + root: { + paddingTop: "18px", + paddingBottom: "18px", + paddingLeft: "40px", + paddingRight: "40px", + textTransform: "none", + fontWeight: 400, + fontSize: "1rem", + lineHeight: 1.5, + color: "#242222", + opacity: 1, + "&.Mui-selected:not(.Mui-disabled)": { + color: "#0064AF", + }, + }, + }, + }, + MuiTabs: { + defaultProps: { + variant: "scrollable", + scrollButtons: "auto", + }, + styleOverrides: { + root: { + borderBottom: "1px #979797 solid", + }, + indicator: { + backgroundColor: "#0064AF", + height: "3px", + }, + }, + }, MuiFormControlLabel: { styleOverrides: { root: { diff --git a/src/components/layout/LinkTab.tsx b/src/components/layout/LinkTab.tsx new file mode 100644 index 000000000..eee57fe7f --- /dev/null +++ b/src/components/layout/LinkTab.tsx @@ -0,0 +1,11 @@ +import { Tab, TabProps } from "@mui/material"; +import Link, { LinkProps } from "next/link"; +import React, { FC } from "react"; + +export type LinkTabProps = TabProps & { linkProps: LinkProps }; + +export const LinkTab: FC = ({ linkProps, ...tabProps }) => ( + + + +); diff --git a/src/components/layout/tabs/Tabs.tsx b/src/components/layout/tabs/Tabs.tsx index 4a5eda0d3..0e5c45494 100644 --- a/src/components/layout/tabs/Tabs.tsx +++ b/src/components/layout/tabs/Tabs.tsx @@ -19,7 +19,7 @@ const TabStyle = { color: "#999999", }, }, -} as const; +}; export type TabStyle = keyof typeof TabStyle; diff --git a/src/components/projekti/ProjektiConsumer.tsx b/src/components/projekti/ProjektiConsumer.tsx new file mode 100644 index 000000000..e4422dd70 --- /dev/null +++ b/src/components/projekti/ProjektiConsumer.tsx @@ -0,0 +1,17 @@ +import React, { ReactElement } from "react"; +import { ProjektiLisatiedolla, useProjekti, useProjektiOptions } from "src/hooks/useProjekti"; + +interface ProjektiConsumerProps { + children?: (p: ProjektiLisatiedolla) => ReactElement | null; + useProjektiOptions?: useProjektiOptions; +} + +const ProjektiConsumer = ({ children, useProjektiOptions }: ProjektiConsumerProps) => { + const { data: projekti } = useProjekti(useProjektiOptions); + if (!projekti || !children) { + return <>; + } + return <>{children(projekti)}; +}; + +export default ProjektiConsumer; diff --git a/src/components/projekti/ProjektiSideNavigation.tsx b/src/components/projekti/ProjektiSideNavigation.tsx index 15f2dd4c4..cdc1131cc 100644 --- a/src/components/projekti/ProjektiSideNavigation.tsx +++ b/src/components/projekti/ProjektiSideNavigation.tsx @@ -35,6 +35,7 @@ const ProjektiSideNavigation: FC<{ projekti: ProjektiLisatiedolla }> = ({ projek .filter((route) => isVisible(projekti, route)) .map((route, index) => { const statusDisabled = !projektiMeetsMinimumStatus(projekti, route.requiredStatus); + const isSelected = route.requireExactMatch ? route.pathname === router.pathname : router.pathname.startsWith(route.pathname!); return (
  • = ({ projek href={!statusDisabled ? { pathname: route.pathname, query: { oid: projekti.oid } } : undefined} className={classNames( "block pr-12 p-4 border-l-4", - router.pathname === route.pathname ? "border-primary bg-gray-light" : "border-transparent", + isSelected ? "border-primary bg-gray-light" : "border-transparent", statusDisabled ? "text-gray" : "hover:bg-gray-light" )} > diff --git a/src/components/projekti/common/SuunnitelmatJaAineistot.tsx b/src/components/projekti/common/SuunnitelmatJaAineistot.tsx index f101b3967..169351c78 100644 --- a/src/components/projekti/common/SuunnitelmatJaAineistot.tsx +++ b/src/components/projekti/common/SuunnitelmatJaAineistot.tsx @@ -20,7 +20,7 @@ import { Column } from "react-table"; import { useHassuTable } from "src/hooks/useHassuTable"; import { useProjekti } from "src/hooks/useProjekti"; import { formatDateTime } from "src/util/dateUtils"; -import HyvaksymisPaatosTiedostot from "../hyvaksyminen/aineistot/HyvaksymisPaatosTiedostot"; +import HyvaksymisPaatosTiedostot from "../paatos/aineistot/HyvaksymisPaatosTiedostot"; interface AineistoNahtavilla { [kategoriaId: string]: AineistoInput[]; diff --git a/src/components/projekti/hyvaksyminen/aineistot/Lukunakyma.tsx b/src/components/projekti/hyvaksyminen/aineistot/Lukunakyma.tsx deleted file mode 100644 index aadb8b5fa..000000000 --- a/src/components/projekti/hyvaksyminen/aineistot/Lukunakyma.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import HassuAccordion, { AccordionItem } from "@components/HassuAccordion"; -import Section from "@components/layout/Section"; -import HassuAineistoNimiExtLink from "@components/projekti/HassuAineistoNimiExtLink"; -import { Stack } from "@mui/material"; -import { HyvaksymisPaatosVaiheJulkaisu, HyvaksymisPaatosVaiheTila } from "@services/api"; -import { AineistoKategoria, aineistoKategoriat, getNestedAineistoMaaraForCategory } from "common/aineistoKategoriat"; -import useTranslation from "next-translate/useTranslation"; -import React, { FC, useMemo } from "react"; -import { useProjekti } from "src/hooks/useProjekti"; -import { formatDate, formatDateTime } from "src/util/dateUtils"; -import { examineJulkaisuPaiva } from "../../../../util/dateUtils"; - -export default function Lukunakyma() { - const { data: projekti } = useProjekti(); - - const julkaisu = useMemo( - () => projekti?.hyvaksymisPaatosVaiheJulkaisut?.[projekti.hyvaksymisPaatosVaiheJulkaisut.length - 1], - [projekti] - ); - - const { published } = examineJulkaisuPaiva( - julkaisu?.tila === HyvaksymisPaatosVaiheTila.HYVAKSYTTY, - julkaisu?.kuulutusPaiva - ); - - if (!projekti || !julkaisu) { - return null; - } - - return ( - <> -
    -

    Päätös ja sen liitteenä oleva aineisto

    - {published && ( -

    - Aineistot ovat nähtävillä palvelun julkisella puolella - {" " + formatDate(julkaisu.kuulutusVaihePaattyyPaiva) + " "} - saakka. -

    - )} -

    Päätös

    - {julkaisu && julkaisu.hyvaksymisPaatos && ( - - {julkaisu.hyvaksymisPaatos.map((aineisto) => ( - - - {aineisto.tuotu && formatDateTime(aineisto.tuotu)} - - ))} - - )} -

    Päätöksen liitteenä oleva aineisto

    - -
    - - ); -} - -interface AineistoNahtavillaAccordionProps { - julkaisu: HyvaksymisPaatosVaiheJulkaisu; - kategoriat: AineistoKategoria[]; -} - -const AineistoNahtavillaAccordion: FC = ({ julkaisu, kategoriat }) => { - const { t } = useTranslation("aineisto"); - const accordionItems: AccordionItem[] = useMemo( - () => - kategoriat - .filter((kategoria) => julkaisu.aineistoNahtavilla?.some((aineisto) => aineisto.kategoriaId === kategoria.id)) - .map((kategoria) => ({ - id: kategoria.id, - title: ( - - {t(`aineisto-kategoria-nimi.${kategoria.id}`)} - {" (" + getNestedAineistoMaaraForCategory(julkaisu.aineistoNahtavilla || [], kategoria) + ")"} - - ), - content: ( - <> - {julkaisu.aineistoNahtavilla && ( - - {julkaisu.aineistoNahtavilla - .filter((aineisto) => aineisto.kategoriaId === kategoria.id) - .map((aineisto) => ( - - - {aineisto.tuotu && formatDateTime(aineisto.tuotu)} - - ))} - - )} - {kategoria.alaKategoriat && ( - - )} - - ), - })), - [t, julkaisu, kategoriat] - ); - return !!accordionItems.length ? : null; -}; diff --git a/src/components/projekti/hyvaksyminen/aineistot/Muokkausnakyma.tsx b/src/components/projekti/hyvaksyminen/aineistot/Muokkausnakyma.tsx deleted file mode 100644 index 090405ef1..000000000 --- a/src/components/projekti/hyvaksyminen/aineistot/Muokkausnakyma.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import { yupResolver } from "@hookform/resolvers/yup"; -import { Aineisto, AineistoInput, TallennaProjektiInput } from "@services/api"; -import React, { ReactElement, useEffect, useMemo } from "react"; -import { UseFormProps, useForm, FormProvider } from "react-hook-form"; -import { useProjekti } from "src/hooks/useProjekti"; -import { nahtavillaoloAineistotSchema } from "src/schemas/nahtavillaoloAineistot"; -import HyvaksymisPaatosVaihePainikkeet from "./HyvaksymisPaatosVaihePainikkeet"; -import SuunnitelmatJaAineistot from "../../common/SuunnitelmatJaAineistot"; -import { ProjektiLisatiedolla } from "src/hooks/useProjekti"; -import { aineistoKategoriat } from "common/aineistoKategoriat"; -import useLeaveConfirm from "src/hooks/useLeaveConfirm"; -import useIsAllowedOnCurrentProjektiRoute from "src/hooks/useIsOnAllowedProjektiRoute"; - -interface AineistoNahtavilla { - [kategoriaId: string]: AineistoInput[]; -} - -type FormData = { - aineistoNahtavilla: AineistoNahtavilla; - hyvaksymisPaatos: AineistoInput[]; -}; - -export type HyvaksymisPaatosVaiheAineistotFormValues = Pick & FormData; - -const getDefaultValueForAineistoNahtavilla = (aineistot: Aineisto[] | undefined | null) => { - return aineistoKategoriat.listKategoriaIds().reduce((aineistoNahtavilla, currentKategoriaId) => { - aineistoNahtavilla[currentKategoriaId] = - aineistot - ?.filter((aineisto) => aineisto.kategoriaId === currentKategoriaId) - .map((aineisto) => ({ - dokumenttiOid: aineisto.dokumenttiOid, - nimi: aineisto.nimi, - jarjestys: aineisto.jarjestys, - kategoriaId: aineisto.kategoriaId, - })) || []; - return aineistoNahtavilla; - }, {}); -}; - -interface Props { - setIsDirty: (value: React.SetStateAction) => void; -} - -export default function Muokkausnakyma({ setIsDirty }: Props): ReactElement { - const { data: projekti } = useProjekti({ revalidateOnMount: true }); - - return <>{projekti && }; -} - -interface MuokkausnakymaFormProps { - projekti: ProjektiLisatiedolla; -} - -function MuokkausnakymaForm({ projekti, setIsDirty }: MuokkausnakymaFormProps & Props) { - const defaultValues: HyvaksymisPaatosVaiheAineistotFormValues = useMemo(() => { - const hyvaksymisPaatos: AineistoInput[] = - projekti.hyvaksymisPaatosVaihe?.hyvaksymisPaatos?.map(({ dokumenttiOid, nimi, jarjestys }) => ({ - dokumenttiOid, - jarjestys, - nimi, - })) || []; - - return { - oid: projekti.oid, - aineistoNahtavilla: getDefaultValueForAineistoNahtavilla(projekti.hyvaksymisPaatosVaihe?.aineistoNahtavilla), - hyvaksymisPaatos, - }; - }, [projekti]); - - const formOptions: UseFormProps = { - resolver: yupResolver(nahtavillaoloAineistotSchema, { abortEarly: false, recursive: true }), - mode: "onChange", - reValidateMode: "onChange", - defaultValues, - }; - - const useFormReturn = useForm(formOptions); - const { - formState: { isDirty }, - } = useFormReturn; - - const { isAllowedOnRoute } = useIsAllowedOnCurrentProjektiRoute(); - - useEffect(() => { - setIsDirty(isDirty); - }, [isDirty, setIsDirty]); - - useLeaveConfirm(isDirty); - - return ( - -
    -
    - - -
    -
    -
    - ); -} diff --git a/src/components/projekti/hyvaksyminen/aineistot/index.tsx b/src/components/projekti/hyvaksyminen/aineistot/index.tsx deleted file mode 100644 index 4f2cc2325..000000000 --- a/src/components/projekti/hyvaksyminen/aineistot/index.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import React from "react"; -import { useProjekti } from "src/hooks/useProjekti"; -import Lukunakyma from "./Lukunakyma"; -import Muokkausnakyma from "./Muokkausnakyma"; - -interface Props { - setIsDirty: (value: React.SetStateAction) => void; -} - -export default function Aineistot({ setIsDirty }: Props) { - const { data: projekti } = useProjekti(); - - const voiMuokata = !projekti?.hyvaksymisPaatosVaiheJulkaisut?.length; - return voiMuokata ? : ; -} diff --git a/src/components/projekti/hyvaksyminen/kuulutuksenTiedot/KuulutusJaJulkaisuPaiva.tsx b/src/components/projekti/hyvaksyminen/kuulutuksenTiedot/KuulutusJaJulkaisuPaiva.tsx deleted file mode 100644 index 5d8c6d9a7..000000000 --- a/src/components/projekti/hyvaksyminen/kuulutuksenTiedot/KuulutusJaJulkaisuPaiva.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import Section from "@components/layout/Section"; -import SectionContent from "@components/layout/SectionContent"; -import React, { useCallback } from "react"; -import { useFormContext } from "react-hook-form"; -import dayjs from "dayjs"; -import log from "loglevel"; -import { api, LaskuriTyyppi } from "@services/api"; -import useSnackbars from "src/hooks/useSnackbars"; -import HassuGrid from "@components/HassuGrid"; -import { HassuDatePickerWithController } from "@components/form/HassuDatePicker"; - -type Props = {}; - -type FormFields = { - hyvaksymisPaatosVaihe: { - kuulutusPaiva: string | null; - kuulutusVaihePaattyyPaiva: string | null; - }; -}; - -export default function KuulutusJaJulkaisuPaiva({}: Props) { - const { setValue } = useFormContext(); - - const { showErrorMessage } = useSnackbars(); - - const getPaattymispaiva = useCallback( - async (value: string) => { - try { - const paattymispaiva = await api.laskePaattymisPaiva(value, LaskuriTyyppi.HYVAKSYMISPAATOKSEN_KUULUTUSAIKA); - setValue("hyvaksymisPaatosVaihe.kuulutusVaihePaattyyPaiva", paattymispaiva); - } catch (error) { - showErrorMessage("Kuulutuksen päättymispäivän laskennassa tapahtui virhe"); - log.error("Kuulutusvaiheen päättymispäivän laskennassa virhe", error); - } - }, - [setValue, showErrorMessage] - ); - - return ( -
    - -

    Kuulutus ja julkaisupäivä

    -

    Anna päivämäärä, jolle kuulutus päivätään ja julkaistaan palvelun julkisella puolella.

    - - { - if (date?.isValid()) { - getPaattymispaiva(date.format("YYYY-MM-DD")); - } - }} - textFieldProps={{ required: true }} - controllerProps={{ - name: "hyvaksymisPaatosVaihe.kuulutusPaiva", - }} - /> - - -
    -
    - ); -} diff --git a/src/components/projekti/hyvaksyminen/kuulutuksenTiedot/MuutoksenHaku.tsx b/src/components/projekti/hyvaksyminen/kuulutuksenTiedot/MuutoksenHaku.tsx deleted file mode 100644 index 879658dd0..000000000 --- a/src/components/projekti/hyvaksyminen/kuulutuksenTiedot/MuutoksenHaku.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import Section from "@components/layout/Section"; -import SectionContent from "@components/layout/SectionContent"; -import React from "react"; -import { useFormContext } from "react-hook-form"; -import { HallintoOikeus } from "@services/api"; -import Select from "@components/form/Select"; -import useTranslation from "next-translate/useTranslation"; -import { Controller } from "react-hook-form"; - -type Props = {}; - -type FormFields = { - hyvaksymisPaatosVaihe: { - hallintoOikeus: HallintoOikeus; - }; -}; - -export default function MuutoksenHaku({}: Props) { - const { - register, - formState: { errors }, - control, - } = useFormContext(); - - const { t } = useTranslation("common"); - - return ( -
    - -

    Muutoksen haku

    -

    - Päätökseen voi valittamalla hakea muutosta hallinto-oikeudelta 30 päivän kuluessa päätöksen tiedoksiannosta. - Valitse pudostusvalikosta hallinto-oikeus, johon muutoksenhaku osoitetaan tehtävän. -

    - -
    - ( - - - - ); - }, - }, - { - Header: "Tuotu", - accessor: (aineisto) => (aineisto.tuotu ? formatDateTime(aineisto.tuotu) : undefined), - }, - { - Header: "Poista", - accessor: (aineisto) => { - const index = enrichedFields.findIndex((row) => row.dokumenttiOid === aineisto.dokumenttiOid); - return ( - { - remove(index); - }} - icon="trash" - /> - ); - }, - }, - { Header: "id", accessor: "id" }, - { Header: "dokumenttiOid", accessor: "dokumenttiOid" }, - ], - [enrichedFields, formState.errors.jatkopaatos1, register, remove] - ); - const tableProps = useHassuTable({ - tableOptions: { columns, data: enrichedFields || [], initialState: { hiddenColumns: ["dokumenttiOid", "id"] } }, - }); - return ; -} diff --git a/src/components/projekti/jatkopaatos1/aineistot/Jatkopaatos1VaihePainikkeet.tsx b/src/components/projekti/jatkopaatos1/aineistot/Jatkopaatos1VaihePainikkeet.tsx deleted file mode 100644 index 6b8263704..000000000 --- a/src/components/projekti/jatkopaatos1/aineistot/Jatkopaatos1VaihePainikkeet.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import Button from "@components/button/Button"; -import HassuSpinner from "@components/HassuSpinner"; -import Section from "@components/layout/Section"; -import { Stack } from "@mui/material"; -import { api, TallennaProjektiInput } from "@services/api"; -import log from "loglevel"; -import React, { useState } from "react"; -import { useFormContext } from "react-hook-form"; -import { useProjekti } from "src/hooks/useProjekti"; -import useSnackbars from "src/hooks/useSnackbars"; -import deleteFieldArrayIds from "src/util/deleteFieldArrayIds"; -import { JatkoPaatos1VaiheAineistotFormValues } from "./Muokkausnakyma"; - -const mapFormValuesToTallennaProjektiInput = ({ - oid, - hyvaksymisPaatos, - aineistoNahtavilla, -}: JatkoPaatos1VaiheAineistotFormValues): TallennaProjektiInput => { - const aineistoNahtavillaFlat = Object.values(aineistoNahtavilla).flat(); - deleteFieldArrayIds(aineistoNahtavillaFlat); - deleteFieldArrayIds(hyvaksymisPaatos); - - return { oid, jatkoPaatos1Vaihe: { aineistoNahtavilla: aineistoNahtavillaFlat, hyvaksymisPaatos } }; -}; - -export default function Jatkopaatos1Painikkeet() { - const { mutate: reloadProjekti } = useProjekti(); - const [isFormSubmitting, setIsFormSubmitting] = useState(false); - const { showSuccessMessage, showErrorMessage } = useSnackbars(); - - const { handleSubmit, reset } = useFormContext(); - - const saveSuunnitteluvaihe = async (formData: TallennaProjektiInput) => { - await api.tallennaProjekti(formData); - if (reloadProjekti) await reloadProjekti(); - }; - - const saveDraft = async (formData: JatkoPaatos1VaiheAineistotFormValues) => { - setIsFormSubmitting(true); - try { - await saveSuunnitteluvaihe(mapFormValuesToTallennaProjektiInput(formData)); - reloadProjekti(); - reset(formData); - showSuccessMessage("Tallennus onnistui!"); - } catch (e) { - log.error("OnSubmit Error", e); - showErrorMessage("Tallennuksessa tapahtui virhe"); - } - setIsFormSubmitting(false); - }; - - return ( - <> -
    - - - - -
    - - - ); -} diff --git a/src/components/projekti/jatkopaatos1/aineistot/Muokkausnakyma.tsx b/src/components/projekti/jatkopaatos1/aineistot/Muokkausnakyma.tsx deleted file mode 100644 index 611d2a091..000000000 --- a/src/components/projekti/jatkopaatos1/aineistot/Muokkausnakyma.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import { yupResolver } from "@hookform/resolvers/yup"; -import { Aineisto, AineistoInput, TallennaProjektiInput } from "@services/api"; -import React, { ReactElement, useEffect, useMemo } from "react"; -import { UseFormProps, useForm, FormProvider } from "react-hook-form"; -import { useProjekti } from "src/hooks/useProjekti"; -import { nahtavillaoloAineistotSchema } from "src/schemas/nahtavillaoloAineistot"; -import Jatkopaatos1VaihePainikkeet from "./Jatkopaatos1VaihePainikkeet"; -import SuunnitelmatJaAineistot from "../../common/SuunnitelmatJaAineistot"; -import { ProjektiLisatiedolla } from "src/hooks/useProjekti"; -import { aineistoKategoriat } from "common/aineistoKategoriat"; -import useLeaveConfirm from "src/hooks/useLeaveConfirm"; -import useIsAllowedOnCurrentProjektiRoute from "src/hooks/useIsOnAllowedProjektiRoute"; - -interface AineistoNahtavilla { - [kategoriaId: string]: AineistoInput[]; -} - -type FormData = { - aineistoNahtavilla: AineistoNahtavilla; - hyvaksymisPaatos: AineistoInput[]; -}; - -export type JatkoPaatos1VaiheAineistotFormValues = Pick & FormData; - -const getDefaultValueForAineistoNahtavilla = (aineistot: Aineisto[] | undefined | null) => { - return aineistoKategoriat.listKategoriaIds().reduce((aineistoNahtavilla, currentKategoriaId) => { - aineistoNahtavilla[currentKategoriaId] = - aineistot - ?.filter((aineisto) => aineisto.kategoriaId === currentKategoriaId) - .map((aineisto) => ({ - dokumenttiOid: aineisto.dokumenttiOid, - nimi: aineisto.nimi, - jarjestys: aineisto.jarjestys, - kategoriaId: aineisto.kategoriaId, - })) || []; - return aineistoNahtavilla; - }, {}); -}; - -interface Props { - setIsDirty: (value: React.SetStateAction) => void; -} - -export default function Muokkausnakyma({ setIsDirty }: Props): ReactElement { - const { data: projekti } = useProjekti({ revalidateOnMount: true }); - - return <>{projekti && }; -} - -interface MuokkausnakymaFormProps { - projekti: ProjektiLisatiedolla; -} - -function MuokkausnakymaForm({ projekti, setIsDirty }: MuokkausnakymaFormProps & Props) { - const defaultValues: JatkoPaatos1VaiheAineistotFormValues = useMemo(() => { - const hyvaksymisPaatos: AineistoInput[] = - projekti.jatkoPaatos1Vaihe?.hyvaksymisPaatos?.map(({ dokumenttiOid, nimi, jarjestys }) => ({ - dokumenttiOid, - jarjestys, - nimi, - })) || []; - - return { - oid: projekti.oid, - aineistoNahtavilla: getDefaultValueForAineistoNahtavilla(projekti.jatkoPaatos1Vaihe?.aineistoNahtavilla), - hyvaksymisPaatos, - }; - }, [projekti]); - - const formOptions: UseFormProps = { - resolver: yupResolver(nahtavillaoloAineistotSchema, { abortEarly: false, recursive: true }), - mode: "onChange", - reValidateMode: "onChange", - defaultValues, - }; - - const useFormReturn = useForm(formOptions); - const { - formState: { isDirty }, - } = useFormReturn; - - const { isAllowedOnRoute } = useIsAllowedOnCurrentProjektiRoute(); - - useEffect(() => { - setIsDirty(isDirty); - }, [isDirty, setIsDirty]); - - useLeaveConfirm(isDirty); - - return ( - -
    -
    - - -
    -
    -
    - ); -} diff --git a/src/components/projekti/jatkopaatos1/aineistot/index.tsx b/src/components/projekti/jatkopaatos1/aineistot/index.tsx deleted file mode 100644 index d850398ca..000000000 --- a/src/components/projekti/jatkopaatos1/aineistot/index.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import React from "react"; -import { useProjekti } from "src/hooks/useProjekti"; -import Lukunakyma from "./Lukunakyma"; -import Muokkausnakyma from "./Muokkausnakyma"; - -interface Props { - setIsDirty: (value: React.SetStateAction) => void; -} - -export default function Aineistot({ setIsDirty }: Props) { - const { data: projekti } = useProjekti(); - - const voiMuokata = !projekti?.jatkoPaatos1VaiheJulkaisut?.length; - return voiMuokata ? : ; -} diff --git a/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/IlmoituksenVastaanottajat.tsx b/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/IlmoituksenVastaanottajat.tsx deleted file mode 100644 index ee3db87c0..000000000 --- a/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/IlmoituksenVastaanottajat.tsx +++ /dev/null @@ -1,250 +0,0 @@ -import Button from "@components/button/Button"; -import Select from "@components/form/Select"; -import TextInput from "@components/form/TextInput"; -import React, { Fragment, ReactElement } from "react"; -import { Controller, FieldError, useFieldArray, useFormContext } from "react-hook-form"; -import { formatProperNoun } from "common/util/formatProperNoun"; -import useTranslation from "next-translate/useTranslation"; -import IconButton from "@components/button/IconButton"; -import { KuntaVastaanottajaInput, HyvaksymisPaatosVaihe, ViranomaisVastaanottajaInput, Projekti, Kieli } from "@services/api"; -import Section from "@components/layout/Section"; -import SectionContent from "@components/layout/SectionContent"; -import HassuGrid from "@components/HassuGrid"; -import dayjs from "dayjs"; -import useKirjaamoOsoitteet from "src/hooks/useKirjaamoOsoitteet"; -import { Link } from "@mui/material"; -import { kuntametadata } from "common/kuntametadata"; -import useKansalaiskieli from "src/hooks/useKansalaiskieli"; - -interface HelperType { - kunnat?: FieldError | { nimi?: FieldError | undefined; sahkoposti?: FieldError | undefined }[] | undefined; - viranomaiset?: FieldError | null | undefined; -} - -interface Props { - jatkoPaatos1Vaihe?: HyvaksymisPaatosVaihe | null | undefined; - projekti: Projekti | null | undefined; -} - -type FormFields = { - jatkoPaatos1Vaihe: { - ilmoituksenVastaanottajat: { - kunnat: Array; - viranomaiset: Array; - }; - }; -}; - -export default function IlmoituksenVastaanottajat({ projekti }: Props): ReactElement { - const { t } = useTranslation("commonFI"); - const { data: kirjaamoOsoitteet } = useKirjaamoOsoitteet(); - - const julkinen = false; //TODO - - const { - register, - control, - formState: { errors }, - setValue, - watch, - } = useFormContext(); - - const kieli = useKansalaiskieli(); - - const ilmoituksenVastaanottajat = watch("jatkoPaatos1Vaihe.ilmoituksenVastaanottajat"); - - const { fields: kuntaFields } = useFieldArray({ - control, - name: "jatkoPaatos1Vaihe.ilmoituksenVastaanottajat.kunnat", - }); - - const { - fields: viranomaisFields, - append, - remove, - } = useFieldArray({ - control, - name: "jatkoPaatos1Vaihe.ilmoituksenVastaanottajat.viranomaiset", - }); - - const getKuntanimi = (index: number, lang: Kieli) => { - const nimi = kuntametadata.nameForKuntaId(ilmoituksenVastaanottajat?.kunnat?.[index].id, lang); - if (!nimi) { - return; - } - - return formatProperNoun(nimi); - }; - - if (!projekti) { - return <>; - } - if (!kirjaamoOsoitteet) { - return <>; - } - - return ( - <> - {julkinen && ( -
    -

    Ilmoituksen vastaanottajat

    - -

    - Ilmoitukset on lähetetty eteenpäin alla oleville viranomaisille ja kunnille. Jos ilmoituksen tila on ‘Ei lähetetty’, tarkasta - sähköpostiosoite. Ota tarvittaessa yhteys pääkäyttäjään. -

    -
    - -
    -
    Viranomaiset
    -

    -

    Ilmoituksen tila

    -

    Lähetysaika

    - - {projekti.jatkoPaatos1Vaihe?.ilmoituksenVastaanottajat?.viranomaiset?.map((viranomainen, index) => ( - -

    - {t(`viranomainen.${viranomainen.nimi}`)}, {viranomainen.sahkoposti} -

    -

    {viranomainen.lahetetty ? "Lähetetty" : "Ei lähetetty"}

    -

    - {viranomainen.lahetetty ? dayjs(viranomainen.lahetetty).format("DD.MM.YYYY HH:mm") : null} -

    -
    - ))} -
    -
    - -
    Kunnat
    -
    -

    Kunta

    -

    Sähköpostiosoite

    -

    Ilmoituksen tila

    -

    Lähetysaika

    - {projekti.jatkoPaatos1Vaihe?.ilmoituksenVastaanottajat?.kunnat?.map((kunta, index) => ( - -

    {kuntametadata.nameForKuntaId(kunta.id, kieli)}

    -

    {kunta.sahkoposti}

    -

    {kunta.lahetetty ? "Lahetetty" : "Ei lähetetty"}

    -

    {kunta.lahetetty ? dayjs(kunta.lahetetty).format("DD.MM.YYYY HH:mm") : null}

    -
    - ))} -
    -
    -
    - )} -
    -
    -

    Ilmoituksen vastaanottajat

    - -

    - Kuulutuksesta lähetetään sähköpostitse tiedote viranomaiselle sekä projektia koskeville kunnille. Kunnat on haettu - Projektivelhosta. Jos tiedote pitää lähettää useammalle kuin yhdelle viranomaisorganisaatiolle, lisää uusi rivi Lisää uusi - -painikkeella. -

    -

    - Jos kuntatiedoissa on virhe tai kuntia puuttuu, tee korjaus Projektivelhoon ja päivitä järjesteltämästä{" "} - - Projektin tiedot - {" "} - -sivu. -

    -
    - - <> - -
    Viranomaiset
    - {(errors.jatkoPaatos1Vaihe?.ilmoituksenVastaanottajat as HelperType)?.viranomaiset && ( -

    {(errors.jatkoPaatos1Vaihe?.ilmoituksenVastaanottajat as HelperType).viranomaiset?.message}

    - )} - {viranomaisFields.map((viranomainen, index) => ( - - - - )} - /> - {!!index && ( - <> -
    - { - event.preventDefault(); - remove(index); - }} - /> -
    -
    - -
    - - )} -
    - ))} -
    - - - -
    Kunnat
    - - {kuntaFields.map((kunta, index) => ( - - - - - - ))} -
    -
    -
    - - ); -} - -function getStyleForRow(index: number): string | undefined { - if (index % 2 == 0) { - return "vayla-table-even"; - } - return "vayla-table-odd"; -} diff --git a/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/JatkoPaatos1KuulutusPainikkeet.tsx b/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/JatkoPaatos1KuulutusPainikkeet.tsx deleted file mode 100644 index f4eacd2a3..000000000 --- a/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/JatkoPaatos1KuulutusPainikkeet.tsx +++ /dev/null @@ -1,205 +0,0 @@ -import Button from "@components/button/Button"; -import HassuSpinner from "@components/HassuSpinner"; -import Section from "@components/layout/Section"; -import { Stack } from "@mui/material"; -import { api, Status } from "@services/api"; -import log from "loglevel"; -import { useRouter } from "next/router"; -import React, { useState, useCallback, useRef, useEffect } from "react"; -import { useFormContext } from "react-hook-form"; -import { useProjekti } from "src/hooks/useProjekti"; -import useSnackbars from "src/hooks/useSnackbars"; -import { TilasiirtymaToiminto, TilasiirtymaTyyppi, HyvaksymisPaatosVaiheTila, Projekti } from "@services/api"; -import { ProjektiLisatiedolla } from "src/hooks/useProjekti"; -import { KuulutuksenTiedotFormValues } from "./index"; -import Modaalit from "./Modaalit"; -import { projektiMeetsMinimumStatus } from "src/hooks/useIsOnAllowedProjektiRoute"; - -type PalautusValues = { - syy: string; -}; -interface Props { - projekti: ProjektiLisatiedolla; -} - -export default function JatkoPaatos1KuulutusPainikkeet({ projekti }: Props) { - const { mutate: reloadProjekti } = useProjekti(); - const [isFormSubmitting, setIsFormSubmitting] = useState(false); - const { showSuccessMessage, showErrorMessage } = useSnackbars(); - const [open, setOpen] = useState(false); - const [openHyvaksy, setOpenHyvaksy] = useState(false); - const router = useRouter(); - - const mounted = useRef(false); - - useEffect(() => { - mounted.current = true; // Will set it to true on mount ... - return () => { - mounted.current = false; - }; // ... and to false on unmount - }, []); - - const { handleSubmit, reset } = useFormContext(); - - const saveHyvaksymisPaatosVaihe = useCallback( - async (formData: KuulutuksenTiedotFormValues) => { - await api.tallennaProjekti(formData); - if (reloadProjekti) await reloadProjekti(); - reset(formData); - }, - [reloadProjekti, reset] - ); - - const saveDraft = useCallback(async (formData: KuulutuksenTiedotFormValues) => { - setIsFormSubmitting(true); - try { - await saveHyvaksymisPaatosVaihe(formData); - showSuccessMessage("Tallennus onnistui!"); - } catch (e) { - log.error("OnSubmit Error", e); - showErrorMessage("Tallennuksessa tapahtui virhe"); - } - if (mounted.current) { - setIsFormSubmitting(false); - } - }, [saveHyvaksymisPaatosVaihe, showErrorMessage, showSuccessMessage]); - - const vaihdaJatkoPaatos1VaiheenTila = useCallback( - async (toiminto: TilasiirtymaToiminto, viesti: string, syy?: string) => { - if (!projekti) { - return; - } - setIsFormSubmitting(true); - try { - await api.siirraTila({ oid: projekti.oid, toiminto, syy, tyyppi: TilasiirtymaTyyppi.JATKOPAATOS_1 }); - await reloadProjekti(); - showSuccessMessage(`${viesti} onnistui`); - } catch (error) { - log.error(error); - showErrorMessage("Toiminnossa tapahtui virhe"); - } - if (mounted.current) { - setIsFormSubmitting(false); - setOpen(false); - setOpenHyvaksy(false); - } - }, - [setIsFormSubmitting, reloadProjekti, showSuccessMessage, showErrorMessage, setOpen, projekti] - ); - - const lahetaHyvaksyttavaksi = useCallback( - async (formData: KuulutuksenTiedotFormValues) => { - log.debug("tallenna tiedot ja lähetä hyväksyttäväksi"); - setIsFormSubmitting(true); - try { - await saveHyvaksymisPaatosVaihe(formData); - await vaihdaJatkoPaatos1VaiheenTila(TilasiirtymaToiminto.LAHETA_HYVAKSYTTAVAKSI, "Lähetys"); - } catch (error) { - log.error("Virhe hyväksyntään lähetyksessä", error); - showErrorMessage("Hyväksyntään lähetyksessä tapahtui virhe"); - } - if (mounted.current) { - setIsFormSubmitting(false); - } - }, - [setIsFormSubmitting, saveHyvaksymisPaatosVaihe, vaihdaJatkoPaatos1VaiheenTila, showErrorMessage] - ); - - const palautaMuokattavaksi = useCallback( - async (data: PalautusValues) => { - log.debug("palauta muokattavaksi: ", data); - await vaihdaJatkoPaatos1VaiheenTila(TilasiirtymaToiminto.HYLKAA, "Palautus", data.syy); - }, - [vaihdaJatkoPaatos1VaiheenTila] - ); - - const palautaMuokattavaksiJaPoistu = useCallback( - async (data: PalautusValues) => { - log.debug("palauta muokattavaksi ja poistu: ", data); - await vaihdaJatkoPaatos1VaiheenTila(TilasiirtymaToiminto.HYLKAA, "Palautus", data.syy); - const siirtymaTimer = setTimeout(() => { - setIsFormSubmitting(true); - router.push(`/yllapito/projekti/${projekti?.oid}`); - }, 1000); - return () => { - setIsFormSubmitting(false); - clearTimeout(siirtymaTimer); - }; - }, - [vaihdaJatkoPaatos1VaiheenTila, setIsFormSubmitting, projekti, router] - ); - - const hyvaksyKuulutus = useCallback(async () => { - log.debug("hyväksy kuulutus"); - await vaihdaJatkoPaatos1VaiheenTila(TilasiirtymaToiminto.HYVAKSY, "Hyväksyminen"); - }, [vaihdaJatkoPaatos1VaiheenTila]); - - const voiMuokata = !projekti?.jatkoPaatos1VaiheJulkaisut || projekti.jatkoPaatos1VaiheJulkaisut.length < 1; - - const voiHyvaksya = - projekti.jatkoPaatos1VaiheJulkaisut && - projekti.jatkoPaatos1VaiheJulkaisut.length && - projekti.jatkoPaatos1VaiheJulkaisut[projekti.jatkoPaatos1VaiheJulkaisut.length - 1].tila === - HyvaksymisPaatosVaiheTila.ODOTTAA_HYVAKSYNTAA && - projekti?.nykyinenKayttaja.onProjektipaallikko; - - return ( - <> - {!!voiHyvaksya && ( -
    - - - - -
    - )} - {!!voiMuokata && ( - <> -
    - - - - -
    - - - )} - - - ); -} diff --git a/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/KuulutuksenJaIlmoituksenEsikatselu.tsx b/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/KuulutuksenJaIlmoituksenEsikatselu.tsx deleted file mode 100644 index 0834774a5..000000000 --- a/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/KuulutuksenJaIlmoituksenEsikatselu.tsx +++ /dev/null @@ -1,131 +0,0 @@ -import React from "react"; -import Section from "@components/layout/Section"; -import { Kieli, AsiakirjaTyyppi } from "@services/api"; -import Notification, { NotificationType } from "@components/notification/Notification"; -import lowerCase from "lodash/lowerCase"; -import Button from "@components/button/Button"; -import { Box } from "@mui/material"; -import { useProjekti } from "src/hooks/useProjekti"; -import { KuulutuksenTiedotFormValues } from "./index"; -import { useFormContext } from "react-hook-form"; - -type Props = { - esikatselePdf: (formData: KuulutuksenTiedotFormValues, asiakirjaTyyppi: AsiakirjaTyyppi, kieli: Kieli) => void; -}; - -export default function KuulutuksenJaIlmoituksenEsikatselu({ esikatselePdf }: Props) { - const { data: projekti } = useProjekti(); - - const { handleSubmit } = useFormContext(); - - const ensisijainenKieli = projekti?.kielitiedot?.ensisijainenKieli; - const toissijainenKieli = projekti?.kielitiedot?.toissijainenKieli; - - if (!projekti) { - return null; - } - - return ( -
    -

    Kuulutuksen ja ilmoituksen esikatselu

    - Esikatsele kuulutus ja ilmoitus ennen hyväksyntään lähettämistä. -
    - {ensisijainenKieli && ( -
    -

    Esikatsele tiedostot ensisijaisella kielellä ({lowerCase(ensisijainenKieli)})

    - - - - - - -
    - )} - {toissijainenKieli && ( -
    -

    Esikatsele tiedostot toissijaisella kielellä ({lowerCase(toissijainenKieli)})

    - - - - - - -
    - )} -
    -
    - ); -} diff --git a/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/KuulutuksessaEsitettavatYhteystiedot.tsx b/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/KuulutuksessaEsitettavatYhteystiedot.tsx deleted file mode 100644 index bf75f43ba..000000000 --- a/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/KuulutuksessaEsitettavatYhteystiedot.tsx +++ /dev/null @@ -1,205 +0,0 @@ -import { Controller, useFieldArray, useFormContext } from "react-hook-form"; -import SectionContent from "@components/layout/SectionContent"; -import { HyvaksymisPaatosVaiheTila, KayttajaTyyppi, Projekti, ProjektiKayttaja, YhteystietoInput } from "@services/api"; -import Section from "@components/layout/Section"; -import { Fragment, ReactElement } from "react"; -import Button from "@components/button/Button"; -import HassuStack from "@components/layout/HassuStack"; -import CheckBox from "@components/form/CheckBox"; -import FormGroup from "@components/form/FormGroup"; -import TextInput from "@components/form/TextInput"; -import HassuGrid from "@components/HassuGrid"; -import { maxPhoneLength } from "src/schemas/puhelinNumero"; -import IconButton from "@components/button/IconButton"; -import replace from "lodash/replace"; -import { useProjekti } from "src/hooks/useProjekti"; -import { KuulutuksenTiedotFormValues } from "./index"; -import { formatNimi } from "../../../../util/userUtil"; - -const defaultYhteystieto: YhteystietoInput = { - etunimi: "", - sukunimi: "", - organisaatio: "", - puhelinnumero: "", - sahkoposti: "", -}; - -interface Props {} - -export function hasHyvaksyttyJatkoPaatos1VaiheJulkaisu(projekti: Projekti | null | undefined) { - return ( - (projekti?.jatkoPaatos1VaiheJulkaisut?.filter((julkaisu) => julkaisu.tila == HyvaksymisPaatosVaiheTila.HYVAKSYTTY) || []).length > 0 - ); -} - -export default function EsitettavatYhteystiedot({}: Props): ReactElement { - const { data: projekti } = useProjekti(); - - const eiVoiMuokata = hasHyvaksyttyJatkoPaatos1VaiheJulkaisu(projekti); - - const { - register, - formState: { errors }, - control, - } = useFormContext(); - - const { fields, append, remove } = useFieldArray({ - control, - name: "jatkoPaatos1Vaihe.kuulutusYhteystiedot.yhteysTiedot", - }); - - const kuulutusYhteysHenkilot: ProjektiKayttaja[] = projekti?.jatkoPaatos1Vaihe?.kuulutusYhteystiedot?.yhteysHenkilot - ? projekti.jatkoPaatos1Vaihe?.kuulutusYhteystiedot?.yhteysHenkilot - .map((hlo) => { - const yhteysHenkiloTietoineen: ProjektiKayttaja | undefined = (projekti?.kayttoOikeudet || []).find( - (ko) => ko.kayttajatunnus === hlo - ); - if (!yhteysHenkiloTietoineen) { - return {} as ProjektiKayttaja; - } - return yhteysHenkiloTietoineen as ProjektiKayttaja; - }) - .filter((pk) => pk.etunimi && pk.sukunimi) - : ([] as ProjektiKayttaja[]); - - if (eiVoiMuokata) { - return ( -
    - -

    Vuorovaikuttamisen yhteyshenkilöt

    - {projekti?.jatkoPaatos1Vaihe?.kuulutusYhteystiedot?.yhteysTiedot?.map((yhteystieto, index) => ( -

    - {formatNimi(yhteystieto)}, puh. {yhteystieto.puhelinnumero},{" "} - {yhteystieto?.sahkoposti ? replace(yhteystieto?.sahkoposti, "@", "[at]") : ""} ({yhteystieto.organisaatio}) -

    - ))} - {kuulutusYhteysHenkilot.map((yhteystieto, index) => ( -

    - {formatNimi(yhteystieto)}, puh. {yhteystieto.puhelinnumero},{" "} - {yhteystieto.email ? replace(yhteystieto.email, "@", "[at]") : ""} ({yhteystieto.organisaatio}) -

    - ))} -
    -
    - ); - } - - return ( -
    - -

    Kuulutuksessa esitettävät yhteystiedot

    -

    - Voit valita kutsussa esitettäviin yhteystietoihin projektiin tallennetun henkilön tai lisätä uuden yhteystiedon. Projektipäällikön - tiedot esitetään aina. Projektiin tallennettujen henkilöiden yhteystiedot haetaan Projektin henkilöt -sivulle tallennetuista - tiedoista. -

    - {projekti?.kayttoOikeudet && projekti.kayttoOikeudet.length > 0 ? ( - ( - - {projekti.kayttoOikeudet?.map(({ etunimi, sukunimi, tyyppi, kayttajatunnus }, index) => { - const tunnuslista: string[] = value || []; - const nimi = formatNimi({ sukunimi, etunimi }); - return ( - - {tyyppi === KayttajaTyyppi.PROJEKTIPAALLIKKO ? ( - - ) : ( - { - if (!event.target.checked) { - onChange(tunnuslista.filter((tunnus) => tunnus !== kayttajatunnus)); - } else { - onChange([...tunnuslista, kayttajatunnus]); - } - }} - checked={tunnuslista.includes(kayttajatunnus)} - {...field} - /> - )} - - ); - })} - - )} - /> - ) : ( -

    Projektilla ei ole tallennettuja henkilöitä

    - )} -
    - -

    Uusi yhteystieto

    -

    - Lisää uudelle yhteystiedolle rivi Lisää uusi-painikkeella. Huomioi, että uusi yhteystieto ei tallennu Projektin henkilöt -sivulle - eikä henkilölle tule käyttöoikeuksia projektiin. -

    -
    - {fields.map((field, index) => ( - - - - - - - - - -
    -
    - { - event.preventDefault(); - remove(index); - }} - /> -
    -
    - -
    -
    -
    - ))} - -
    - ); -} diff --git a/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/Lukunakyma.tsx b/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/Lukunakyma.tsx deleted file mode 100644 index d976c776e..000000000 --- a/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/Lukunakyma.tsx +++ /dev/null @@ -1,222 +0,0 @@ -import { HyvaksymisPaatosVaiheJulkaisu, Kieli } from "@services/api"; -import React, { ReactElement } from "react"; -import replace from "lodash/replace"; -import { examineKuulutusPaiva } from "src/util/aloitusKuulutusUtil"; -import FormatDate from "@components/FormatDate"; -import Section from "@components/layout/Section"; -import SectionContent from "@components/layout/SectionContent"; -import ExtLink from "@components/ExtLink"; -import useTranslation from "next-translate/useTranslation"; -import { ProjektiLisatiedolla } from "src/hooks/useProjekti"; -import { splitFilePath } from "../../../../util/fileUtil"; -import { Link } from "@mui/material"; -import lowerCase from "lodash/lowerCase"; -import IlmoituksenVastaanottajatLukutila from "../../common/IlmoituksenVastaanottajatLukutila"; -import ButtonFlatWithIcon from "@components/button/ButtonFlat"; -import { ProjektiTestCommand } from "../../../../../common/testUtil.dev"; -import { formatDate } from "src/util/dateUtils"; -import { projektiOnEpaaktiivinen } from "src/util/statusUtil"; -import { formatNimi } from "../../../../util/userUtil"; - -interface Props { - jatkoPaatos1VaiheJulkaisu?: HyvaksymisPaatosVaiheJulkaisu | null; - projekti: ProjektiLisatiedolla; -} - -export default function HyvaksymisKuulutusLukunakyma({ jatkoPaatos1VaiheJulkaisu, projekti }: Props): ReactElement { - const { t } = useTranslation("common"); - const getPdft = (kieli: Kieli | undefined | null) => { - if (!jatkoPaatos1VaiheJulkaisu || !jatkoPaatos1VaiheJulkaisu.hyvaksymisPaatosVaihePDFt || !kieli) { - return undefined; - } - return jatkoPaatos1VaiheJulkaisu?.hyvaksymisPaatosVaihePDFt[kieli]; - }; - const ensisijaisetPDFt = getPdft(jatkoPaatos1VaiheJulkaisu?.kielitiedot?.ensisijainenKieli); - const toissijaisetPDFt = getPdft(jatkoPaatos1VaiheJulkaisu?.kielitiedot?.toissijainenKieli); - - if (!jatkoPaatos1VaiheJulkaisu || !projekti) { - return <>; - } - - const epaaktiivinen = projektiOnEpaaktiivinen(projekti); - - let { kuulutusPaiva, published } = examineKuulutusPaiva(jatkoPaatos1VaiheJulkaisu.kuulutusPaiva); - let hyvaksymisPaatosVaiheHref: string | undefined; - if (published) { - hyvaksymisPaatosVaiheHref = window.location.protocol + "//" + window.location.host + "/suunnitelma/" + projekti.oid + "/jatkaminen1"; - } - - return ( - <> -
    -
    -

    Kuulutuspäivä

    -

    Kuulutusvaihe päättyy

    -

    {kuulutusPaiva}

    -

    - -

    - {process.env.ENVIRONMENT != "prod" && ( -
    - { - e.preventDefault(); - window.location.assign(ProjektiTestCommand.oid(projekti.oid).jatkopaatos1Menneisyyteen()); - }} - > - Siirrä päivän verran menneisyyteen (TESTAAJILLE) - - { - e.preventDefault(); - window.location.assign(ProjektiTestCommand.oid(projekti.oid).jatkopaatos1VuosiMenneisyyteen()); - }} - > - Siirrä vuoden verran menneisyyteen (TESTAAJILLE) - -
    - )} -
    -
    -

    Päätöksen päivä

    -

    Päätöksen asianumero

    -

    - -

    -

    {projekti.kasittelynTila?.hyvaksymispaatos?.asianumero}

    -
    -

    Päätös ja sen liitteet löytyvät Päätös ja sen liitteenä oleva aineisto -välilehdeltä.

    -
    -
    -

    Muutoksenhaku

    -

    - Päätökseen voi valittamalla hakea muutosta {t(`hallinto-oikeus-ablatiivi.${jatkoPaatos1VaiheJulkaisu.hallintoOikeus}`)} 30 päivän - kuluessa päätöksen tiedoksiannosta. Valitusosoituksen tiedosto löytyy Päätös ja sen liitteenä oleva aineisto -välilehdeltä. -

    -
    -
    - -

    Kuulutuksen yhteyshenkilöt

    -

    - {jatkoPaatos1VaiheJulkaisu.yhteystiedot?.map((yhteystieto, index) => ( -

    - {formatNimi(yhteystieto)}, puh. {yhteystieto.puhelinnumero},{" "} - {yhteystieto?.sahkoposti ? replace(yhteystieto?.sahkoposti, "@", "[at]") : ""} ({yhteystieto.organisaatio}) -

    - ))} -
    - {epaaktiivinen ? ( - -

    Kuulutus julkisella puolella

    -

    - Kuulutus on ollut nähtävillä julkisella puolella {formatDate(jatkoPaatos1VaiheJulkaisu.kuulutusPaiva)}— - {formatDate(jatkoPaatos1VaiheJulkaisu.kuulutusVaihePaattyyPaiva)} välisen ajan. -

    -
    - ) : ( - -

    Kuulutus julkisella puolella

    - {!published &&

    Linkki julkiselle puolelle muodostetaan kuulutuspäivänä. Kuulutuspäivä on {kuulutusPaiva}.

    } - {published && ( -

    - Kuulutus palvelun julkisella puolella -

    - )} -
    - )} - {epaaktiivinen ? ( - -

    Ladattavat kuulutukset ja julkaisut

    -

    Kuulutukset löytyvät asianhallinnasta.

    -
    - ) : ( - -

    Ladattavat kuulutukset ja ilmoitukset

    -

    Kuulutus ja ilmoitus ensisijaisella kielellä ({lowerCase(jatkoPaatos1VaiheJulkaisu.kielitiedot?.ensisijainenKieli)})

    - {ensisijaisetPDFt && ( -
    -
    - - {splitFilePath(ensisijaisetPDFt.hyvaksymisKuulutusPDFPath).fileName} - -
    -
    - - {splitFilePath(ensisijaisetPDFt.ilmoitusHyvaksymispaatoskuulutuksestaKunnillePDFPath).fileName} - -
    -
    - - {splitFilePath(ensisijaisetPDFt.ilmoitusHyvaksymispaatoskuulutuksestaToiselleViranomaisellePDFPath).fileName} - -
    -
    - - {splitFilePath(ensisijaisetPDFt.hyvaksymisIlmoitusLausunnonantajillePDFPath).fileName} - -
    -
    - - {splitFilePath(ensisijaisetPDFt.hyvaksymisIlmoitusMuistuttajillePDFPath).fileName} - -
    -
    - )} - - {jatkoPaatos1VaiheJulkaisu.kielitiedot?.toissijainenKieli && ( -
    -

    Kuulutus ja ilmoitus toissijaisella kielellä ({lowerCase(jatkoPaatos1VaiheJulkaisu.kielitiedot?.toissijainenKieli)})

    - {toissijaisetPDFt && ( -
    -
    - - {splitFilePath(toissijaisetPDFt.hyvaksymisKuulutusPDFPath).fileName} - -
    -
    - - {splitFilePath(toissijaisetPDFt.ilmoitusHyvaksymispaatoskuulutuksestaKunnillePDFPath).fileName} - -
    -
    - - {splitFilePath(toissijaisetPDFt.ilmoitusHyvaksymispaatoskuulutuksestaToiselleViranomaisellePDFPath).fileName} - -
    -
    - - {splitFilePath(toissijaisetPDFt.hyvaksymisIlmoitusLausunnonantajillePDFPath).fileName} - -
    -
    - - {splitFilePath(toissijaisetPDFt.hyvaksymisIlmoitusMuistuttajillePDFPath).fileName} - -
    -
    - )} -
    - )} -
    - )} -
    -
    - -
    - - ); -} diff --git a/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/Modaalit.tsx b/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/Modaalit.tsx deleted file mode 100644 index e1745536c..000000000 --- a/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/Modaalit.tsx +++ /dev/null @@ -1,145 +0,0 @@ -import Textarea from "@components/form/Textarea"; -import React from "react"; -import Button from "@components/button/Button"; -import { DialogActions, DialogContent } from "@mui/material"; -import HassuDialog from "@components/HassuDialog"; -import HassuStack from "@components/layout/HassuStack"; -import { useForm } from "react-hook-form"; -import { Projekti } from "@services/api"; -import useTranslation from "next-translate/useTranslation"; -import { kuntametadata } from "common/kuntametadata"; -import useKansalaiskieli from "src/hooks/useKansalaiskieli"; - -type PalautusValues = { - syy: string; -}; - -interface Props { - projekti: Projekti; - open: boolean; - openHyvaksy: boolean; - setOpen: (a: boolean) => void; - setOpenHyvaksy: (a: boolean) => void; - hyvaksyKuulutus: () => void; - palautaMuokattavaksiJaPoistu: (data: PalautusValues) => Promise<() => void>; - palautaMuokattavaksi: (data: PalautusValues) => Promise; -} - -export default function NahtavillaoloPainikkeet({ - projekti, - open, - openHyvaksy, - setOpen, - setOpenHyvaksy, - hyvaksyKuulutus, - palautaMuokattavaksiJaPoistu, - palautaMuokattavaksi, -}: Props) { - const { - register, - handleSubmit, - formState: { errors }, - } = useForm({ defaultValues: { syy: "" } }); - - const { t } = useTranslation("commonFI"); - - const kieli = useKansalaiskieli(); - - return ( - <> -
    - setOpen(false)}> -
    - -

    - Olet palauttamassa kuulutuksen korjattavaksi. Kuulutuksen tekijä saa tiedon palautuksesta ja sen syystä. Saat ilmoituksen, - kun kuulutus on taas valmis hyväksyttäväksi. Jos haluat itse muokata kuulutusta ja hyväksyä tehtyjen muutoksien jälkeen, - valitse Palauta ja muokkaa. -

    - -
    - - - - - -
    -
    -
    -
    - setOpenHyvaksy(false)} - > -
    - -

    - Olet hyväksymässä kuulutuksen ja käynnistämässä siihen liittyvän ilmoituksen automaattisen lähettämisen. Ilmoitus - kuulutuksesta lähetetään seuraaville: -

    -
    -

    Viranomaiset

    -
      - {projekti?.jatkoPaatos1Vaihe?.ilmoituksenVastaanottajat?.viranomaiset?.map((viranomainen) => ( -
    • - {t(`viranomainen.${viranomainen.nimi}`)}, {viranomainen.sahkoposti} -
    • - ))} -
    -

    Kunnat

    -
      - {projekti?.jatkoPaatos1Vaihe?.ilmoituksenVastaanottajat?.kunnat?.map((kunta) => ( -
    • - {kuntametadata.nameForKuntaId(kunta.id, kieli)}, {kunta.sahkoposti} -
    • - ))} -
    -
    -

    - Jos hyväksymisvaiheen kuulutukseen pitää tehdä muutoksia hyväksymisen jälkeen, tulee hyväksymisvaihekuulutus avata uudelleen - ja lähettää päivitetyt ilmoitukset asianosaisille. Kuulutuspäivän jälkeen tulevat muutostarpeet vaativat aloituksen - uudelleen kuuluttamisen. -

    -

    - Klikkaamalla Hyväksy ja lähetä -painiketta vahvistat kuulutuksen tarkastetuksi ja hyväksyt sen julkaisun kuulutuspäivänä - sekä ilmoituksien lähettämisen. Ilmoitukset lähetetään automaattisesti painikkeen klikkaamisen jälkeen. -

    -
    - - - - -
    -
    -
    - - ); -} diff --git a/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/index.tsx b/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/index.tsx deleted file mode 100644 index 147e369ab..000000000 --- a/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/index.tsx +++ /dev/null @@ -1,143 +0,0 @@ -import { yupResolver } from "@hookform/resolvers/yup"; -import { HyvaksymisPaatosVaiheInput, KirjaamoOsoite, TallennaProjektiInput, YhteystietoInput } from "@services/api"; -import Notification, { NotificationType } from "@components/notification/Notification"; -import React, { ReactElement, useEffect, useMemo } from "react"; -import { FormProvider, useForm, UseFormProps } from "react-hook-form"; -import { ProjektiLisatiedolla, useProjekti } from "src/hooks/useProjekti"; -import JatkoPaatos1KuulutusPainikkeet from "./JatkoPaatos1KuulutusPainikkeet"; -import KuulutuksenJaIlmoituksenEsikatselu from "./KuulutuksenJaIlmoituksenEsikatselu"; -import KuulutuksessaEsitettavatYhteystiedot from "./KuulutuksessaEsitettavatYhteystiedot"; -import KuulutusJaJulkaisuPaiva from "./KuulutusJaJulkaisuPaiva"; -import PaatoksenPaiva from "../../hyvaksyminen/kuulutuksenTiedot/PaatoksenPaiva"; -import MuutoksenHaku from "./MuutoksenHaku"; -import IlmoituksenVastaanottajatKomponentti from "./IlmoituksenVastaanottajat"; -import Lukunakyma from "./Lukunakyma"; -import defaultVastaanottajat from "src/util/defaultVastaanottajat"; -import { removeTypeName } from "src/util/removeTypeName"; -import useKirjaamoOsoitteet from "src/hooks/useKirjaamoOsoitteet"; -import PdfPreviewForm from "@components/projekti/PdfPreviewForm"; -import useLeaveConfirm from "src/hooks/useLeaveConfirm"; -import useIsAllowedOnCurrentProjektiRoute from "src/hooks/useIsOnAllowedProjektiRoute"; -import { jatkopaatos1KuulutusSchema } from "src/schemas/jatkopaatos1Kuulutus"; -import Voimassaolovuosi from "./Voimassaolovuosi"; - -export type KuulutuksenTiedotFormValues = Pick & { - jatkoPaatos1Vaihe: Omit & { - hallintoOikeus: HyvaksymisPaatosVaiheInput["hallintoOikeus"] | ""; - }; -}; - -interface Props { - setIsDirty: (value: React.SetStateAction) => void; -} - -export default function KuulutuksenTiedot({ setIsDirty }: Props): ReactElement { - const { data: projekti } = useProjekti({ revalidateOnMount: true }); - const { data: kirjaamoOsoitteet } = useKirjaamoOsoitteet(); - return <>{projekti && kirjaamoOsoitteet && }; -} - -interface KuulutuksenTiedotFormProps { - projekti: ProjektiLisatiedolla; - kirjaamoOsoitteet: KirjaamoOsoite[]; -} - -function JatkoKuulutuksetTiedotForm({ projekti, kirjaamoOsoitteet, setIsDirty }: KuulutuksenTiedotFormProps & Props) { - const pdfFormRef = React.useRef>(null); - - const defaultValues: KuulutuksenTiedotFormValues = useMemo(() => { - const yhteysTiedot: YhteystietoInput[] = - projekti?.jatkoPaatos1Vaihe?.kuulutusYhteystiedot?.yhteysTiedot?.map((yt) => removeTypeName(yt)) || []; - - const yhteysHenkilot: string[] = projekti?.jatkoPaatos1Vaihe?.kuulutusYhteystiedot?.yhteysHenkilot || []; - - const formValues: KuulutuksenTiedotFormValues = { - oid: projekti.oid, - jatkoPaatos1Vaihe: { - kuulutusPaiva: projekti?.jatkoPaatos1Vaihe?.kuulutusPaiva || null, - kuulutusVaihePaattyyPaiva: projekti?.jatkoPaatos1Vaihe?.kuulutusVaihePaattyyPaiva || null, - hallintoOikeus: projekti?.jatkoPaatos1Vaihe?.hallintoOikeus || "", - kuulutusYhteystiedot: { - yhteysTiedot, - yhteysHenkilot, - }, - ilmoituksenVastaanottajat: defaultVastaanottajat( - projekti, - projekti.jatkoPaatos1Vaihe?.ilmoituksenVastaanottajat, - kirjaamoOsoitteet - ), - viimeinenVoimassaolovuosi: projekti?.jatkoPaatos1Vaihe?.viimeinenVoimassaolovuosi || "", - }, - }; - return formValues; - }, [projekti, kirjaamoOsoitteet]); - - const formOptions: UseFormProps = { - resolver: yupResolver(jatkopaatos1KuulutusSchema, { abortEarly: false, recursive: true }), - mode: "onChange", - reValidateMode: "onChange", - defaultValues, - context: projekti, - }; - - const useFormReturn = useForm(formOptions); - const { isAllowedOnRoute } = useIsAllowedOnCurrentProjektiRoute(); - - const { - formState: { isDirty }, - } = useFormReturn; - - useEffect(() => { - setIsDirty(isDirty); - }, [isDirty, setIsDirty]); - - useLeaveConfirm(isDirty); - - const voiMuokata = !projekti?.jatkoPaatos1VaiheJulkaisut || projekti.jatkoPaatos1VaiheJulkaisut.length < 1; - - return ( - <> - {projekti.jatkoPaatos1Vaihe?.palautusSyy && ( - - {"Hyväksymisvaihejulkaisu on palautettu korjattavaksi. Palautuksen syy: " + projekti.jatkoPaatos1Vaihe.palautusSyy} - - )} - - {voiMuokata && ( - <> - -
    -
    - - - - - - - - {pdfFormRef.current?.esikatselePdf && ( - - )} - -
    -
    -
    - - )} - {!voiMuokata && projekti && projekti.jatkoPaatos1VaiheJulkaisut?.[projekti.jatkoPaatos1VaiheJulkaisut.length - 1] && ( - <> - -
    - - - -
    - - )} - - - ); -} diff --git a/src/components/projekti/kansalaisnakyma/HyvaksymispaatosTiedot.tsx b/src/components/projekti/kansalaisnakyma/HyvaksymispaatosTiedot.tsx index 4789d6286..35ec698d5 100644 --- a/src/components/projekti/kansalaisnakyma/HyvaksymispaatosTiedot.tsx +++ b/src/components/projekti/kansalaisnakyma/HyvaksymispaatosTiedot.tsx @@ -14,9 +14,8 @@ import { HyvaksymisPaatosVaiheJulkaisuJulkinen } from "@services/api"; interface Props { kuulutus: HyvaksymisPaatosVaiheJulkaisuJulkinen | null | undefined; - jatkopaatos?: boolean; } -export default function HyvaksymispaatosTiedot({ kuulutus, jatkopaatos }: Props): ReactElement { +export default function HyvaksymispaatosTiedot({ kuulutus }: Props): ReactElement { const { t } = useTranslation(); const { data: projekti } = useProjektiJulkinen(); const velho = kuulutus?.velho; @@ -54,11 +53,6 @@ export default function HyvaksymispaatosTiedot({ kuulutus, jatkopaatos }: Props) return ( <> -
    -

    - {jatkopaatos ? t("Kuulutus hyväksymispäätöksen jatkamisesta") : t("projekti:ui-otsikot.kuulutus_suunnitelman_hyvaksymisesta")} -

    -
    diff --git a/src/components/projekti/kansalaisnakyma/PaatosPageLayout.tsx b/src/components/projekti/kansalaisnakyma/PaatosPageLayout.tsx new file mode 100644 index 000000000..8ea1be834 --- /dev/null +++ b/src/components/projekti/kansalaisnakyma/PaatosPageLayout.tsx @@ -0,0 +1,77 @@ +import React, { FC, useMemo, VFC } from "react"; +import { useProjektiJulkinen } from "src/hooks/useProjektiJulkinen"; +import ProjektiJulkinenPageLayout from "@components/projekti/kansalaisnakyma/ProjektiJulkinenPageLayout"; +import { Tabs } from "@mui/material"; +import { LinkTab, LinkTabProps } from "@components/layout/LinkTab"; +import { useRouter } from "next/router"; +import { UrlObject } from "url"; +import { ProjektiJulkinen } from "@services/api"; +import useTranslation from "next-translate/useTranslation"; + +const PaatosPageLayout: FC<{ pageTitle: string }> = ({ children, pageTitle }) => { + const { data: projekti } = useProjektiJulkinen(); + + if (!projekti) { + return <>; + } + + return ( + + + {children} + + ); +}; + +const PaatosPageTabs: VFC<{ projekti: ProjektiJulkinen }> = ({ projekti }) => { + const router = useRouter(); + const { t } = useTranslation("paatos"); + + const tabProps: LinkTabProps[] = useMemo(() => { + const result: LinkTabProps[] = [ + { + linkProps: { + href: { + pathname: `/suunnitelma/[oid]/hyvaksymispaatos`, + query: { oid: projekti?.oid }, + }, + }, + label: t("tabi-tekstit.hyvaksymispaatos"), + id: "hyvaksymispaatos_tab", + }, + { + linkProps: { + href: { + pathname: `/suunnitelma/[oid]/jatkopaatos1`, + query: { oid: projekti?.oid }, + }, + }, + label: t("tabi-tekstit.jatkopaatos", { nro: 1 }), + id: "jatkopaatos1_tab", + }, + ]; + + return result; + }, [projekti?.oid, t]); + + const value = useMemo(() => { + const indexOfTab = tabProps.findIndex((tProps) => { + const url = tProps.linkProps.href as UrlObject; + return url.pathname === router.pathname; + }); + return indexOfTab === -1 ? false : indexOfTab; + }, [router.pathname, tabProps]); + if (!projekti.jatkoPaatos1Vaihe) { + return <>; + } + + return ( + + {tabProps.map((tProps, index) => ( + + ))} + + ); +}; + +export default PaatosPageLayout; diff --git a/src/components/projekti/kansalaisnakyma/ProjektiJulkinenPageLayout.tsx b/src/components/projekti/kansalaisnakyma/ProjektiJulkinenPageLayout.tsx index 0ba93a225..ed872887e 100644 --- a/src/components/projekti/kansalaisnakyma/ProjektiJulkinenPageLayout.tsx +++ b/src/components/projekti/kansalaisnakyma/ProjektiJulkinenPageLayout.tsx @@ -31,8 +31,8 @@ export default function ProjektiPageLayout({ children, title, selectedStep }: Pr NAHTAVILLAOLO: 2, HYVAKSYMISMENETTELYSSA: 3, HYVAKSYTTY: 4, - JATKOPAATOS_1: 5, - JATKOPAATOS_2: 6, + JATKOPAATOS_1: 4, + JATKOPAATOS_2: 4, EPAAKTIIVINEN_1: -1, EPAAKTIIVINEN_2: -1, EPAAKTIIVINEN_3: -1, @@ -50,12 +50,13 @@ export default function ProjektiPageLayout({ children, title, selectedStep }: Pr
    - {title && (

    {title}

    )} + {title &&

    {title}

    } {children}
    diff --git a/src/components/projekti/kansalaisnakyma/ProjektiJulkinenStepper.tsx b/src/components/projekti/kansalaisnakyma/ProjektiJulkinenStepper.tsx index 0e6110768..8e4e5009e 100644 --- a/src/components/projekti/kansalaisnakyma/ProjektiJulkinenStepper.tsx +++ b/src/components/projekti/kansalaisnakyma/ProjektiJulkinenStepper.tsx @@ -1,4 +1,4 @@ -import React, { ReactElement } from "react"; +import React, { ReactElement, useMemo } from "react"; import { styled } from "@mui/material/styles"; import Stepper from "@mui/material/Stepper"; import Step, { stepClasses, StepProps } from "@mui/material/Step"; @@ -9,12 +9,15 @@ import StepConnector, { stepConnectorClasses } from "@mui/material/StepConnector import { StepIconProps } from "@mui/material/StepIcon"; import { Accordion, AccordionDetails, AccordionSummary, Typography } from "@mui/material"; import HassuLink from "@components/HassuLink"; +import { Status } from "@services/api"; +import { UrlObject } from "url"; interface Props { oid: string; activeStep: number; selectedStep: number; vertical?: true; + projektiStatus: Status | null | undefined; } const HassuStep = styled(Step)({ @@ -102,7 +105,13 @@ function HassuStepIcon(props: StepIconProps) { return ; } -export default function ProjektiJulkinenStepper({ oid, activeStep, selectedStep, vertical }: Props): ReactElement { +const statusToPaatosLinkMap: Partial> = { + HYVAKSYTTY: `/suunnitelma/[oid]/hyvaksymispaatos`, + JATKOPAATOS_1: `/suunnitelma/[oid]/jatkopaatos1`, + JATKOPAATOS_2: `/suunnitelma/[oid]/jatkopaatos2`, +}; + +export default function ProjektiJulkinenStepper({ oid, activeStep, selectedStep, vertical, projektiStatus }: Props): ReactElement { const { t } = useTranslation("projekti"); const steps = [ @@ -113,19 +122,25 @@ export default function ProjektiJulkinenStepper({ oid, activeStep, selectedStep, t(`projekti-vaiheet.paatos`), ]; - const links = [ - `/suunnitelma/${oid}/aloituskuulutus`, - `/suunnitelma/${oid}/suunnittelu`, - `/suunnitelma/${oid}/nahtavillaolo`, - `/suunnitelma/${oid}/hyvaksymismenettelyssa`, - `/suunnitelma/${oid}/hyvaksymispaatos`, - ]; + const paatosLink = (projektiStatus && statusToPaatosLinkMap[projektiStatus]) || statusToPaatosLinkMap[Status.HYVAKSYTTY]; + + const urls: UrlObject[] = useMemo( + () => + [ + `/suunnitelma/[oid]/aloituskuulutus`, + `/suunnitelma/[oid]/suunnittelu`, + `/suunnitelma/[oid]/nahtavillaolo`, + `/suunnitelma/[oid]/hyvaksymismenettelyssa`, + paatosLink, + ].map((pathname) => ({ pathname, query: { oid } })), + [oid, paatosLink] + ); const createStep = (label: string, index: number) => { return ( {index <= activeStep && ( - + -

    Päätös ja sen liitteenä oleva aineisto

    -

    - Päätökset ja aineistot ovat olleet nähtävillä palvelun julkisella puolella {formatDate(jatkoPaatos1VaiheJulkaisu.kuulutusPaiva)}— - {formatDate(jatkoPaatos1VaiheJulkaisu.kuulutusVaihePaattyyPaiva)} välisen ajan. Päätös löytyy asianhallinnasta ja liiteenä olevat - aineistot Projektivelhosta. -

    - - ); -} diff --git a/src/components/projekti/lukutila/HyvakysmisVaiheAineistotLukutila.tsx b/src/components/projekti/lukutila/PaatosAineistotLukutila.tsx similarity index 81% rename from src/components/projekti/lukutila/HyvakysmisVaiheAineistotLukutila.tsx rename to src/components/projekti/lukutila/PaatosAineistotLukutila.tsx index 005992e31..0930fc5dd 100644 --- a/src/components/projekti/lukutila/HyvakysmisVaiheAineistotLukutila.tsx +++ b/src/components/projekti/lukutila/PaatosAineistotLukutila.tsx @@ -5,10 +5,10 @@ import { formatDate } from "src/util/dateUtils"; type Props = { oid: string; - hyvaksymisPaatosVaiheJulkaisu: HyvaksymisPaatosVaiheJulkaisu; + paatosJulkaisu: HyvaksymisPaatosVaiheJulkaisu; }; -export default function HyvaksymisVaiheAineistotLukutila({ oid, hyvaksymisPaatosVaiheJulkaisu }: Props): ReactElement { +export default function PaatosAineistotLukutila({ oid, paatosJulkaisu: hyvaksymisPaatosVaiheJulkaisu }: Props): ReactElement { const velhoURL = process.env.NEXT_PUBLIC_VELHO_BASE_URL + "/projektit/oid-" + oid; return ( <> diff --git a/src/components/projekti/nahtavillaolo/NahtavillaoloPageLayout.tsx b/src/components/projekti/nahtavillaolo/NahtavillaoloPageLayout.tsx new file mode 100644 index 000000000..a257d7b95 --- /dev/null +++ b/src/components/projekti/nahtavillaolo/NahtavillaoloPageLayout.tsx @@ -0,0 +1,172 @@ +import React, { ReactElement, useMemo, ReactNode } from "react"; +import ProjektiPageLayout from "@components/projekti/ProjektiPageLayout"; +import Section from "@components/layout/Section"; +import { Tabs } from "@mui/material"; +import { useRouter } from "next/router"; +import { UrlObject } from "url"; +import { LinkTab, LinkTabProps } from "@components/layout/LinkTab"; +import ProjektiConsumer from "../ProjektiConsumer"; +import { ProjektiLisatiedolla } from "src/hooks/useProjekti"; +import { projektiOnEpaaktiivinen } from "src/util/statusUtil"; +import { NahtavillaoloVaiheTila } from "@services/api"; +import dayjs from "dayjs"; +import Notification, { NotificationType } from "@components/notification/Notification"; +import FormatDate from "@components/FormatDate"; + +const InfoElement = ({ projekti }: { projekti: ProjektiLisatiedolla }) => { + const julkaisut = projekti?.nahtavillaoloVaiheJulkaisut; + + const julkaisu = julkaisut?.[julkaisut.length - 1]; + + if (julkaisu?.tila === NahtavillaoloVaiheTila.HYVAKSYTTY) { + // Toistaiseksi tarkastellaan julkaisupaivatietoa, koska ei ole olemassa erillista tilaa julkaistulle kuulutukselle + const julkaisupvm = dayjs(julkaisu.kuulutusPaiva); + if (dayjs().isBefore(julkaisupvm, "day")) { + return ( + + {`Kuulutusta ei ole vielä julkaistu. Kuulutuspäivä ${julkaisupvm.format("DD.MM.YYYY")}.`} + + ); + } else { + return ( + + Kuulutus on julkaistu {julkaisupvm.format("DD.MM.YYYY")}. Projekti näytetään kuulutuspäivästä lasketun määräajan jälkeen palvelun + julkisella puolella suunnittelussa olevana. Kuulutusvaihe päättyy . + + ); + } + } else if (julkaisu?.tila === NahtavillaoloVaiheTila.ODOTTAA_HYVAKSYNTAA) { + if (projekti?.nykyinenKayttaja.onProjektipaallikko || projekti?.nykyinenKayttaja.onYllapitaja) { + return ( + + { + "Kuulutus odottaa hyväksyntää. Tarkasta kuulutus ja a) hyväksy tai a) palauta kuulutus korjattavaksi, jos havaitset puutteita tai virheen." + } + + ); + } else { + return ( + + Kuulutus on hyväksyttävänä projektipäälliköllä. Jos kuulutusta tarvitsee muokata, ota yhteys projektipäällikköön. + + ); + } + } else if (julkaisu?.tila === NahtavillaoloVaiheTila.PALAUTETTU) { + return ( + <> + {projekti?.nahtavillaoloVaihe?.palautusSyy && ( + + {"Aloituskuulutus on palautettu korjattavaksi. Palautuksen syy: " + projekti.nahtavillaoloVaihe.palautusSyy} + + )} + + ); + } else { + return <>; + } +}; + +export default function NahtavillaoloPageLayoutWrapper({ children }: { children?: ReactNode }) { + return ( + + {(projekti) => ( + + {children} + + )} + + ); +} + +function NahtavillaoloPageLayout({ + projekti, + disableTabs, + children, +}: { + projekti: ProjektiLisatiedolla; + disableTabs?: boolean; + children?: ReactNode; +}): ReactElement { + const router = useRouter(); + + const tabProps: LinkTabProps[] = useMemo(() => { + return [ + { + linkProps: { + href: { + pathname: `/yllapito/projekti/[oid]/nahtavillaolo/aineisto`, + query: { oid: projekti.oid }, + }, + }, + label: "Nähtäville asetettavat aineistot", + disabled: disableTabs, + id: "aineisto_tab", + }, + { + linkProps: { + href: { + pathname: `/yllapito/projekti/[oid]/nahtavillaolo`, + query: { oid: projekti.oid }, + }, + }, + label: "Kuulutuksen tiedot", + disabled: disableTabs, + id: "kuulutuksentiedot_tab", + }, + ]; + }, [projekti.oid, disableTabs]); + + const value = useMemo(() => { + const indexOfTab = tabProps.findIndex((tProps) => { + const url = tProps.linkProps.href as UrlObject; + return url.pathname === router.pathname; + }); + return indexOfTab === -1 ? false : indexOfTab; + }, [router.pathname, tabProps]); + + const nahtavillaolovaiheJulkaisu = projekti.nahtavillaoloVaiheJulkaisut?.[projekti.nahtavillaoloVaiheJulkaisut.length - 1]; + const migroitu = nahtavillaolovaiheJulkaisu?.tila == NahtavillaoloVaiheTila.MIGROITU; + const epaaktiivinen = projektiOnEpaaktiivinen(projekti); + + return ( + +
    + {!migroitu && !epaaktiivinen && ( + <> + + +
    +

    Ohjeet

    +
      +
    • Lisää nähtäville asetettavat aineistot sekä lausuntopyynnön lisäaineistot kuulutuksen ensimmäiseltä välilehdeltä.
    • +
    • Siirry Kuulutuksen tiedot-välilehdelle täyttämään kuulutuksen perustiedot.
    • +
    • + Anna päivämäärä, jolloin suunnittelun nähtäville asettamisesta kuulutetaan. Projekti ja sen nähtävilläolon kuulutus + julkaistaan samana päivänä Valtion liikenneväylien suunnittelu -palvelun kansalaispuolella. +
    • +
    • + Muokkaa tai täydennä halutessasi tiivistetty sisällönkuvaus hankkeesta. Jos projektista tulee tehdä kuulutus suomen + lisäksi toisella kielellä, eikä tälle ole kenttää, tarkista projektin tiedot -sivulta projektin kieliasetus. +
    • +
    • Valitse kuulutuksessa esitettävät yhteystiedot.
    • +
    • Lähetä nähtäville asettamisen kuulutus projektipäällikölle hyväksyttäväksi.
    • +
    • + { + "Projekti näytetään kuulutuspäivästä lasketun määräajan jälkeen palvelun julkisella puolella 'Hyväksyntämenettelyssä' -olevana." + } +
    • +
    +
    +
    + + )} + + {tabProps.map((tProps, index) => ( + + ))} + +
    + {!migroitu ? children :

    Tämä projekti on tuotu toisesta järjestelmästä, joten kaikki toiminnot eivät ole mahdollisia.

    } +
    + ); +} diff --git a/src/components/projekti/nahtavillaolo/kuulutuksentiedot/KuulutuksenTiedot.tsx b/src/components/projekti/nahtavillaolo/kuulutuksentiedot/KuulutuksenTiedot.tsx index ce6994771..ac6075cec 100644 --- a/src/components/projekti/nahtavillaolo/kuulutuksentiedot/KuulutuksenTiedot.tsx +++ b/src/components/projekti/nahtavillaolo/kuulutuksentiedot/KuulutuksenTiedot.tsx @@ -1,7 +1,7 @@ import { yupResolver } from "@hookform/resolvers/yup"; import { Kieli, KirjaamoOsoite, TallennaProjektiInput } from "@services/api"; import Notification, { NotificationType } from "@components/notification/Notification"; -import React, { useEffect, useMemo } from "react"; +import React, { useMemo } from "react"; import { UseFormProps, useForm, FormProvider } from "react-hook-form"; import { ProjektiLisatiedolla, useProjekti } from "src/hooks/useProjekti"; import { nahtavillaoloKuulutusSchema } from "src/schemas/nahtavillaoloKuulutus"; @@ -25,21 +25,11 @@ export type KuulutuksenTiedotFormValues = Required<{ [K in keyof PickedTallennaProjektiInput]: NonNullable; }>; -interface Props { - setIsDirty: (value: React.SetStateAction) => void; -} - -export default function KuulutuksenTiedot({ setIsDirty }: Props) { +export default function KuulutuksenTiedot() { const { data: projekti } = useProjekti({ revalidateOnMount: true }); const { data: kirjaamoOsoitteet } = useKirjaamoOsoitteet(); - return ( - <> - {projekti && kirjaamoOsoitteet && ( - - )} - - ); + return <>{projekti && kirjaamoOsoitteet && }; } interface KuulutuksenTiedotFormProps { @@ -47,7 +37,7 @@ interface KuulutuksenTiedotFormProps { kirjaamoOsoitteet: KirjaamoOsoite[]; } -function KuulutuksenTiedotForm({ projekti, kirjaamoOsoitteet, setIsDirty }: KuulutuksenTiedotFormProps & Props) { +function KuulutuksenTiedotForm({ projekti, kirjaamoOsoitteet }: KuulutuksenTiedotFormProps) { const pdfFormRef = React.useRef>(null); const defaultValues: KuulutuksenTiedotFormValues = useMemo(() => { @@ -114,10 +104,6 @@ function KuulutuksenTiedotForm({ projekti, kirjaamoOsoitteet, setIsDirty }: Kuul formState: { isDirty }, } = useFormReturn; - useEffect(() => { - setIsDirty(isDirty); - }, [isDirty, setIsDirty]); - useLeaveConfirm(isDirty); const voiMuokata = !projekti?.nahtavillaoloVaiheJulkaisut || projekti.nahtavillaoloVaiheJulkaisut.length < 1; diff --git a/src/components/projekti/nahtavillaolo/nahtavilleAsetettavatAineistot/Muokkausnakyma.tsx b/src/components/projekti/nahtavillaolo/nahtavilleAsetettavatAineistot/Muokkausnakyma.tsx index dfd8da3f8..d0cae9aef 100644 --- a/src/components/projekti/nahtavillaolo/nahtavilleAsetettavatAineistot/Muokkausnakyma.tsx +++ b/src/components/projekti/nahtavillaolo/nahtavilleAsetettavatAineistot/Muokkausnakyma.tsx @@ -1,6 +1,6 @@ import { yupResolver } from "@hookform/resolvers/yup"; import { Aineisto, AineistoInput, TallennaProjektiInput } from "@services/api"; -import React, { ReactElement, useEffect, useMemo } from "react"; +import React, { ReactElement, useMemo } from "react"; import { UseFormProps, useForm, FormProvider } from "react-hook-form"; import { useProjekti } from "src/hooks/useProjekti"; import { nahtavillaoloAineistotSchema } from "src/schemas/nahtavillaoloAineistot"; @@ -37,20 +37,16 @@ const getDefaultValueForAineistoNahtavilla = (aineistot: Aineisto[] | undefined }, {}); }; -interface Props { - setIsDirty: (value: React.SetStateAction) => void; -} - -export default function Muokkausnakyma({ setIsDirty }: Props): ReactElement { +export default function Muokkausnakyma(): ReactElement { const { data: projekti } = useProjekti({ revalidateOnMount: true }); - return <>{projekti && }; + return <>{projekti && }; } interface MuokkausnakymaLomakeProps { projekti: ProjektiLisatiedolla; } -function MuokkausnakymaLomake({ projekti, setIsDirty }: MuokkausnakymaLomakeProps & Props) { +function MuokkausnakymaLomake({ projekti }: MuokkausnakymaLomakeProps) { const defaultValues: NahtavilleAsetettavatAineistotFormValues = useMemo(() => { const lisaAineisto: AineistoInput[] = projekti.nahtavillaoloVaihe?.lisaAineisto?.map(({ dokumenttiOid, nimi, jarjestys }) => ({ @@ -78,10 +74,6 @@ function MuokkausnakymaLomake({ projekti, setIsDirty }: MuokkausnakymaLomakeProp formState: { isDirty }, } = useFormReturn; - useEffect(() => { - setIsDirty(isDirty); - }, [isDirty, setIsDirty]); - useLeaveConfirm(isDirty); return ( diff --git a/src/components/projekti/nahtavillaolo/nahtavilleAsetettavatAineistot/NahtavilleAsetettavatAineistot.tsx b/src/components/projekti/nahtavillaolo/nahtavilleAsetettavatAineistot/NahtavilleAsetettavatAineistot.tsx index ab52dbac9..643ee7ba6 100644 --- a/src/components/projekti/nahtavillaolo/nahtavilleAsetettavatAineistot/NahtavilleAsetettavatAineistot.tsx +++ b/src/components/projekti/nahtavillaolo/nahtavilleAsetettavatAineistot/NahtavilleAsetettavatAineistot.tsx @@ -3,13 +3,9 @@ import { useProjekti } from "src/hooks/useProjekti"; import Lukunakyma from "./Lukunakyma"; import Muokkausnakyma from "./Muokkausnakyma"; -interface Props { - setIsDirty: (value: React.SetStateAction) => void; -} - -export default function NahtavilleAsetettavatAineistot({ setIsDirty }: Props) { +export default function NahtavilleAsetettavatAineistot() { const { data: projekti } = useProjekti(); const voiMuokata = !projekti?.nahtavillaoloVaiheJulkaisut?.length; - return voiMuokata ? : ; + return voiMuokata ? : ; } diff --git a/src/components/projekti/paatos/PaatosAineistotPage.tsx b/src/components/projekti/paatos/PaatosAineistotPage.tsx new file mode 100644 index 000000000..16a6b4ab8 --- /dev/null +++ b/src/components/projekti/paatos/PaatosAineistotPage.tsx @@ -0,0 +1,26 @@ +import React, { useMemo, VFC } from "react"; +import { ProjektiLisatiedolla } from "src/hooks/useProjekti"; +import { projektiOnEpaaktiivinen } from "src/util/statusUtil"; +import { getPaatosSpecificData, PaatosTyyppi } from "src/util/getPaatosSpecificData"; +import PaatosAineistotLukutila from "../lukutila/PaatosAineistotLukutila"; +import PaatosAineistot from "@components/projekti/paatos/aineistot/index"; +import PaatosPageLayout from "./PaatosPageLayout"; + +export const PaatoksenAineistotPage: VFC<{ projekti: ProjektiLisatiedolla; paatosTyyppi: PaatosTyyppi }> = ({ projekti, paatosTyyppi }) => { + const { viimeisinJulkaisu, julkaisematonPaatos, julkaisut } = useMemo( + () => getPaatosSpecificData(projekti, paatosTyyppi), + [paatosTyyppi, projekti] + ); + + const epaaktiivinen = projektiOnEpaaktiivinen(projekti); + + return ( + + {epaaktiivinen && viimeisinJulkaisu ? ( + + ) : ( + + )} + + ); +}; diff --git a/src/components/projekti/paatos/PaatosKuulutuksenTiedotPage.tsx b/src/components/projekti/paatos/PaatosKuulutuksenTiedotPage.tsx new file mode 100644 index 000000000..b22a0168b --- /dev/null +++ b/src/components/projekti/paatos/PaatosKuulutuksenTiedotPage.tsx @@ -0,0 +1,25 @@ +import React, { useMemo, VFC } from "react"; +import KuulutuksenTiedot from "@components/projekti/paatos/kuulutuksenTiedot/index"; +import { ProjektiLisatiedolla } from "src/hooks/useProjekti"; +import { projektiOnEpaaktiivinen } from "src/util/statusUtil"; +import Lukunakyma from "@components/projekti/paatos/kuulutuksenTiedot/Lukunakyma"; +import { getPaatosSpecificData, PaatosTyyppi } from "src/util/getPaatosSpecificData"; +import PaatosPageLayout from "./PaatosPageLayout"; + +export const PaatoksenKuulutuksenTiedotPage: VFC<{ projekti: ProjektiLisatiedolla; paatosTyyppi: PaatosTyyppi }> = ({ + projekti, + paatosTyyppi, +}) => { + const { viimeisinJulkaisu } = useMemo(() => getPaatosSpecificData(projekti, paatosTyyppi), [paatosTyyppi, projekti]); + + const epaaktiivinen = projektiOnEpaaktiivinen(projekti); + return ( + + {epaaktiivinen && viimeisinJulkaisu ? ( + + ) : ( + + )} + + ); +}; diff --git a/src/components/projekti/paatos/PaatosPageLayout.tsx b/src/components/projekti/paatos/PaatosPageLayout.tsx new file mode 100644 index 000000000..eeec2a0e5 --- /dev/null +++ b/src/components/projekti/paatos/PaatosPageLayout.tsx @@ -0,0 +1,162 @@ +import React, { ReactElement, useMemo, ReactNode } from "react"; +import ProjektiPageLayout from "@components/projekti/ProjektiPageLayout"; +import Section from "@components/layout/Section"; +import { Link, Tabs } from "@mui/material"; +import { useRouter } from "next/router"; +import { UrlObject } from "url"; +import { LinkTab, LinkTabProps } from "@components/layout/LinkTab"; +import { HyvaksymisPaatosVaiheTila } from "@services/api"; +import Notification, { NotificationType } from "@components/notification/Notification"; +import { examineKuulutusPaiva } from "src/util/aloitusKuulutusUtil"; +import FormatDate from "@components/FormatDate"; +import { ProjektiLisatiedolla } from "src/hooks/useProjekti"; +import ProjektiConsumer from "@components/projekti/ProjektiConsumer"; +import { projektiOnEpaaktiivinen } from "src/util/statusUtil"; +import { PaatosTyyppi, getPaatosSpecificData } from "src/util/getPaatosSpecificData"; + +interface PaatosTyyppiSpecificData { + paatosRoutePart: string; + pageTitle: string; +} + +const paatosTyyppiSpecificContentMap: Record = { + HYVAKSYMISPAATOS: { paatosRoutePart: "hyvaksymispaatos", pageTitle: "Kuulutus hyväksymispäätöksestä" }, + JATKOPAATOS1: { paatosRoutePart: "jatkaminen1", pageTitle: "Kuulutus hyväksymispäätöksen jatkamisesta" }, + JATKOPAATOS2: { paatosRoutePart: "jatkaminen2", pageTitle: "Kuulutus hyväksymispäätöksen jatkamisesta" }, +}; + +export default function PaatosPageLayout({ children, paatosTyyppi }: { children?: ReactNode; paatosTyyppi: PaatosTyyppi }) { + return ( + + {(projekti) => ( + + {children} + + )} + + ); +} + +function PaatosPageLayoutContent({ + projekti, + disableTabs, + paatosTyyppi, + children, +}: { + projekti: ProjektiLisatiedolla; + disableTabs?: boolean; + children?: ReactNode; + paatosTyyppi: PaatosTyyppi; +}): ReactElement { + const router = useRouter(); + + const { julkaisut, viimeisinJulkaisu } = useMemo(() => getPaatosSpecificData(projekti, paatosTyyppi), [paatosTyyppi, projekti]); + + const migroitu = viimeisinJulkaisu?.tila == HyvaksymisPaatosVaiheTila.MIGROITU; + const epaaktiivinen = projektiOnEpaaktiivinen(projekti); + + const { paatosRoutePart, pageTitle } = useMemo(() => paatosTyyppiSpecificContentMap[paatosTyyppi], [paatosTyyppi]); + + const kertaalleenLahetettyHyvaksyttavaksi = !!julkaisut?.length; + + let { kuulutusPaiva, published } = examineKuulutusPaiva(viimeisinJulkaisu?.kuulutusPaiva); + + const tabProps: LinkTabProps[] = useMemo(() => { + const paatosRoute = paatosRoutePart; + const result: LinkTabProps[] = [ + { + linkProps: { + href: { + pathname: `/yllapito/projekti/[oid]/${paatosRoute}/aineisto`, + query: { oid: projekti.oid }, + }, + }, + label: "Päätös ja liitteenä oleva aineisto", + disabled: disableTabs, + id: "aineisto_tab", + }, + { + linkProps: { + href: { + pathname: `/yllapito/projekti/[oid]/${paatosRoute}`, + query: { oid: projekti.oid }, + }, + }, + label: "Kuulutuksen tiedot", + disabled: disableTabs, + id: "kuulutuksentiedot_tab", + }, + ]; + if (kertaalleenLahetettyHyvaksyttavaksi) { + result.reverse(); + } + + return result; + }, [paatosRoutePart, projekti.oid, disableTabs, kertaalleenLahetettyHyvaksyttavaksi]); + + const value = useMemo(() => { + const indexOfTab = tabProps.findIndex((tProps) => { + const url = tProps.linkProps.href as UrlObject; + return url.pathname === router.pathname; + }); + return indexOfTab === -1 ? false : indexOfTab; + }, [router.pathname, tabProps]); + + return ( + +
    + {!migroitu && !epaaktiivinen && !kertaalleenLahetettyHyvaksyttavaksi && ( + +
    +

    Ohjeet

    +
      +
    • Aloita lisäämällä päätös ja sen liitteenä olevat aineistot kuulutuksen ensimmäiseltä välilehdeltä.
    • +
    • Jatka täyttämään kuulutuksen perustiedot valitsemalla "Tallenna luonnos".
    • +
    • + Anna päivämäärä, jolloin suunnitelman hyväksymispäätöksestä kuulutetaan. Kuulutus julkaistaan samana päivänä Valtion + liikenneväylien suunnittelu -palvelun kansalaispuolella. +
    • +
    • + Pääkäyttäjä lisää projektille Liikenne- ja viestintäviraston päätöksen ja asianumeron{" "} + + Käsittelyn tila + {" "} + -sivulla. +
    • +
    • Valitse hallinto-oikeus, jolta muutoksenhakua voidaan hakea.
    • +
    • Valitse ja lisää kuulutuksessa esitettävät yhteystiedot ja ilmoituksen vastaanottajat.
    • +
    • Esikatsele ja lähetä hyväksymispäätöksen kuulutus hyväksyttäväksi projektipäällikölle.
    • +
    +
    +
    + )} + {!epaaktiivinen && ( +
    + {!published && viimeisinJulkaisu?.tila === HyvaksymisPaatosVaiheTila.HYVAKSYTTY && ( + Kuulutusta ei ole vielä julkaistu. Kuulutuspäivä {kuulutusPaiva}. + )} + {published && viimeisinJulkaisu?.tila === HyvaksymisPaatosVaiheTila.HYVAKSYTTY && ( + + Kuulutus nähtäville asettamisesta on julkaistu {kuulutusPaiva}. Projekti näytetään kuulutuspäivästä lasketun määräajan + jälkeen palvelun julkisella puolella suunnittelussa olevana. Kuulutusvaihe päättyy{" "} + . + + )} + {viimeisinJulkaisu && viimeisinJulkaisu?.tila === HyvaksymisPaatosVaiheTila.ODOTTAA_HYVAKSYNTAA && ( + + Kuulutus nähtäville asettamisesta odottaa hyväksyntää. Tarkasta kuulutus ja a) hyväksy tai b) palauta kuulutus + korjattavaksi, jos havaitset puutteita tai virheen. + + )} +
    + )} + + {tabProps.map((tProps, index) => ( + + ))} + +
    + {!migroitu ? children :

    Tämä projekti on tuotu toisesta järjestelmästä, joten kaikki toiminnot eivät ole mahdollisia.

    } +
    + ); +} diff --git a/src/components/projekti/hyvaksyminen/aineistot/HyvaksymisPaatosTiedostot.tsx b/src/components/projekti/paatos/aineistot/HyvaksymisPaatosTiedostot.tsx similarity index 100% rename from src/components/projekti/hyvaksyminen/aineistot/HyvaksymisPaatosTiedostot.tsx rename to src/components/projekti/paatos/aineistot/HyvaksymisPaatosTiedostot.tsx diff --git a/src/components/projekti/hyvaksyminen/aineistot/HyvaksymisPaatosVaihePainikkeet.tsx b/src/components/projekti/paatos/aineistot/HyvaksymisPaatosVaihePainikkeet.tsx similarity index 76% rename from src/components/projekti/hyvaksyminen/aineistot/HyvaksymisPaatosVaihePainikkeet.tsx rename to src/components/projekti/paatos/aineistot/HyvaksymisPaatosVaihePainikkeet.tsx index 20d2d06fc..5a35c4c4d 100644 --- a/src/components/projekti/hyvaksyminen/aineistot/HyvaksymisPaatosVaihePainikkeet.tsx +++ b/src/components/projekti/paatos/aineistot/HyvaksymisPaatosVaihePainikkeet.tsx @@ -9,21 +9,22 @@ import { useFormContext } from "react-hook-form"; import { useProjekti } from "src/hooks/useProjekti"; import useSnackbars from "src/hooks/useSnackbars"; import deleteFieldArrayIds from "src/util/deleteFieldArrayIds"; +import { paatosSpecificRoutesMap, PaatosTyyppi } from "src/util/getPaatosSpecificData"; import { HyvaksymisPaatosVaiheAineistotFormValues } from "./Muokkausnakyma"; -const mapFormValuesToTallennaProjektiInput = ({ - oid, - hyvaksymisPaatos, - aineistoNahtavilla, -}: HyvaksymisPaatosVaiheAineistotFormValues): TallennaProjektiInput => { +const mapFormValuesToTallennaProjektiInput = ( + { oid, hyvaksymisPaatos, aineistoNahtavilla }: HyvaksymisPaatosVaiheAineistotFormValues, + paatosTyyppi: PaatosTyyppi +): TallennaProjektiInput => { const aineistoNahtavillaFlat = Object.values(aineistoNahtavilla).flat(); deleteFieldArrayIds(aineistoNahtavillaFlat); deleteFieldArrayIds(hyvaksymisPaatos); + const { paatosVaiheAvain } = paatosSpecificRoutesMap[paatosTyyppi]; - return { oid, hyvaksymisPaatosVaihe: { aineistoNahtavilla: aineistoNahtavillaFlat, hyvaksymisPaatos } }; + return { oid, [paatosVaiheAvain]: { aineistoNahtavilla: aineistoNahtavillaFlat, hyvaksymisPaatos } }; }; -export default function NahtavillaoloPainikkeet() { +export default function PaatosPainikkeet({ paatosTyyppi }: { paatosTyyppi: PaatosTyyppi }) { const { mutate: reloadProjekti } = useProjekti(); const [isFormSubmitting, setIsFormSubmitting] = useState(false); const { showSuccessMessage, showErrorMessage } = useSnackbars(); @@ -38,7 +39,7 @@ export default function NahtavillaoloPainikkeet() { const saveDraft = async (formData: HyvaksymisPaatosVaiheAineistotFormValues) => { setIsFormSubmitting(true); try { - await saveSuunnitteluvaihe(mapFormValuesToTallennaProjektiInput(formData)); + await saveSuunnitteluvaihe(mapFormValuesToTallennaProjektiInput(formData, paatosTyyppi)); reloadProjekti(); reset(formData); showSuccessMessage("Tallennus onnistui!"); @@ -53,7 +54,9 @@ export default function NahtavillaoloPainikkeet() { <>
    - + diff --git a/src/components/projekti/hyvaksyminen/aineistot/Hyvaksymispaatos.tsx b/src/components/projekti/paatos/aineistot/Hyvaksymispaatos.tsx similarity index 100% rename from src/components/projekti/hyvaksyminen/aineistot/Hyvaksymispaatos.tsx rename to src/components/projekti/paatos/aineistot/Hyvaksymispaatos.tsx diff --git a/src/components/projekti/jatkopaatos1/aineistot/Lukunakyma.tsx b/src/components/projekti/paatos/aineistot/Lukunakyma.tsx similarity index 79% rename from src/components/projekti/jatkopaatos1/aineistot/Lukunakyma.tsx rename to src/components/projekti/paatos/aineistot/Lukunakyma.tsx index 73d273826..d3da2e7f9 100644 --- a/src/components/projekti/jatkopaatos1/aineistot/Lukunakyma.tsx +++ b/src/components/projekti/paatos/aineistot/Lukunakyma.tsx @@ -6,18 +6,25 @@ import { HyvaksymisPaatosVaiheJulkaisu, HyvaksymisPaatosVaiheTila } from "@servi import { AineistoKategoria, aineistoKategoriat, getNestedAineistoMaaraForCategory } from "common/aineistoKategoriat"; import useTranslation from "next-translate/useTranslation"; import React, { FC, useMemo } from "react"; -import { useProjekti } from "src/hooks/useProjekti"; +import { ProjektiLisatiedolla } from "src/hooks/useProjekti"; import { formatDate, formatDateTime } from "src/util/dateUtils"; +import { getPaatosSpecificData, PaatosTyyppi } from "src/util/getPaatosSpecificData"; import { examineJulkaisuPaiva } from "../../../../util/dateUtils"; -export default function Lukunakyma() { - const { data: projekti } = useProjekti(); +interface Props { + projekti: ProjektiLisatiedolla; + paatosTyyppi: PaatosTyyppi; +} - const julkaisu = useMemo(() => projekti?.jatkoPaatos1VaiheJulkaisut?.[projekti.jatkoPaatos1VaiheJulkaisut.length - 1], [projekti]); +export default function Lukunakyma({ projekti, paatosTyyppi }: Props) { + const { viimeisinJulkaisu } = useMemo(() => getPaatosSpecificData(projekti, paatosTyyppi), [paatosTyyppi, projekti]); - const { published } = examineJulkaisuPaiva(julkaisu?.tila === HyvaksymisPaatosVaiheTila.HYVAKSYTTY, julkaisu?.kuulutusPaiva); + const { published } = examineJulkaisuPaiva( + viimeisinJulkaisu?.tila === HyvaksymisPaatosVaiheTila.HYVAKSYTTY, + viimeisinJulkaisu?.kuulutusPaiva + ); - if (!projekti || !julkaisu) { + if (!projekti || !viimeisinJulkaisu) { return null; } @@ -28,14 +35,14 @@ export default function Lukunakyma() { {published && (

    Aineistot ovat nähtävillä palvelun julkisella puolella - {" " + formatDate(julkaisu.kuulutusVaihePaattyyPaiva) + " "} + {" " + formatDate(viimeisinJulkaisu.kuulutusVaihePaattyyPaiva) + " "} saakka.

    )}

    Päätös

    - {julkaisu && julkaisu.hyvaksymisPaatos && ( + {viimeisinJulkaisu && viimeisinJulkaisu.hyvaksymisPaatos && ( - {julkaisu.hyvaksymisPaatos.map((aineisto) => ( + {viimeisinJulkaisu.hyvaksymisPaatos.map((aineisto) => ( {aineisto.tuotu && formatDateTime(aineisto.tuotu)} @@ -46,7 +53,7 @@ export default function Lukunakyma() {

    Päätöksen liitteenä oleva aineisto

    diff --git a/src/components/projekti/paatos/aineistot/Muokkausnakyma.tsx b/src/components/projekti/paatos/aineistot/Muokkausnakyma.tsx new file mode 100644 index 000000000..395512e23 --- /dev/null +++ b/src/components/projekti/paatos/aineistot/Muokkausnakyma.tsx @@ -0,0 +1,133 @@ +import { yupResolver } from "@hookform/resolvers/yup"; +import { Aineisto, AineistoInput, TallennaProjektiInput } from "@services/api"; +import React, { ReactElement, useMemo } from "react"; +import { UseFormProps, useForm, FormProvider } from "react-hook-form"; +import { useProjekti } from "src/hooks/useProjekti"; +import { nahtavillaoloAineistotSchema } from "src/schemas/nahtavillaoloAineistot"; +import HyvaksymisPaatosVaihePainikkeet from "./HyvaksymisPaatosVaihePainikkeet"; +import SuunnitelmatJaAineistot, { SuunnitelmatJaAineistotProps } from "../../common/SuunnitelmatJaAineistot"; +import { ProjektiLisatiedolla } from "src/hooks/useProjekti"; +import { aineistoKategoriat } from "common/aineistoKategoriat"; +import useLeaveConfirm from "src/hooks/useLeaveConfirm"; +import useIsAllowedOnCurrentProjektiRoute from "src/hooks/useIsOnAllowedProjektiRoute"; +import { PaatosSpecificData, PaatosTyyppi } from "src/util/getPaatosSpecificData"; + +interface AineistoNahtavilla { + [kategoriaId: string]: AineistoInput[]; +} + +type FormData = { + aineistoNahtavilla: AineistoNahtavilla; + hyvaksymisPaatos: AineistoInput[]; +}; + +export type HyvaksymisPaatosVaiheAineistotFormValues = Pick & FormData; + +const getDefaultValueForAineistoNahtavilla = (aineistot: Aineisto[] | undefined | null) => { + return aineistoKategoriat.listKategoriaIds().reduce((aineistoNahtavilla, currentKategoriaId) => { + aineistoNahtavilla[currentKategoriaId] = + aineistot + ?.filter((aineisto) => aineisto.kategoriaId === currentKategoriaId) + .map((aineisto) => ({ + dokumenttiOid: aineisto.dokumenttiOid, + nimi: aineisto.nimi, + jarjestys: aineisto.jarjestys, + kategoriaId: aineisto.kategoriaId, + })) || []; + return aineistoNahtavilla; + }, {}); +}; + +export default function Muokkausnakyma({ + julkaisematonPaatos, + paatosTyyppi, +}: Pick & { paatosTyyppi: PaatosTyyppi }): ReactElement { + const { data: projekti } = useProjekti(); + + return ( + <>{projekti && } + ); +} + +interface MuokkausnakymaFormProps { + projekti: ProjektiLisatiedolla; + paatosTyyppi: PaatosTyyppi; +} + +const hyvaksymisPaatosSuunnitelmatJaAineistotProps: SuunnitelmatJaAineistotProps = { + sectionTitle: "Päätös ja päätöksen liitteenä oleva aineisto", + sectionInfoText: + "Liitä Liikenne- ja viestintäviraston päätös. Liitettävä päätös haetaan Projektivelhosta. Päätös ja sen liitteenä oleva aineisto julkaistaan palvelun julkisella puolella kuulutuksen julkaisupäivänä.", + dialogInfoText: "Valitse tiedostot, jotka haluat tuoda päätöksen liitteeksi.", + sectionSubtitle: "Päätöksen liitteenä oleva aineisto", + paatos: { + paatosInfoText: + "Liitä Liikenne- ja viestintäviraston päätös. Päätöksen päivämäärä sekä asianumero löytyvät Kuulutuksen tiedot -välilehdellä jos ne on lisätty Käsittelyn tila -sivulle.", + paatosSubtitle: "Päätös *", + }, +}; + +const jatkopaatosPaatosSuunnitelmatProps: SuunnitelmatJaAineistotProps = { + ...hyvaksymisPaatosSuunnitelmatJaAineistotProps, + sectionInfoText: + "Liitä kuulutukselle Liikenne- ja viestintäviraston päätös sekä jatkopäätös. Liitettävät päätökset sekä päätösten liitteenä olevat aineistot haetaan Projektivelhosta. Päätökset ja sen liitteenä oleva aineisto julkaistaan palvelun julkisella puolella kuulutuksen julkaisupäivänä.", + paatos: { + paatosSubtitle: "Päätös ja jatkopäätös *", + paatosInfoText: + "Liitä Liikenne- ja viestintäviraston päätökset suunnitelman hyväksymisestä sekä päätös suunnitelman voimassaoloajan pidentämisestä. Jatkopäätöksen päivämäärä sekä asiatunnus löytyvät automaattisesti Kuulutuksen tiedot -välilehdeltä.", + }, +}; + +const paatosTyyppiToSuunnitelmatJaAineistotPropsMap: Record = { + HYVAKSYMISPAATOS: hyvaksymisPaatosSuunnitelmatJaAineistotProps, + JATKOPAATOS1: jatkopaatosPaatosSuunnitelmatProps, + JATKOPAATOS2: jatkopaatosPaatosSuunnitelmatProps, // Maybe the texts are the same as in jatkopaatos1 +}; + +function MuokkausnakymaForm({ + projekti, + julkaisematonPaatos, + paatosTyyppi, +}: MuokkausnakymaFormProps & Pick) { + const defaultValues: HyvaksymisPaatosVaiheAineistotFormValues = useMemo(() => { + const hyvaksymisPaatos: AineistoInput[] = + julkaisematonPaatos?.hyvaksymisPaatos?.map(({ dokumenttiOid, nimi, jarjestys }) => ({ + dokumenttiOid, + jarjestys, + nimi, + })) || []; + + return { + oid: projekti.oid, + aineistoNahtavilla: getDefaultValueForAineistoNahtavilla(julkaisematonPaatos?.aineistoNahtavilla), + hyvaksymisPaatos, + }; + }, [julkaisematonPaatos, projekti.oid]); + + const formOptions: UseFormProps = { + resolver: yupResolver(nahtavillaoloAineistotSchema, { abortEarly: false, recursive: true }), + mode: "onChange", + reValidateMode: "onChange", + defaultValues, + }; + + const useFormReturn = useForm(formOptions); + const { + formState: { isDirty }, + } = useFormReturn; + + const { isAllowedOnRoute } = useIsAllowedOnCurrentProjektiRoute(); + + useLeaveConfirm(isDirty); + + return ( + +
    +
    + + +
    +
    +
    + ); +} diff --git a/src/components/projekti/paatos/aineistot/index.tsx b/src/components/projekti/paatos/aineistot/index.tsx new file mode 100644 index 000000000..6adfa15b1 --- /dev/null +++ b/src/components/projekti/paatos/aineistot/index.tsx @@ -0,0 +1,19 @@ +import React from "react"; +import { ProjektiLisatiedolla } from "src/hooks/useProjekti"; +import { PaatosSpecificData, PaatosTyyppi } from "src/util/getPaatosSpecificData"; +import Lukunakyma from "./Lukunakyma"; +import Muokkausnakyma from "./Muokkausnakyma"; + +export default function Aineistot({ + paatosTyyppi, + julkaisematonPaatos, + julkaisut, + projekti, +}: { paatosTyyppi: PaatosTyyppi; projekti: ProjektiLisatiedolla } & Pick) { + const voiMuokata = !julkaisut?.length; + return voiMuokata ? ( + + ) : ( + + ); +} diff --git a/src/components/projekti/hyvaksyminen/kuulutuksenTiedot/IlmoituksenVastaanottajat.tsx b/src/components/projekti/paatos/kuulutuksenTiedot/IlmoituksenVastaanottajat.tsx similarity index 70% rename from src/components/projekti/hyvaksyminen/kuulutuksenTiedot/IlmoituksenVastaanottajat.tsx rename to src/components/projekti/paatos/kuulutuksenTiedot/IlmoituksenVastaanottajat.tsx index eca62d71c..387245881 100644 --- a/src/components/projekti/hyvaksyminen/kuulutuksenTiedot/IlmoituksenVastaanottajat.tsx +++ b/src/components/projekti/paatos/kuulutuksenTiedot/IlmoituksenVastaanottajat.tsx @@ -6,13 +6,14 @@ import { Controller, FieldError, useFieldArray, useFormContext } from "react-hoo import { formatProperNoun } from "common/util/formatProperNoun"; import useTranslation from "next-translate/useTranslation"; import IconButton from "@components/button/IconButton"; -import { KuntaVastaanottajaInput, HyvaksymisPaatosVaihe, ViranomaisVastaanottajaInput } from "@services/api"; +import { HyvaksymisPaatosVaihe, KuntaVastaanottajaInput } from "@services/api"; import Section from "@components/layout/Section"; import SectionContent from "@components/layout/SectionContent"; import HassuGrid from "@components/HassuGrid"; import dayjs from "dayjs"; import useKirjaamoOsoitteet from "src/hooks/useKirjaamoOsoitteet"; import { kuntametadata } from "../../../../../common/kuntametadata"; +import { KuulutuksenTiedotFormValues } from "src/components/projekti/paatos/kuulutuksenTiedot/index"; interface HelperType { kunnat?: FieldError | { nimi?: FieldError | undefined; sahkoposti?: FieldError | undefined }[] | undefined; @@ -20,19 +21,10 @@ interface HelperType { } interface Props { - hyvaksymisPaatosVaihe: HyvaksymisPaatosVaihe | null | undefined; + paatosVaihe: HyvaksymisPaatosVaihe | null | undefined; } -type FormFields = { - hyvaksymisPaatosVaihe: { - ilmoituksenVastaanottajat: { - kunnat: Array; - viranomaiset: Array; - }; - }; -}; - -export default function IlmoituksenVastaanottajat({ hyvaksymisPaatosVaihe }: Props): ReactElement { +export default function IlmoituksenVastaanottajat({ paatosVaihe }: Props): ReactElement { const { t, lang } = useTranslation("commonFI"); const { data: kirjaamoOsoitteet } = useKirjaamoOsoitteet(); @@ -44,13 +36,13 @@ export default function IlmoituksenVastaanottajat({ hyvaksymisPaatosVaihe }: Pro formState: { errors }, setValue, watch, - } = useFormContext(); + } = useFormContext(); - const ilmoituksenVastaanottajat = watch("hyvaksymisPaatosVaihe.ilmoituksenVastaanottajat"); + const ilmoituksenVastaanottajat = watch("paatos.ilmoituksenVastaanottajat"); const { fields: kuntaFields } = useFieldArray({ control, - name: "hyvaksymisPaatosVaihe.ilmoituksenVastaanottajat.kunnat", + name: "paatos.ilmoituksenVastaanottajat.kunnat", }); const { @@ -59,11 +51,11 @@ export default function IlmoituksenVastaanottajat({ hyvaksymisPaatosVaihe }: Pro remove, } = useFieldArray({ control, - name: "hyvaksymisPaatosVaihe.ilmoituksenVastaanottajat.viranomaiset", + name: "paatos.ilmoituksenVastaanottajat.viranomaiset", }); const getKuntanimi = (index: number) => { - const nimi = kuntametadata.nameForKuntaId(ilmoituksenVastaanottajat?.kunnat?.[index].id, lang); + const nimi = kuntametadata.nameForKuntaId((ilmoituksenVastaanottajat?.kunnat as KuntaVastaanottajaInput[])?.[index].id, lang); if (!nimi) { return; } @@ -82,8 +74,8 @@ export default function IlmoituksenVastaanottajat({ hyvaksymisPaatosVaihe }: Pro

    Ilmoituksen vastaanottajat

    - Ilmoitukset on lähetetty eteenpäin alla oleville viranomaisille ja kunnille. Jos ilmoituksen tila on ‘Ei - lähetetty’, tarkasta sähköpostiosoite. Ota tarvittaessa yhteys pääkäyttäjään. + Ilmoitukset on lähetetty eteenpäin alla oleville viranomaisille ja kunnille. Jos ilmoituksen tila on ‘Ei lähetetty’, tarkasta + sähköpostiosoite. Ota tarvittaessa yhteys pääkäyttäjään.

    @@ -93,7 +85,7 @@ export default function IlmoituksenVastaanottajat({ hyvaksymisPaatosVaihe }: Pro

    Ilmoituksen tila

    Lähetysaika

    - {hyvaksymisPaatosVaihe?.ilmoituksenVastaanottajat?.viranomaiset?.map((viranomainen, index) => ( + {paatosVaihe?.ilmoituksenVastaanottajat?.viranomaiset?.map((viranomainen, index) => (

    {t(`viranomainen.${viranomainen.nimi}`)}, {viranomainen.sahkoposti} @@ -113,14 +105,12 @@ export default function IlmoituksenVastaanottajat({ hyvaksymisPaatosVaihe }: Pro

    Sähköpostiosoite

    Ilmoituksen tila

    Lähetysaika

    - {hyvaksymisPaatosVaihe?.ilmoituksenVastaanottajat?.kunnat?.map((kunta, index) => ( + {paatosVaihe?.ilmoituksenVastaanottajat?.kunnat?.map((kunta, index) => (

    {kuntametadata.nameForKuntaId(kunta.id, lang)}

    {kunta.sahkoposti}

    {kunta.lahetetty ? "Lahetetty" : "Ei lähetetty"}

    -

    - {kunta.lahetetty ? dayjs(kunta.lahetetty).format("DD.MM.YYYY HH:mm") : null} -

    +

    {kunta.lahetetty ? dayjs(kunta.lahetetty).format("DD.MM.YYYY HH:mm") : null}

    ))} @@ -132,9 +122,9 @@ export default function IlmoituksenVastaanottajat({ hyvaksymisPaatosVaihe }: Pro

    Ilmoituksen vastaanottajat

    - Vuorovaikuttamisesta lähetetään sähköpostitse tiedote viranomaiselle sekä projektia koskeville kunnille. - Kunnat on haettu Projektivelhosta. Jos tiedote pitää lähettää useammalle kuin yhdelle - viranomaisorganisaatiolle, lisää uusi rivi Lisää uusi -painikkeella + Vuorovaikuttamisesta lähetetään sähköpostitse tiedote viranomaiselle sekä projektia koskeville kunnille. Kunnat on haettu + Projektivelhosta. Jos tiedote pitää lähettää useammalle kuin yhdelle viranomaisorganisaatiolle, lisää uusi rivi Lisää uusi + -painikkeella

    Jos kuntatiedoissa on virhe, tee korjaus Projektivelhoon.

    @@ -142,10 +132,8 @@ export default function IlmoituksenVastaanottajat({ hyvaksymisPaatosVaihe }: Pro <>
    Viranomaiset
    - {(errors.hyvaksymisPaatosVaihe?.ilmoituksenVastaanottajat as HelperType)?.viranomaiset && ( -

    - {(errors.hyvaksymisPaatosVaihe?.ilmoituksenVastaanottajat as HelperType).viranomaiset?.message} -

    + {(errors.paatos?.ilmoituksenVastaanottajat as HelperType)?.viranomaiset && ( +

    {(errors.paatos?.ilmoituksenVastaanottajat as HelperType).viranomaiset?.message}

    )} {viranomaisFields.map((viranomainen, index) => ( @@ -155,23 +143,18 @@ export default function IlmoituksenVastaanottajat({ hyvaksymisPaatosVaihe }: Pro label: nimi ? t(`viranomainen.${nimi}`) : "", value: nimi, }))} - {...register(`hyvaksymisPaatosVaihe.ilmoituksenVastaanottajat.viranomaiset.${index}.nimi`, { + {...register(`paatos.ilmoituksenVastaanottajat.viranomaiset.${index}.nimi`, { onChange: (event) => { - const sahkoposti = kirjaamoOsoitteet?.find( - ({ nimi }) => nimi === event.target.value - )?.sahkoposti; - setValue( - `hyvaksymisPaatosVaihe.ilmoituksenVastaanottajat.viranomaiset.${index}.sahkoposti`, - sahkoposti || "" - ); + const sahkoposti = kirjaamoOsoitteet?.find(({ nimi }) => nimi === event.target.value)?.sahkoposti; + setValue(`paatos.ilmoituksenVastaanottajat.viranomaiset.${index}.sahkoposti`, sahkoposti || ""); }, })} - error={errors?.hyvaksymisPaatosVaihe?.ilmoituksenVastaanottajat?.viranomaiset?.[index]?.nimi} + error={(errors?.paatos?.ilmoituksenVastaanottajat as any)?.viranomaiset?.[index]?.nimi} addEmptyOption /> ( <> @@ -221,16 +204,12 @@ export default function IlmoituksenVastaanottajat({ hyvaksymisPaatosVaihe }: Pro {kuntaFields.map((kunta, index) => ( - + ))} diff --git a/src/components/projekti/hyvaksyminen/kuulutuksenTiedot/KuulutuksenJaIlmoituksenEsikatselu.tsx b/src/components/projekti/paatos/kuulutuksenTiedot/KuulutuksenJaIlmoituksenEsikatselu.tsx similarity index 77% rename from src/components/projekti/hyvaksyminen/kuulutuksenTiedot/KuulutuksenJaIlmoituksenEsikatselu.tsx rename to src/components/projekti/paatos/kuulutuksenTiedot/KuulutuksenJaIlmoituksenEsikatselu.tsx index 41ab723e3..1a60ac856 100644 --- a/src/components/projekti/hyvaksyminen/kuulutuksenTiedot/KuulutuksenJaIlmoituksenEsikatselu.tsx +++ b/src/components/projekti/paatos/kuulutuksenTiedot/KuulutuksenJaIlmoituksenEsikatselu.tsx @@ -1,6 +1,6 @@ import React from "react"; import Section from "@components/layout/Section"; -import { Kieli, AsiakirjaTyyppi } from "@services/api"; +import { Kieli, AsiakirjaTyyppi, TallennaProjektiInput } from "@services/api"; import Notification, { NotificationType } from "@components/notification/Notification"; import lowerCase from "lodash/lowerCase"; import Button from "@components/button/Button"; @@ -8,12 +8,23 @@ import { Box } from "@mui/material"; import { useProjekti } from "src/hooks/useProjekti"; import { KuulutuksenTiedotFormValues } from "./index"; import { useFormContext } from "react-hook-form"; +import { paatosSpecificRoutesMap, PaatosTyyppi } from "src/util/getPaatosSpecificData"; type Props = { - esikatselePdf: (formData: KuulutuksenTiedotFormValues, asiakirjaTyyppi: AsiakirjaTyyppi, kieli: Kieli) => void; + esikatselePdf: (formData: TallennaProjektiInput, asiakirjaTyyppi: AsiakirjaTyyppi, kieli: Kieli) => void; + paatosTyyppi: PaatosTyyppi; }; -export default function KuulutuksenJaIlmoituksenEsikatselu({ esikatselePdf }: Props) { +export const convertFormDataToTallennaProjektiInput: ( + formData: KuulutuksenTiedotFormValues, + paatosTyyppi: PaatosTyyppi +) => TallennaProjektiInput = (formData, paatosTyyppi) => { + const { paatos, ...rest } = formData; + const { paatosVaiheAvain } = paatosSpecificRoutesMap[paatosTyyppi]; + return { ...rest, [paatosVaiheAvain]: paatos }; +}; + +export default function KuulutuksenJaIlmoituksenEsikatselu({ esikatselePdf, paatosTyyppi }: Props) { const { data: projekti } = useProjekti(); const { handleSubmit } = useFormContext(); @@ -28,9 +39,7 @@ export default function KuulutuksenJaIlmoituksenEsikatselu({ esikatselePdf }: Pr return (

    Kuulutuksen ja ilmoituksen esikatselu

    - - Esikatsele kuulutus ja ilmoitus ennen hyväksyntään lähettämistä.{" "} - + Esikatsele kuulutus ja ilmoitus ennen hyväksyntään lähettämistä.
    {ensisijainenKieli && (
    @@ -42,7 +51,11 @@ export default function KuulutuksenJaIlmoituksenEsikatselu({ esikatselePdf }: Pr type="submit" onClick={handleSubmit((formData) => { console.log(formData); - esikatselePdf(formData, AsiakirjaTyyppi.HYVAKSYMISPAATOSKUULUTUS, ensisijainenKieli); + esikatselePdf( + convertFormDataToTallennaProjektiInput(formData, paatosTyyppi), + AsiakirjaTyyppi.HYVAKSYMISPAATOSKUULUTUS, + ensisijainenKieli + ); })} > Kuulutuksen esikatselu @@ -53,7 +66,7 @@ export default function KuulutuksenJaIlmoituksenEsikatselu({ esikatselePdf }: Pr type="button" onClick={handleSubmit((formData) => esikatselePdf( - formData, + convertFormDataToTallennaProjektiInput(formData, paatosTyyppi), AsiakirjaTyyppi.ILMOITUS_HYVAKSYMISPAATOSKUULUTUKSESTA_LAUSUNNONANTAJILLE, ensisijainenKieli ) @@ -68,7 +81,7 @@ export default function KuulutuksenJaIlmoituksenEsikatselu({ esikatselePdf }: Pr onClick={handleSubmit((formData) => { console.log(formData); esikatselePdf( - formData, + convertFormDataToTallennaProjektiInput(formData, paatosTyyppi), AsiakirjaTyyppi.ILMOITUS_HYVAKSYMISPAATOSKUULUTUKSESTA_MUISTUTTAJILLE, ensisijainenKieli ); @@ -82,7 +95,7 @@ export default function KuulutuksenJaIlmoituksenEsikatselu({ esikatselePdf }: Pr type="button" onClick={handleSubmit((formData) => esikatselePdf( - formData, + convertFormDataToTallennaProjektiInput(formData, paatosTyyppi), AsiakirjaTyyppi.ILMOITUS_HYVAKSYMISPAATOSKUULUTUKSESTA_KUNNILLE, ensisijainenKieli ) @@ -96,7 +109,7 @@ export default function KuulutuksenJaIlmoituksenEsikatselu({ esikatselePdf }: Pr type="button" onClick={handleSubmit((formData) => esikatselePdf( - formData, + convertFormDataToTallennaProjektiInput(formData, paatosTyyppi), AsiakirjaTyyppi.ILMOITUS_HYVAKSYMISPAATOSKUULUTUKSESTA_TOISELLE_VIRANOMAISELLE, ensisijainenKieli ) @@ -116,7 +129,11 @@ export default function KuulutuksenJaIlmoituksenEsikatselu({ esikatselePdf }: Pr id={"preview_kuulutus_pdf_" + toissijainenKieli} type="button" onClick={handleSubmit((formData) => - esikatselePdf(formData, AsiakirjaTyyppi.HYVAKSYMISPAATOSKUULUTUS, toissijainenKieli) + esikatselePdf( + convertFormDataToTallennaProjektiInput(formData, paatosTyyppi), + AsiakirjaTyyppi.HYVAKSYMISPAATOSKUULUTUS, + toissijainenKieli + ) )} > Kuulutuksen esikatselu @@ -127,7 +144,7 @@ export default function KuulutuksenJaIlmoituksenEsikatselu({ esikatselePdf }: Pr type="button" onClick={handleSubmit((formData) => esikatselePdf( - formData, + convertFormDataToTallennaProjektiInput(formData, paatosTyyppi), AsiakirjaTyyppi.ILMOITUS_HYVAKSYMISPAATOSKUULUTUKSESTA_LAUSUNNONANTAJILLE, toissijainenKieli ) @@ -141,7 +158,7 @@ export default function KuulutuksenJaIlmoituksenEsikatselu({ esikatselePdf }: Pr type="button" onClick={handleSubmit((formData) => esikatselePdf( - formData, + convertFormDataToTallennaProjektiInput(formData, paatosTyyppi), AsiakirjaTyyppi.ILMOITUS_HYVAKSYMISPAATOSKUULUTUKSESTA_MUISTUTTAJILLE, toissijainenKieli ) @@ -155,7 +172,7 @@ export default function KuulutuksenJaIlmoituksenEsikatselu({ esikatselePdf }: Pr type="button" onClick={handleSubmit((formData) => esikatselePdf( - formData, + convertFormDataToTallennaProjektiInput(formData, paatosTyyppi), AsiakirjaTyyppi.ILMOITUS_HYVAKSYMISPAATOSKUULUTUKSESTA_KUNNILLE, toissijainenKieli ) @@ -169,7 +186,7 @@ export default function KuulutuksenJaIlmoituksenEsikatselu({ esikatselePdf }: Pr type="button" onClick={handleSubmit((formData) => esikatselePdf( - formData, + convertFormDataToTallennaProjektiInput(formData, paatosTyyppi), AsiakirjaTyyppi.ILMOITUS_HYVAKSYMISPAATOSKUULUTUKSESTA_TOISELLE_VIRANOMAISELLE, toissijainenKieli ) diff --git a/src/components/projekti/hyvaksyminen/kuulutuksenTiedot/KuulutuksessaEsitettavatYhteystiedot.tsx b/src/components/projekti/paatos/kuulutuksenTiedot/KuulutuksessaEsitettavatYhteystiedot.tsx similarity index 79% rename from src/components/projekti/hyvaksyminen/kuulutuksenTiedot/KuulutuksessaEsitettavatYhteystiedot.tsx rename to src/components/projekti/paatos/kuulutuksenTiedot/KuulutuksessaEsitettavatYhteystiedot.tsx index 1b0a3319d..d855c78cc 100644 --- a/src/components/projekti/hyvaksyminen/kuulutuksenTiedot/KuulutuksessaEsitettavatYhteystiedot.tsx +++ b/src/components/projekti/paatos/kuulutuksenTiedot/KuulutuksessaEsitettavatYhteystiedot.tsx @@ -1,6 +1,13 @@ import { Controller, useFieldArray, useFormContext } from "react-hook-form"; import SectionContent from "@components/layout/SectionContent"; -import { HyvaksymisPaatosVaiheTila, KayttajaTyyppi, Projekti, ProjektiKayttaja, YhteystietoInput } from "@services/api"; +import { + HyvaksymisPaatosVaihe, + HyvaksymisPaatosVaiheJulkaisu, + HyvaksymisPaatosVaiheTila, + KayttajaTyyppi, + ProjektiKayttaja, + YhteystietoInput, +} from "@services/api"; import Section from "@components/layout/Section"; import { Fragment, ReactElement } from "react"; import Button from "@components/button/Button"; @@ -12,9 +19,10 @@ import HassuGrid from "@components/HassuGrid"; import { maxPhoneLength } from "src/schemas/puhelinNumero"; import IconButton from "@components/button/IconButton"; import replace from "lodash/replace"; -import { useProjekti } from "src/hooks/useProjekti"; +import { ProjektiLisatiedolla } from "src/hooks/useProjekti"; import { KuulutuksenTiedotFormValues } from "./index"; import { formatNimi } from "../../../../util/userUtil"; +import { PaatosTyyppi } from "src/util/getPaatosSpecificData"; const defaultYhteystieto: YhteystietoInput = { etunimi: "", @@ -24,18 +32,19 @@ const defaultYhteystieto: YhteystietoInput = { sahkoposti: "", }; -interface Props {} - -function hasHyvaksyttyHyvaksymisPaatosVaiheJulkaisu(projekti: Projekti | null | undefined) { - return ( - (projekti?.hyvaksymisPaatosVaiheJulkaisut?.filter((julkaisu) => julkaisu.tila == HyvaksymisPaatosVaiheTila.HYVAKSYTTY) || []).length > 0 - ); +interface Props { + paatosTyyppi: PaatosTyyppi; + julkaisut: HyvaksymisPaatosVaiheJulkaisu[] | null | undefined; + projekti: ProjektiLisatiedolla; + julkaisematonPaatos: HyvaksymisPaatosVaihe | null | undefined; } -export default function EsitettavatYhteystiedot({}: Props): ReactElement { - const { data: projekti } = useProjekti(); +function hasHyvaksyttyPaatosVaiheJulkaisu(julkaisut: HyvaksymisPaatosVaiheJulkaisu[] | null | undefined) { + return (julkaisut?.filter((julkaisu) => julkaisu.tila == HyvaksymisPaatosVaiheTila.HYVAKSYTTY) || []).length > 0; +} - const eiVoiMuokata = hasHyvaksyttyHyvaksymisPaatosVaiheJulkaisu(projekti); +export default function EsitettavatYhteystiedot({ julkaisut, projekti, julkaisematonPaatos }: Props): ReactElement { + const eiVoiMuokata = hasHyvaksyttyPaatosVaiheJulkaisu(julkaisut); const { register, @@ -45,11 +54,11 @@ export default function EsitettavatYhteystiedot({}: Props): ReactElement { const { fields, append, remove } = useFieldArray({ control, - name: "hyvaksymisPaatosVaihe.kuulutusYhteystiedot.yhteysTiedot", + name: "paatos.kuulutusYhteystiedot.yhteysTiedot", }); - const kuulutusYhteysHenkilot: ProjektiKayttaja[] = projekti?.hyvaksymisPaatosVaihe?.kuulutusYhteystiedot?.yhteysHenkilot - ? projekti.hyvaksymisPaatosVaihe?.kuulutusYhteystiedot?.yhteysHenkilot + const kuulutusYhteysHenkilot: ProjektiKayttaja[] = julkaisematonPaatos?.kuulutusYhteystiedot?.yhteysHenkilot + ? julkaisematonPaatos?.kuulutusYhteystiedot?.yhteysHenkilot .map((hlo) => { const yhteysHenkiloTietoineen: ProjektiKayttaja | undefined = (projekti?.kayttoOikeudet || []).find( (ko) => ko.kayttajatunnus === hlo @@ -67,7 +76,7 @@ export default function EsitettavatYhteystiedot({}: Props): ReactElement {

    Vuorovaikuttamisen yhteyshenkilöt

    - {projekti?.hyvaksymisPaatosVaihe?.kuulutusYhteystiedot?.yhteysTiedot?.map((yhteystieto, index) => ( + {julkaisematonPaatos?.kuulutusYhteystiedot?.yhteysTiedot?.map((yhteystieto, index) => (

    {formatNimi(yhteystieto)}, puh. {yhteystieto.puhelinnumero},{" "} {yhteystieto?.sahkoposti ? replace(yhteystieto?.sahkoposti, "@", "[at]") : ""} ({yhteystieto.organisaatio}) @@ -96,7 +105,7 @@ export default function EsitettavatYhteystiedot({}: Props): ReactElement { {projekti?.kayttoOikeudet && projekti.kayttoOikeudet.length > 0 ? ( ( {projekti.kayttoOikeudet?.map(({ etunimi, sukunimi, tyyppi, kayttajatunnus }, index) => { @@ -142,28 +151,28 @@ export default function EsitettavatYhteystiedot({}: Props): ReactElement { diff --git a/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/KuulutusJaJulkaisuPaiva.tsx b/src/components/projekti/paatos/kuulutuksenTiedot/KuulutusJaJulkaisuPaiva.tsx similarity index 77% rename from src/components/projekti/jatkopaatos1/kuulutuksenTiedot/KuulutusJaJulkaisuPaiva.tsx rename to src/components/projekti/paatos/kuulutuksenTiedot/KuulutusJaJulkaisuPaiva.tsx index dae42bd72..bec22a086 100644 --- a/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/KuulutusJaJulkaisuPaiva.tsx +++ b/src/components/projekti/paatos/kuulutuksenTiedot/KuulutusJaJulkaisuPaiva.tsx @@ -8,18 +8,10 @@ import { api, LaskuriTyyppi } from "@services/api"; import useSnackbars from "src/hooks/useSnackbars"; import HassuGrid from "@components/HassuGrid"; import { HassuDatePickerWithController } from "@components/form/HassuDatePicker"; +import { KuulutuksenTiedotFormValues } from "@components/projekti/paatos/kuulutuksenTiedot/index"; -type Props = {}; - -type FormFields = { - jatkoPaatos1Vaihe: { - kuulutusPaiva: string | null; - kuulutusVaihePaattyyPaiva: string | null; - }; -}; - -export default function KuulutusJaJulkaisuPaiva({}: Props) { - const { setValue } = useFormContext(); +export default function KuulutusJaJulkaisuPaiva() { + const { setValue, control } = useFormContext(); const { showErrorMessage } = useSnackbars(); @@ -27,7 +19,7 @@ export default function KuulutusJaJulkaisuPaiva({}: Props) { async (value: string) => { try { const paattymispaiva = await api.laskePaattymisPaiva(value, LaskuriTyyppi.HYVAKSYMISPAATOKSEN_KUULUTUSAIKA); - setValue("jatkoPaatos1Vaihe.kuulutusVaihePaattyyPaiva", paattymispaiva); + setValue("paatos.kuulutusVaihePaattyyPaiva", paattymispaiva); } catch (error) { showErrorMessage("Kuulutuksen päättymispäivän laskennassa tapahtui virhe"); log.error("Kuulutusvaiheen päättymispäivän laskennassa virhe", error); @@ -52,11 +44,12 @@ export default function KuulutusJaJulkaisuPaiva({}: Props) { }} textFieldProps={{ required: true }} controllerProps={{ - name: "jatkoPaatos1Vaihe.kuulutusPaiva", + control, + name: "paatos.kuulutusPaiva", }} /> - + controllerProps={{ control, name: "paatos.kuulutusVaihePaattyyPaiva" }} label="Kuulutusvaihe päättyy" disabled /> diff --git a/src/components/projekti/hyvaksyminen/kuulutuksenTiedot/Lukunakyma.tsx b/src/components/projekti/paatos/kuulutuksenTiedot/Lukunakyma.tsx similarity index 75% rename from src/components/projekti/hyvaksyminen/kuulutuksenTiedot/Lukunakyma.tsx rename to src/components/projekti/paatos/kuulutuksenTiedot/Lukunakyma.tsx index 56252c6c3..f1978d443 100644 --- a/src/components/projekti/hyvaksyminen/kuulutuksenTiedot/Lukunakyma.tsx +++ b/src/components/projekti/paatos/kuulutuksenTiedot/Lukunakyma.tsx @@ -1,5 +1,5 @@ +import React, { ReactElement, useMemo } from "react"; import { HyvaksymisPaatosVaiheJulkaisu, Kieli } from "@services/api"; -import React, { ReactElement } from "react"; import replace from "lodash/replace"; import { examineKuulutusPaiva } from "src/util/aloitusKuulutusUtil"; import FormatDate from "@components/FormatDate"; @@ -17,30 +17,34 @@ import { ProjektiTestCommand } from "../../../../../common/testUtil.dev"; import { formatDate } from "src/util/dateUtils"; import { projektiOnEpaaktiivinen } from "src/util/statusUtil"; import { formatNimi } from "../../../../util/userUtil"; +import { getPaatosSpecificData, PaatosTyyppi } from "src/util/getPaatosSpecificData"; interface Props { - hyvaksymisPaatosVaiheJulkaisu?: HyvaksymisPaatosVaiheJulkaisu | null; + julkaisu?: HyvaksymisPaatosVaiheJulkaisu | null; projekti: ProjektiLisatiedolla; + paatosTyyppi: PaatosTyyppi; } -export default function HyvaksymisKuulutusLukunakyma({ hyvaksymisPaatosVaiheJulkaisu, projekti }: Props): ReactElement { +export default function HyvaksymisKuulutusLukunakyma({ julkaisu, projekti, paatosTyyppi }: Props): ReactElement { const { t } = useTranslation("common"); const getPdft = (kieli: Kieli | undefined | null) => { - if (!hyvaksymisPaatosVaiheJulkaisu || !hyvaksymisPaatosVaiheJulkaisu.hyvaksymisPaatosVaihePDFt || !kieli) { + if (!julkaisu || !julkaisu.hyvaksymisPaatosVaihePDFt || !kieli) { return undefined; } - return hyvaksymisPaatosVaiheJulkaisu?.hyvaksymisPaatosVaihePDFt[kieli]; + return julkaisu?.hyvaksymisPaatosVaihePDFt[kieli]; }; - const ensisijaisetPDFt = getPdft(hyvaksymisPaatosVaiheJulkaisu?.kielitiedot?.ensisijainenKieli); - const toissijaisetPDFt = getPdft(hyvaksymisPaatosVaiheJulkaisu?.kielitiedot?.toissijainenKieli); + const ensisijaisetPDFt = getPdft(julkaisu?.kielitiedot?.ensisijainenKieli); + const toissijaisetPDFt = getPdft(julkaisu?.kielitiedot?.toissijainenKieli); - if (!hyvaksymisPaatosVaiheJulkaisu || !projekti) { + const { kasittelyntilaData } = useMemo(() => getPaatosSpecificData(projekti, paatosTyyppi), [paatosTyyppi, projekti]); + + if (!julkaisu || !projekti) { return <>; } const epaaktiivinen = projektiOnEpaaktiivinen(projekti); - let { kuulutusPaiva, published } = examineKuulutusPaiva(hyvaksymisPaatosVaiheJulkaisu.kuulutusPaiva); + let { kuulutusPaiva, published } = examineKuulutusPaiva(julkaisu.kuulutusPaiva); let hyvaksymisPaatosVaiheHref: string | undefined; if (published) { hyvaksymisPaatosVaiheHref = @@ -55,7 +59,7 @@ export default function HyvaksymisKuulutusLukunakyma({ hyvaksymisPaatosVaiheJulk

    Kuulutusvaihe päättyy

    {kuulutusPaiva}

    - +

    {process.env.ENVIRONMENT != "prod" && (
    @@ -63,7 +67,13 @@ export default function HyvaksymisKuulutusLukunakyma({ hyvaksymisPaatosVaiheJulk icon="history" onClick={(e) => { e.preventDefault(); - window.location.assign(ProjektiTestCommand.oid(projekti.oid).hyvaksymispaatosMenneisyyteen()); + if (paatosTyyppi === PaatosTyyppi.HYVAKSYMISPAATOS) { + window.location.assign(ProjektiTestCommand.oid(projekti.oid).hyvaksymispaatosMenneisyyteen()); + } else if (paatosTyyppi === PaatosTyyppi.JATKOPAATOS1) { + window.location.assign(ProjektiTestCommand.oid(projekti.oid).jatkopaatos1Menneisyyteen()); + } else if (paatosTyyppi === PaatosTyyppi.JATKOPAATOS2) { + // TODO Lisää JATKOPAATOS2 toiminnot + } }} > Siirrä päivän verran menneisyyteen (TESTAAJILLE) @@ -72,7 +82,13 @@ export default function HyvaksymisKuulutusLukunakyma({ hyvaksymisPaatosVaiheJulk icon="history" onClick={(e) => { e.preventDefault(); - window.location.assign(ProjektiTestCommand.oid(projekti.oid).hyvaksymispaatosVuosiMenneisyyteen()); + if (paatosTyyppi === PaatosTyyppi.HYVAKSYMISPAATOS) { + window.location.assign(ProjektiTestCommand.oid(projekti.oid).hyvaksymispaatosVuosiMenneisyyteen()); + } else if (paatosTyyppi === PaatosTyyppi.JATKOPAATOS1) { + window.location.assign(ProjektiTestCommand.oid(projekti.oid).jatkopaatos1VuosiMenneisyyteen()); + } else if (paatosTyyppi === PaatosTyyppi.JATKOPAATOS2) { + // TODO Lisää JATKOPAATOS2 toiminnot + } }} > Siirrä vuoden verran menneisyyteen (TESTAAJILLE) @@ -84,24 +100,24 @@ export default function HyvaksymisKuulutusLukunakyma({ hyvaksymisPaatosVaiheJulk

    Päätöksen päivä

    Päätöksen asianumero

    - +

    -

    {projekti.kasittelynTila?.hyvaksymispaatos?.asianumero}

    +

    {kasittelyntilaData?.asianumero}

    Päätös ja sen liitteet löytyvät Päätös ja sen liitteenä oleva aineisto -välilehdeltä.

    Muutoksenhaku

    - Päätökseen voi valittamalla hakea muutosta {t(`hallinto-oikeus-ablatiivi.${hyvaksymisPaatosVaiheJulkaisu.hallintoOikeus}`)} 30 - päivän kuluessa päätöksen tiedoksiannosta. Valitusosoituksen tiedosto löytyy Päätös ja sen liitteenä oleva aineisto -välilehdeltä. + Päätökseen voi valittamalla hakea muutosta {t(`hallinto-oikeus-ablatiivi.${julkaisu.hallintoOikeus}`)} 30 päivän kuluessa + päätöksen tiedoksiannosta. Valitusosoituksen tiedosto löytyy Päätös ja sen liitteenä oleva aineisto -välilehdeltä.

    Kuulutuksen yhteyshenkilöt

    - {hyvaksymisPaatosVaiheJulkaisu.yhteystiedot?.map((yhteystieto, index) => ( + {julkaisu.yhteystiedot?.map((yhteystieto, index) => (

    {formatNimi(yhteystieto)}, puh. {yhteystieto.puhelinnumero},{" "} {yhteystieto?.sahkoposti ? replace(yhteystieto?.sahkoposti, "@", "[at]") : ""} ({yhteystieto.organisaatio}) @@ -112,8 +128,8 @@ export default function HyvaksymisKuulutusLukunakyma({ hyvaksymisPaatosVaiheJulk

    Kuulutus julkisella puolella

    - Kuulutus on ollut nähtävillä julkisella puolella {formatDate(hyvaksymisPaatosVaiheJulkaisu.kuulutusPaiva)}— - {formatDate(hyvaksymisPaatosVaiheJulkaisu.kuulutusVaihePaattyyPaiva)} välisen ajan. + Kuulutus on ollut nähtävillä julkisella puolella {formatDate(julkaisu.kuulutusPaiva)}— + {formatDate(julkaisu.kuulutusVaihePaattyyPaiva)} välisen ajan.

    ) : ( @@ -135,7 +151,7 @@ export default function HyvaksymisKuulutusLukunakyma({ hyvaksymisPaatosVaiheJulk ) : (

    Ladattavat kuulutukset ja ilmoitukset

    -

    Kuulutus ja ilmoitus ensisijaisella kielellä ({lowerCase(hyvaksymisPaatosVaiheJulkaisu.kielitiedot?.ensisijainenKieli)})

    +

    Kuulutus ja ilmoitus ensisijaisella kielellä ({lowerCase(julkaisu.kielitiedot?.ensisijainenKieli)})

    {ensisijaisetPDFt && (
    @@ -170,11 +186,9 @@ export default function HyvaksymisKuulutusLukunakyma({ hyvaksymisPaatosVaiheJulk
    )} - {hyvaksymisPaatosVaiheJulkaisu.kielitiedot?.toissijainenKieli && ( + {julkaisu.kielitiedot?.toissijainenKieli && (
    -

    - Kuulutus ja ilmoitus toissijaisella kielellä ({lowerCase(hyvaksymisPaatosVaiheJulkaisu.kielitiedot?.toissijainenKieli)}) -

    +

    Kuulutus ja ilmoitus toissijaisella kielellä ({lowerCase(julkaisu.kielitiedot?.toissijainenKieli)})

    {toissijaisetPDFt && (
    @@ -215,8 +229,8 @@ export default function HyvaksymisKuulutusLukunakyma({ hyvaksymisPaatosVaiheJulk
    diff --git a/src/components/projekti/hyvaksyminen/kuulutuksenTiedot/Modaalit.tsx b/src/components/projekti/paatos/kuulutuksenTiedot/Modaalit.tsx similarity index 100% rename from src/components/projekti/hyvaksyminen/kuulutuksenTiedot/Modaalit.tsx rename to src/components/projekti/paatos/kuulutuksenTiedot/Modaalit.tsx diff --git a/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/MuutoksenHaku.tsx b/src/components/projekti/paatos/kuulutuksenTiedot/MuutoksenHaku.tsx similarity index 83% rename from src/components/projekti/jatkopaatos1/kuulutuksenTiedot/MuutoksenHaku.tsx rename to src/components/projekti/paatos/kuulutuksenTiedot/MuutoksenHaku.tsx index 9d162e12c..eb9ee05c3 100644 --- a/src/components/projekti/jatkopaatos1/kuulutuksenTiedot/MuutoksenHaku.tsx +++ b/src/components/projekti/paatos/kuulutuksenTiedot/MuutoksenHaku.tsx @@ -6,26 +6,21 @@ import { HallintoOikeus } from "@services/api"; import Select from "@components/form/Select"; import useTranslation from "next-translate/useTranslation"; import { Controller } from "react-hook-form"; +import { KuulutuksenTiedotFormValues } from "@components/projekti/paatos/kuulutuksenTiedot/index"; type Props = {}; -type FormFields = { - jatkoPaatos1Vaihe: { - hallintoOikeus: HallintoOikeus; - }; -}; - export default function MuutoksenHaku({}: Props) { const { register, formState: { errors }, control, - } = useFormContext(); + } = useFormContext(); const { t } = useTranslation("common"); return ( -
    +

    Muutoksen haku

    @@ -36,7 +31,7 @@ export default function MuutoksenHaku({}: Props) {

    (