Skip to content

Commit 585a98f

Browse files
authored
Merge pull request #68 from IGNF/dev
Dev
2 parents 93939c3 + 59ac755 commit 585a98f

File tree

21 files changed

+843
-501
lines changed

21 files changed

+843
-501
lines changed

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,7 @@ config-*.ini
1414
test.ini
1515

1616
# Dossiers node_modules
17-
node_modules/
17+
node_modules/
18+
19+
#Build
20+
dist/

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ WORKDIR /app
55
# Installation des dépendances
66
COPY package.json .
77
COPY package-lock.json .
8-
RUN npm ci
8+
RUN npm ci --loglevel verbose
99

1010
# Vérifier que les dépendances sont installées
1111
RUN npm list --depth=0

package-lock.json

Lines changed: 423 additions & 413 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/assets/@types/types.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
export type Dalle = {
2+
id: string;
3+
name: string;
4+
url: string;
5+
timestamp: number;
6+
metadata?: Record<string, any>;
7+
isHovered?: boolean;
8+
};
9+
10+
export type FilterDate = { dateStart: number | null; dateEnd: number };
11+
12+
13+
export type File = { url: string; name: string };

src/components/features/Layout/AppFooter.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {
55
FooterConsentManagementItem,
66
FooterPersonalDataPolicyItem,
77
} from "../../../config/consentMangement";
8-
import React from "react";
98
import { createPortal } from "react-dom";
109
import { Button } from "@codegouvfr/react-dsfr/Button";
1110

@@ -119,7 +118,7 @@ const AppFooter = () => {
119118
</>
120119
}
121120
contentDescription="
122-
Cartes.gouv.fr est développé par l'Institut national de l'information géographique et forestière (IGN) et ses partenaires. Le site s'appuie sur la Géoplateforme, la nouvelle infrastructure publique, ouverte et collaborative des données géographiques.
121+
Cartes.gouv.fr est le service public des cartes et données du territoire français. Porté par l'IGN et ses partenaires, il offre à tous un accès à la référence de la cartographie publique et permet à chacun de créer, d'héberger et de publier ses propres données et représentations.
123122
"
124123
bottomItems={[
125124
{

src/components/features/Map.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,23 @@ const route = getRouteApi("/telechargement/$downloadUrl");
1515
const MapComponent = () => {
1616
const { downloadUrl } = route.useParams();
1717

18-
const selectedDalle = useDalleStore((state) => state.selectedProduits);
1918
const addProduit = useDalleStore((state) => state.addProduit);
2019
const isProduitSelected = useDalleStore((state) => state.isProduitSelected);
2120
const removeDalle = useDalleStore((state) => state.removeProduit);
2221
const addProduitLayer = useDalleStore((state) => state.addProduitLayer);
22+
const addChantierLayer = useDalleStore((state) => state.addChantierLayer);
2323
const setIsMetadata = useDalleStore((state) => state.setIsMetadata);
2424

2525
const mapContainerRef = useRef<HTMLDivElement>(null);
2626

27-
const mapInstance = useMap(
27+
useMap(
2828
mapContainerRef,
2929
downloadUrl,
3030
addProduit,
3131
isProduitSelected,
3232
removeDalle,
3333
addProduitLayer,
34+
addChantierLayer,
3435
setIsMetadata
3536
);
3637

src/components/features/MenuCompenents/DownloadModal.tsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { Select } from "@codegouvfr/react-dsfr/Select";
55
import { useState, useEffect } from "react";
66
import { RadioButtons } from "@codegouvfr/react-dsfr/RadioButtons";
77
import Button from "@codegouvfr/react-dsfr/Button";
8-
import { formatBytes } from "../../../utils/formatters";
8+
import { formatBytes } from "../../../utils/formatters";
99

1010
export const downloadModal = createModal({
1111
id: "download-modal",
@@ -31,12 +31,11 @@ const DownloadModal = () => {
3131
} catch (e) {
3232
console.error(
3333
`Erreur lors de la récupération de la taille pour ${dalle.name}:`,
34-
e
34+
e,
3535
);
3636
}
3737
}
3838
setTotalSize(sum);
39-
4039
};
4140
resolveSizes();
4241
}, [selectedDalles]);
@@ -45,7 +44,7 @@ const DownloadModal = () => {
4544
e.preventDefault();
4645
if (!downloadMethod) {
4746
alert(
48-
"Veuillez sélectionner une option et une méthode de téléchargement"
47+
"Veuillez sélectionner une option et une méthode de téléchargement",
4948
);
5049
return;
5150
}
@@ -74,7 +73,6 @@ const DownloadModal = () => {
7473

7574
const count = selectedDalles.length;
7675

77-
7876
return (
7977
<downloadModal.Component title="Télécharger" iconId="fr-icon-download-fill">
8078
<form className="download-modal-form" onSubmit={handleSubmit}>
@@ -90,7 +88,7 @@ const DownloadModal = () => {
9088
}
9189

9290
<div className="download-modal-content">
93-
{isMetadata && (
91+
{/* {isMetadata && (
9492
<div className="download-options">
9593
<Select
9694
label="Donnée associée"
@@ -108,7 +106,7 @@ const DownloadModal = () => {
108106
<option value="4">Option 4</option>
109107
</Select>
110108
</div>
111-
)}
109+
)} */}
112110

113111
<div className="download-method">
114112
<RadioButtons

src/components/features/MenuCompenents/FilterComponents/Filter.css

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,29 @@
11
filter {
22
display: flex;
3-
flex-direction: column;
4-
align-items: center;
5-
gap: 16px;
6-
align-self: stretch;
3+
width: 28.1875rem;
4+
height: 37.75rem;
5+
padding: 1rem;
6+
flex-direction: column;
7+
align-items: flex-start;
8+
gap: 0.5rem;
9+
}
10+
.filter-back-button {
11+
display: flex;
12+
padding: 0.25rem 0.75rem 0.25rem 0.25rem;
13+
margin-top: auto;
14+
margin-bottom: 0.7rem;
15+
justify-content: center;
16+
align-items: center;
17+
gap: 0.5rem;
718
}
819
.filter-header {
920
display: flex;
10-
width: 418px;
11-
height: 39px;
21+
height: 2.4375rem;
1222
justify-content: space-between;
1323
align-items: flex-end;
24+
align-self: stretch;
25+
margin-right: 0.5rem;
26+
margin-left: 0.5rem;
1427
}
1528

1629
.filter-label {
@@ -25,3 +38,29 @@ align-self: stretch;
2538
font-weight: 700;
2639
line-height: 32px; /* 133.333% */
2740
}
41+
42+
.filter-date {
43+
display: flex;
44+
flex-direction: row;
45+
justify-content: space-between;
46+
gap: 1rem;
47+
margin-left: 1rem;
48+
margin-right: 1rem;
49+
}
50+
51+
/* Largeur fixe en desktop */
52+
.filter-date > .fr-input-group {
53+
width: 17rem;
54+
}
55+
56+
/* Responsive : en-dessous de 768px, on passe en colonne */
57+
@media (max-width: 768px) {
58+
.filter-date {
59+
flex-direction: column;
60+
}
61+
62+
/* largeur 100% en mobile */
63+
.filter-date > .fr-input-group {
64+
width: 100%;
65+
}
66+
}

src/components/features/MenuCompenents/FilterComponents/Filter.jsx

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,52 @@
1-
import React from "react";
21
import { Button } from "@codegouvfr/react-dsfr/Button";
3-
import { Alert } from "@codegouvfr/react-dsfr/Alert";
42
import "./Filter.css";
53
import FilterDate from "./FilterDate";
4+
import { useFilterStore } from "../../../../hooks/store/useFilterStore";
5+
import { useState } from "react";
6+
import useDalleStore from "../../../../hooks/store/useDalleStore";
67

78
const Filter = ({ onClose } = {}) => {
9+
10+
const isFiltered = useFilterStore((state) => state.isFiltered);
11+
const resetFilter = useFilterStore((state) => state.resetFilter);
12+
const filter = useFilterStore((state) => state.filter);
13+
const filteredProduits = useDalleStore((state) => state.filteredProduits);
14+
const [resetKey, setResetKey] = useState(0);
15+
const handleReset = () => {
16+
resetFilter(); // logique store si nécessaire
17+
18+
filteredProduits({ dateStart: null, dateEnd: Date.now() }); // re-applique les filtres
19+
setResetKey((k) => k + 1); // force le reset du composant enfant
20+
};
21+
22+
823
return (
924
<div className="filter">
1025

11-
{onClose ? (
26+
<Button
27+
iconId="fr-icon-arrow-left-line"
28+
iconPosition="left"
29+
priority="tertiary no outline"
30+
size="medium"
31+
onClick={onClose}
32+
className="filter-back-button">
33+
Retour
34+
</Button>
35+
36+
<div className="filter-header">
37+
<h5>Filtrer</h5>
1238
<Button
13-
iconId="fr-icon-arrow-left-line"
1439
iconPosition="left"
15-
priority="tertiary no outline"
40+
priority="secondary"
1641
size="medium"
17-
onClick={onClose}>
18-
Retour
42+
onClick={handleReset}>
43+
Réinitialiser
1944
</Button>
20-
) : null}
21-
22-
<div className="filter-body" style={{ marginTop: 12 }}>
23-
<strong>Aucun filtre disponible</strong>
24-
<div style={{ marginTop: 6 }}>
25-
Pour cette donnée, aucun critère de filtrage n'est proposé pour l'instant.
26-
</div>
27-
28-
2945
</div>
46+
<>
47+
<FilterDate key={resetKey} />
48+
</>
49+
3050
</div>
3151
);
3252
};

src/components/features/MenuCompenents/FilterComponents/FilterDate.jsx

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,47 @@
1-
import { Range } from "@codegouvfr/react-dsfr/Range";
1+
import { Input } from "@codegouvfr/react-dsfr/Input";
2+
import { useFilterStore } from "../../../../hooks/store/useFilterStore"
3+
import { use, useEffect, useState } from "react";
4+
import { useDalleStore } from "../../../../hooks/store/useDalleStore";
25

36
const FilterDate = () => {
7+
8+
const filter = useFilterStore((state) => state.filter);
9+
const selectedProduits = useDalleStore((state) => state.selectedProduits);
10+
const filteredProduits = useDalleStore((state) => state.filteredProduits);
11+
const setFilterOnChange = useFilterStore((state) => state.setFilterOnChange);
12+
const [dateStart, setDateStart] = useState(filter.dateStart);
13+
const [dateEnd, setDateEnd] = useState(filter.dateEnd);
14+
15+
416
return (
5-
<Range
6-
double
7-
label="date"
8-
min="2000-01-01"
9-
max="2024-12-31"
10-
/>
17+
<div className="filter-date">
18+
<Input
19+
nativeInputProps={{
20+
type: 'date',
21+
22+
onChange: (e) => {
23+
setDateStart(new Date(e.target.value).getTime());
24+
filteredProduits({ dateStart: new Date(e.target.value).getTime(), dateEnd: dateEnd });
25+
setFilterOnChange({ dateStart: new Date(e.target.value).getTime(), dateEnd: dateEnd });
26+
},
27+
value: dateStart ? new Date(dateStart).toISOString().slice(0, 10) : null,
28+
}}
29+
label="Date de début"
30+
/>
31+
32+
33+
<Input
34+
nativeInputProps={{
35+
type: 'date',
36+
onChange: (e) => {
37+
setDateEnd(new Date(e.target.value).getTime());
38+
filteredProduits({ dateStart: dateStart, dateEnd: new Date(e.target.value).getTime() });
39+
setFilterOnChange({ dateStart: dateStart, dateEnd: new Date(e.target.value).getTime() });
40+
},
41+
value: new Date(dateEnd).toISOString().slice(0, 10)
42+
}}
43+
label="Date de fin" />
44+
</div>
1145
);
1246
};
1347

0 commit comments

Comments
 (0)