From d8ef8b3ee0fc51066f76f228160cb9483d3d9a67 Mon Sep 17 00:00:00 2001 From: stephane-ruhlmann Date: Tue, 14 Jan 2025 12:11:03 +0100 Subject: [PATCH] feat(web): display previously entered data in photovoltaic project decontamination forms --- .../create-project/core/project.types.ts | 1 + .../actions/renewableEnergy.actions.ts | 6 +++--- .../renewable-energy/renewableEnergy.reducer.ts | 4 ++-- .../selectors/renewableEnergy.selector.ts | 14 +++++++++++++- .../urbanProjectSoilsDecontamination.spec.ts | 10 +++++----- .../core/urban-project/urbanProject.reducer.ts | 4 ++-- .../soils-decontamination/selection/index.tsx | 16 ++++++++++------ .../soils-decontamination/surface-area/index.tsx | 7 +++++++ .../soils-decontamination/selection/index.tsx | 6 +++--- 9 files changed, 46 insertions(+), 22 deletions(-) diff --git a/apps/web/src/features/create-project/core/project.types.ts b/apps/web/src/features/create-project/core/project.types.ts index 9e972ebb..90797371 100644 --- a/apps/web/src/features/create-project/core/project.types.ts +++ b/apps/web/src/features/create-project/core/project.types.ts @@ -35,6 +35,7 @@ export type ReconversionProjectCreationData = { futureSiteOwner: ProjectStakeholder; reinstatementContractOwner?: ProjectStakeholder; decontaminatedSurfaceArea?: number; + decontaminationPlan?: "none" | "partial" | "unknown"; // soils transformation baseSoilsDistributionForTransformation: SoilsDistribution; soilsDistribution: SoilsDistribution; diff --git a/apps/web/src/features/create-project/core/renewable-energy/actions/renewableEnergy.actions.ts b/apps/web/src/features/create-project/core/renewable-energy/actions/renewableEnergy.actions.ts index 293f7930..fb63da17 100644 --- a/apps/web/src/features/create-project/core/renewable-energy/actions/renewableEnergy.actions.ts +++ b/apps/web/src/features/create-project/core/renewable-energy/actions/renewableEnergy.actions.ts @@ -117,9 +117,9 @@ export const completeProjectPhaseStep = createAction<{ phase: RenewableEnergyPro export const completeSoilsDecontaminationIntroduction = createAction( "completeSoilsDecontaminationIntroduction", ); -export const completeSoilsDecontaminationSelection = createAction< - "partial" | "none" | "unknown" | null ->("completeSoilsDecontaminationSelection"); +export const completeSoilsDecontaminationSelection = createAction<"partial" | "none" | "unknown">( + "completeSoilsDecontaminationSelection", +); export const completeSoilsDecontaminationSurfaceArea = createAction( "completeSoilsDecontaminationSurfaceArea", ); diff --git a/apps/web/src/features/create-project/core/renewable-energy/renewableEnergy.reducer.ts b/apps/web/src/features/create-project/core/renewable-energy/renewableEnergy.reducer.ts index 0c66403e..efc560f2 100644 --- a/apps/web/src/features/create-project/core/renewable-energy/renewableEnergy.reducer.ts +++ b/apps/web/src/features/create-project/core/renewable-energy/renewableEnergy.reducer.ts @@ -193,13 +193,13 @@ const addCompleteStepActionCases = (builder: ActionReducerMapBuilder { + state.renewableEnergyProject.creationData.decontaminationPlan = action.payload; switch (action.payload) { case "none": state.renewableEnergyProject.creationData.decontaminatedSurfaceArea = 0; state.renewableEnergyProject.stepsHistory.push("SOILS_TRANSFORMATION_INTRODUCTION"); break; - case "unknown": - case null: { + case "unknown": { const contaminatedSoilSurface = state.siteData?.contaminatedSoilSurface ?? 0; state.renewableEnergyProject.creationData.decontaminatedSurfaceArea = contaminatedSoilSurface * 0.25; diff --git a/apps/web/src/features/create-project/core/renewable-energy/selectors/renewableEnergy.selector.ts b/apps/web/src/features/create-project/core/renewable-energy/selectors/renewableEnergy.selector.ts index b53381dd..67ff7989 100644 --- a/apps/web/src/features/create-project/core/renewable-energy/selectors/renewableEnergy.selector.ts +++ b/apps/web/src/features/create-project/core/renewable-energy/selectors/renewableEnergy.selector.ts @@ -3,9 +3,10 @@ import { ProjectSchedule, ProjectScheduleBuilder, SoilsDistribution } from "shar import { RootState } from "@/app/application/store"; import { RenewableEnergyDevelopmentPlanType } from "@/shared/domain/reconversionProject"; +import { computePercentage } from "@/shared/services/percentage/percentage"; import { ProjectCreationState } from "../../createProject.reducer"; -import { selectDefaultSchedule } from "../../createProject.selectors"; +import { selectDefaultSchedule, selectSiteData } from "../../createProject.selectors"; import { generateRenewableEnergyProjectName } from "../../projectName"; import { computeDefaultPhotovoltaicOtherAmountExpenses, @@ -46,6 +47,17 @@ export const selectProjectSoilsDistribution = createSelector( (state): SoilsDistribution => state.creationData.soilsDistribution ?? {}, ); +export const selectContaminatedSurfaceAreaPercentageToDecontaminate = createSelector( + [selectCreationData, selectSiteData], + (creationData, siteData) => { + const surfaceToDecontaminate = creationData.decontaminatedSurfaceArea; + const contaminatedSurfaceArea = siteData?.contaminatedSoilSurface; + if (!contaminatedSurfaceArea || !surfaceToDecontaminate) return 0; + + return computePercentage(surfaceToDecontaminate, contaminatedSurfaceArea); + }, +); + export const getDefaultValuesForYearlyProjectedExpenses = createSelector( selectCreationData, (creationData): { rent: number; maintenance: number; taxes: number } | undefined => { diff --git a/apps/web/src/features/create-project/core/urban-project/__tests__/urbanProjectSoilsDecontamination.spec.ts b/apps/web/src/features/create-project/core/urban-project/__tests__/urbanProjectSoilsDecontamination.spec.ts index 4f7db5d3..92baf75b 100644 --- a/apps/web/src/features/create-project/core/urban-project/__tests__/urbanProjectSoilsDecontamination.spec.ts +++ b/apps/web/src/features/create-project/core/urban-project/__tests__/urbanProjectSoilsDecontamination.spec.ts @@ -50,7 +50,7 @@ describe("Urban project custom creation : soils decontamination", () => { expectUpdatedState(initialRootState, newState, { currentStep: "SOILS_DECONTAMINATION_SURFACE_AREA", creationDataDiff: { - decontaminationNeeded: "partial", + decontaminationPlan: "partial", }, }); }); @@ -69,7 +69,7 @@ describe("Urban project custom creation : soils decontamination", () => { expectUpdatedState(initialRootState, newState, { currentStep: "BUILDINGS_INTRODUCTION", creationDataDiff: { - decontaminationNeeded: "none", + decontaminationPlan: "none", decontaminatedSurfaceArea: 0, }, }); @@ -92,7 +92,7 @@ describe("Urban project custom creation : soils decontamination", () => { expectUpdatedState(initialRootState, newState, { currentStep: "BUILDINGS_INTRODUCTION", creationDataDiff: { - decontaminationNeeded: "unknown", + decontaminationPlan: "unknown", decontaminatedSurfaceArea: 250, }, }); @@ -110,7 +110,7 @@ describe("Urban project custom creation : soils decontamination", () => { expectUpdatedState(initialRootState, newState, { currentStep: "STAKEHOLDERS_INTRODUCTION", creationDataDiff: { - decontaminationNeeded: "none", + decontaminationPlan: "none", decontaminatedSurfaceArea: 0, }, }); @@ -130,7 +130,7 @@ describe("Urban project custom creation : soils decontamination", () => { expectUpdatedState(initialRootState, newState, { currentStep: "STAKEHOLDERS_INTRODUCTION", creationDataDiff: { - decontaminationNeeded: "unknown", + decontaminationPlan: "unknown", decontaminatedSurfaceArea: 250, }, }); diff --git a/apps/web/src/features/create-project/core/urban-project/urbanProject.reducer.ts b/apps/web/src/features/create-project/core/urban-project/urbanProject.reducer.ts index 22c6560c..303d8287 100644 --- a/apps/web/src/features/create-project/core/urban-project/urbanProject.reducer.ts +++ b/apps/web/src/features/create-project/core/urban-project/urbanProject.reducer.ts @@ -176,7 +176,7 @@ export type UrbanProjectState = { greenSpacesDistribution?: Partial>; livingAndActivitySpacesDistribution?: Partial>; publicSpacesDistribution?: Partial>; - decontaminationNeeded?: "partial" | "none" | "unknown"; + decontaminationPlan?: "partial" | "none" | "unknown"; decontaminatedSurfaceArea?: number; // buildings buildingsFloorSurfaceArea?: number; @@ -402,7 +402,7 @@ const urbanProjectReducer = createReducer({} as ProjectCreationState, (builder) ? "BUILDINGS_INTRODUCTION" : "STAKEHOLDERS_INTRODUCTION"; - state.urbanProject.creationData.decontaminationNeeded = action.payload; + state.urbanProject.creationData.decontaminationPlan = action.payload; switch (action.payload) { case "partial": state.urbanProject.stepsHistory.push("SOILS_DECONTAMINATION_SURFACE_AREA"); diff --git a/apps/web/src/features/create-project/views/photovoltaic-power-station/soils-decontamination/selection/index.tsx b/apps/web/src/features/create-project/views/photovoltaic-power-station/soils-decontamination/selection/index.tsx index f16c8091..e8d6ac12 100644 --- a/apps/web/src/features/create-project/views/photovoltaic-power-station/soils-decontamination/selection/index.tsx +++ b/apps/web/src/features/create-project/views/photovoltaic-power-station/soils-decontamination/selection/index.tsx @@ -2,7 +2,7 @@ import { completeSoilsDecontaminationSelection, revertSoilsDecontaminationSelectionStep, } from "@/features/create-project/core/renewable-energy/actions/renewableEnergy.actions"; -import { useAppDispatch } from "@/shared/views/hooks/store.hooks"; +import { useAppDispatch, useAppSelector } from "@/shared/views/hooks/store.hooks"; import SoilsDecontaminationSelection, { FormValues, @@ -10,14 +10,18 @@ import SoilsDecontaminationSelection, { function SoilsDecontaminationSelectionContainer() { const dispatch = useAppDispatch(); - - const onSubmit = (data: FormValues) => { - dispatch(completeSoilsDecontaminationSelection(data.decontaminationSelection)); - }; + const decontaminationPlan = useAppSelector( + (state) => state.projectCreation.renewableEnergyProject.creationData.decontaminationPlan, + ); return ( { + dispatch(completeSoilsDecontaminationSelection(data.decontaminationSelection ?? "unknown")); + }} onBack={() => dispatch(revertSoilsDecontaminationSelectionStep())} /> ); diff --git a/apps/web/src/features/create-project/views/photovoltaic-power-station/soils-decontamination/surface-area/index.tsx b/apps/web/src/features/create-project/views/photovoltaic-power-station/soils-decontamination/surface-area/index.tsx index c07f34b6..9329889e 100644 --- a/apps/web/src/features/create-project/views/photovoltaic-power-station/soils-decontamination/surface-area/index.tsx +++ b/apps/web/src/features/create-project/views/photovoltaic-power-station/soils-decontamination/surface-area/index.tsx @@ -3,6 +3,7 @@ import { completeSoilsDecontaminationSurfaceArea, revertSoilsDecontaminationSurfaceAreaStep, } from "@/features/create-project/core/renewable-energy/actions/renewableEnergy.actions"; +import { selectContaminatedSurfaceAreaPercentageToDecontaminate } from "@/features/create-project/core/renewable-energy/selectors/renewableEnergy.selector"; import { useAppDispatch, useAppSelector } from "@/shared/views/hooks/store.hooks"; import SoilsDecontaminationSurfaceArea from "../../../common-views/soils-decontamination/surface-area/SoilsDecontaminationSurfaceArea"; @@ -10,6 +11,9 @@ import SoilsDecontaminationSurfaceArea from "../../../common-views/soils-deconta function SoilsDecontaminationSurfaceAreaContainer() { const dispatch = useAppDispatch(); const contaminatedSurfaceArea = useAppSelector(selectSiteContaminatedSurfaceArea); + const surfaceAreaToDecontaminateInPercentage = useAppSelector( + selectContaminatedSurfaceAreaPercentageToDecontaminate, + ); const onSubmit = (surfaceArea: number) => { dispatch(completeSoilsDecontaminationSurfaceArea(surfaceArea)); @@ -17,6 +21,9 @@ function SoilsDecontaminationSurfaceAreaContainer() { return ( dispatch(revertSoilsDecontaminationSurfaceAreaStep())} diff --git a/apps/web/src/features/create-project/views/urban-project/custom-forms/soils-decontamination/selection/index.tsx b/apps/web/src/features/create-project/views/urban-project/custom-forms/soils-decontamination/selection/index.tsx index 64e93a89..adc9921d 100644 --- a/apps/web/src/features/create-project/views/urban-project/custom-forms/soils-decontamination/selection/index.tsx +++ b/apps/web/src/features/create-project/views/urban-project/custom-forms/soils-decontamination/selection/index.tsx @@ -8,15 +8,15 @@ import SoilsDecontaminationSelection, { import { useAppDispatch, useAppSelector } from "@/shared/views/hooks/store.hooks"; function SoilsDecontaminationSelectionContainer() { - const decontaminationNeeded = useAppSelector( - (state) => state.projectCreation.urbanProject.creationData.decontaminationNeeded, + const decontaminationPlan = useAppSelector( + (state) => state.projectCreation.urbanProject.creationData.decontaminationPlan, ); const dispatch = useAppDispatch(); return ( { dispatch(