Skip to content

Commit

Permalink
Ajout de l'indicateur artificialisation des sols sur le site
Browse files Browse the repository at this point in the history
  • Loading branch information
mariheck committed Nov 20, 2023
1 parent ab5113a commit 6dc1984
Show file tree
Hide file tree
Showing 10 changed files with 202 additions and 69 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import {IndicateurArtificialisation} from 'app/collectivites/utils';
import IndicateurCard from './IndicateurCard';
import {IndicateurDefaultData} from './IndicateursCollectivite';
import {getFormattedNumber} from 'src/utils/getFormattedNumber';
import {fluxToLabel} from 'src/utils/labels';

type IndicateurArtificialisationSolsProps = {
defaultData?: IndicateurDefaultData;
data: IndicateurArtificialisation | null;
};

const IndicateurArtificialisationSols = ({
defaultData,
data,
}: IndicateurArtificialisationSolsProps) => {
if (!defaultData || !data || !data.total) return null;

const localData = data as {[key: string]: number};

if (!localData) return null;

const formattedData = (Object.keys(localData) as Array<string>)
.filter(d => d !== 'collectivite_id' && d !== 'total' && localData[d] !== 0)
.map(d => ({
id: fluxToLabel[d],
value: localData[d],
}));

return (
<IndicateurCard
defaultData={defaultData}
data={formattedData}
boxTitle={`+${getFormattedNumber(Math.floor(data.total))} ${
defaultData.titre_encadre
}`}
graphTitle="Répartition du flux de consommation d'espaces, par destination entre 2009 et 2022."
source="Cerema, Consommation d'espaces naturels, agricoles et forestiers"
unit="ha"
unitSingular={true}
/>
);
};

export default IndicateurArtificialisationSols;
57 changes: 21 additions & 36 deletions packages/site/app/collectivites/[code]/[name]/IndicateurCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,15 @@

import DonutChartWithLegend from '@components/charts/DonutChartWithLegend';
import {StrapiImage} from '@components/strapiImage/StrapiImage';
import {Indicateurs} from 'app/collectivites/utils';
import {getFormattedNumber} from 'src/utils/getFormattedNumber';
import {IndicateurDefaultData} from './IndicateursCollectivite';
import {secteurIdToLabel} from 'src/utils/labels';
import Markdown from '@components/markdown/Markdown';

type IndicateurCardProps = {
defaultData?: IndicateurDefaultData;
data: Indicateurs[];
defaultData: IndicateurDefaultData;
data: {id: string; value: number}[];
boxTitle: string;
graphTitle: string;
source?: string;
unit?: string;
unitSingular?: boolean;
};
Expand All @@ -24,26 +23,14 @@ type IndicateurCardProps = {
const IndicateurCard = ({
defaultData,
data,
boxTitle,
graphTitle,
source,
unit,
unitSingular,
}: IndicateurCardProps) => {
if (!defaultData || data.length === 0) return null;

const lastYear = Math.max(...data.map(d => d.annee));

const lastYearData = data.filter(
d => d.annee === lastYear && secteurIdToLabel[d.indicateur_id] !== 'Total',
);

const lastYearTotal = data.find(
d => d.annee === lastYear && secteurIdToLabel[d.indicateur_id] === 'Total',
);

if (lastYearData.length <= 1 && !lastYearTotal) return null;

return (
<div className="flex flex-col bg-white md:rounded-[10px] py-10 px-8 lg:p-8">
<div className="flex flex-col bg-white md:rounded-[10px] py-10 px-8 lg:p-8 max-md:even:bg-primary-0">
{/* Titre */}
<h3 className="text-primary-10 mb-2">{defaultData.titre}</h3>

Expand All @@ -56,15 +43,11 @@ const IndicateurCard = ({
<div className="flex gap-4 bg-primary-2 rounded-[10px] p-4 my-6">
<StrapiImage
data={defaultData.illustration_encadre}
containerClassName="min-w-[70px]"
containerClassName="min-w-[70px] w-[70px]"
/>
<div>
<p className="text-[24px] leading-[39px] text-primary-10 font-bold mb-2">
{`${
lastYearTotal
? `${getFormattedNumber(Math.round(lastYearTotal?.valeur))} `
: ''
}${defaultData.titre_encadre}`}
{boxTitle}
</p>
<p className="text-[13px] leading-[18px] text-primary-8 font-bold mb-0">
{defaultData.description_encadre}
Expand All @@ -81,27 +64,29 @@ const IndicateurCard = ({
)}

{/* Graphe */}
{lastYearData.length > 1 && (
{data.length > 1 && (
<>
<p className="text-[12px] leading-[20px] text-grey-8 mb-0">{`${graphTitle} en ${lastYear}`}</p>
<p className="text-[12px] leading-[20px] text-grey-8 mb-0">
{graphTitle}
</p>
<div className="mb-6">
<DonutChartWithLegend
graphContainerClassname="h-[300px] -mx-8"
data={lastYearData.map(d => ({
id: secteurIdToLabel[d.indicateur_id],
value: d.valeur,
}))}
data={data}
customMargin={{top: 40, right: 100, bottom: 40, left: 100}}
unit={unit}
unitSingular={unitSingular}
/>
</div>

<p className="text-[12px] leading-[17px] text-grey-6 mb-0">
Source : {lastYearData[0].source}
</p>
</>
)}

{/* Source */}
{source && (
<p className="text-[12px] leading-[17px] text-grey-6 mb-0">
Source : {source}
</p>
)}
</div>
);
};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import {Indicateurs} from 'app/collectivites/utils';
import {IndicateurDefaultData} from './IndicateursCollectivite';
import {secteurIdToLabel} from 'src/utils/labels';
import IndicateurCard from './IndicateurCard';
import {getFormattedNumber} from 'src/utils/getFormattedNumber';

type IndicateurGazEffetSerreProps = {
defaultData?: IndicateurDefaultData;
data: Indicateurs[] | null;
};

const IndicateurGazEffetSerre = ({
defaultData,
data,
}: IndicateurGazEffetSerreProps) => {
if (!defaultData || !data || data.length === 0) return null;

const lastYear = Math.max(...data.map(d => d.annee));

const lastYearData = data.filter(
d => d.annee === lastYear && secteurIdToLabel[d.indicateur_id] !== 'Total',
);

const lastYearTotal = data.find(
d => d.annee === lastYear && secteurIdToLabel[d.indicateur_id] === 'Total',
);

if (lastYearData.length <= 1 && !lastYearTotal) return null;

return (
<IndicateurCard
defaultData={defaultData}
data={lastYearData.map(d => ({
id: secteurIdToLabel[d.indicateur_id],
value: d.valeur,
}))}
boxTitle={`${
lastYearTotal
? `${getFormattedNumber(Math.round(lastYearTotal?.valeur))} `
: ''
}${defaultData.titre_encadre}`}
graphTitle={`Répartition des émissions de gaz à effet de serre (hors puits) par secteur en ${lastYear}`}
source={
lastYearData.length ? lastYearData[0].source : lastYearTotal?.source
}
unit="t CO₂eq"
unitSingular={true}
/>
);
};

export default IndicateurGazEffetSerre;
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import Gallery from '@components/gallery/Gallery';
import {Indicateurs} from 'app/collectivites/utils';
import {
IndicateurArtificialisation,
Indicateurs,
} from 'app/collectivites/utils';
import {StrapiItem} from 'src/strapi/StrapiItem';
import IndicateurCard from './IndicateurCard';
import IndicateurGazEffetSerre from './IndicateurGazEffetSerre';
import IndicateurArtificialisationSols from './IndicateurArtificialisationSols';

export type IndicateurDefaultData = {
titre: string;
Expand All @@ -14,10 +18,12 @@ export type IndicateurDefaultData = {

type IndicateursCollectiviteProps = {
defaultData: {
artificialisation_sols?: IndicateurDefaultData;
gaz_effet_serre?: IndicateurDefaultData;
};
indicateurs: {
gaz_effet_serre: Indicateurs[];
artificialisation_sols: IndicateurArtificialisation | null;
gaz_effet_serre: Indicateurs[] | null;
};
};

Expand All @@ -32,13 +38,15 @@ const IndicateursCollectivite = ({
breakpoints={{md: 768, lg: 1024}}
gap="gap-0 md:gap-10 xl:gap-12"
data={[
<IndicateurCard
<IndicateurArtificialisationSols
key="artificialisation_sols"
defaultData={defaultData.artificialisation_sols}
data={indicateurs.artificialisation_sols}
/>,
<IndicateurGazEffetSerre
key="gaz_effet_serre"
defaultData={defaultData.gaz_effet_serre}
data={indicateurs.gaz_effet_serre}
graphTitle="Répartition des émissions de gaz à effet de serre (hors puits) par secteur"
unit="t CO₂eq"
unitSingular={true}
/>,
]}
/>
Expand Down
6 changes: 4 additions & 2 deletions packages/site/app/collectivites/[code]/[name]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ const DetailCollectivite = async ({params}: {params: {code: string}}) => {
{/* Colonne de droite avec niveau de labellisation et bloc de connexion */}
<div
className={classNames(
'col-span-full md:col-span-4 lg:col-span-3 md:max-lg:order-last flex flex-col md:gap-10 xl:gap-12',
'col-span-full md:col-span-4 lg:col-span-3 lg:row-span-2 md:max-lg:order-last flex flex-col md:gap-10 xl:gap-12',
{'lg:order-last': !collectiviteData.labellisee},
)}
>
Expand Down Expand Up @@ -109,8 +109,10 @@ const DetailCollectivite = async ({params}: {params: {code: string}}) => {
<ContenuCollectivite contenu={strapiData.contenu} />
) : strapiDefaultData ? (
<IndicateursCollectivite
defaultData={strapiDefaultData}
defaultData={strapiDefaultData.indicateurs}
indicateurs={{
artificialisation_sols:
collectiviteData.indicateur_artificialisation,
gaz_effet_serre: collectiviteData.indicateurs_gaz_effet_serre,
}}
/>
Expand Down
58 changes: 41 additions & 17 deletions packages/site/app/collectivites/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import {StrapiItem} from 'src/strapi/StrapiItem';

export type Indicateurs =
Database['public']['Tables']['indicateur_resultat_import']['Row'];
export type IndicateurArtificialisation =
Database['public']['Tables']['indicateur_artificialisation']['Row'];

type Collectivite = {
collectivite_id: number;
Expand All @@ -30,13 +32,14 @@ type Collectivite = {
eci_etoiles: EtoilesLabel;
eci_score_realise: number;
eci_score_programme: number;
indicateurs_gaz_effet_serre: Indicateurs[];
indicateurs_gaz_effet_serre: Indicateurs[] | null;
indicateur_artificialisation: IndicateurArtificialisation | null;
};

export const fetchCollectivite = async (code_siren_insee: string) => {
const {data, error} = await supabase
.from('site_labellisation')
.select('*, indicateurs_gaz_effet_serre')
.select('*, indicateurs_gaz_effet_serre, indicateur_artificialisation')
.match({code_siren_insee});

if (error) {
Expand Down Expand Up @@ -138,12 +141,15 @@ export const getStrapiDefaultData = async () => {
['populate[0]', 'seo'],
['populate[1]', 'seo.metaImage'],
['populate[2]', 'couverture'],
['populate[3]', 'gaz_effet_serre'],
['populate[4]', 'gaz_effet_serre.illustration_encadre'],
['populate[3]', 'artificialisation_sols'],
['populate[4]', 'artificialisation_sols.illustration_encadre'],
['populate[5]', 'gaz_effet_serre'],
['populate[6]', 'gaz_effet_serre.illustration_encadre'],
]);

if (data) {
const seo = data.attributes.seo;
const artificialisation_sols = data.attributes.artificialisation_sols;
const gaz_effet_serre = data.attributes.gaz_effet_serre;

const metaImage =
Expand Down Expand Up @@ -179,19 +185,37 @@ export const getStrapiDefaultData = async () => {
undefined,
cta: (data.attributes.connexionn_cta as unknown as string) ?? undefined,
},
gaz_effet_serre: gaz_effet_serre
? {
titre: gaz_effet_serre.titre as unknown as string,
description: gaz_effet_serre.description as unknown as string,
titre_encadre: gaz_effet_serre.titre_encadre as unknown as string,
description_encadre:
gaz_effet_serre.description_encadre as unknown as string,
illustration_encadre: gaz_effet_serre.illustration_encadre
.data as unknown as StrapiItem,
details:
(gaz_effet_serre.details as unknown as string) ?? undefined,
}
: undefined,
indicateurs: {
artificialisation_sols: artificialisation_sols
? {
titre: artificialisation_sols.titre as unknown as string,
description:
artificialisation_sols.description as unknown as string,
titre_encadre:
artificialisation_sols.titre_encadre as unknown as string,
description_encadre:
artificialisation_sols.description_encadre as unknown as string,
illustration_encadre: artificialisation_sols.illustration_encadre
.data as unknown as StrapiItem,
details:
(artificialisation_sols.details as unknown as string) ??
undefined,
}
: undefined,
gaz_effet_serre: gaz_effet_serre
? {
titre: gaz_effet_serre.titre as unknown as string,
description: gaz_effet_serre.description as unknown as string,
titre_encadre: gaz_effet_serre.titre_encadre as unknown as string,
description_encadre:
gaz_effet_serre.description_encadre as unknown as string,
illustration_encadre: gaz_effet_serre.illustration_encadre
.data as unknown as StrapiItem,
details:
(gaz_effet_serre.details as unknown as string) ?? undefined,
}
: undefined,
},
};
} else return null;
};
10 changes: 6 additions & 4 deletions packages/site/components/charts/DonutChartWithLegend.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,12 @@ const DonutChartWithLegend = ({
data,
...otherProps
}: DonutChartWithLegendProps) => {
let dataWithColor = data.map((d, index) => ({
...d,
color: d.color ? d.color : defaultColors[index % defaultColors.length],
}));
let dataWithColor = data
.filter(d => d.value !== 0)
.map((d, index) => ({
...d,
color: d.color ? d.color : defaultColors[index % defaultColors.length],
}));

return (
<div>
Expand Down
Loading

0 comments on commit 6dc1984

Please sign in to comment.