diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts
index a265667..3e4cb1c 100644
--- a/src/app/app.routes.ts
+++ b/src/app/app.routes.ts
@@ -3,9 +3,11 @@ import { AuthGuard } from './auth.guard';
import { HomePageComponent } from './components/home-page/home-page.component';
import { LeafletMapComponent } from './components/leaflet-map/leaflet-map.component';
import { NotFoundComponent } from './components/not-found/not-found.component';
+import { TimelineComponent } from './components/timeline/timeline.component';
export const routes: Routes = [
{ path: '', component: HomePageComponent },
{ path: 'map', component: LeafletMapComponent, canActivate: [AuthGuard] },
+ { path: 'timeline', component: TimelineComponent, canActivate: [AuthGuard] },
{ path: '**', component: NotFoundComponent },
];
diff --git a/src/app/components/add-pin-popup/add-pin-popup.component.html b/src/app/components/add-pin-popup/add-pin-popup.component.html
index d1dac5d..18cb5ba 100644
--- a/src/app/components/add-pin-popup/add-pin-popup.component.html
+++ b/src/app/components/add-pin-popup/add-pin-popup.component.html
@@ -26,12 +26,12 @@
'opacity-0 scale-50 pointer-events-none': !isPinModalOpen,
'opacity-100 scale-100': isPinModalOpen
}"
- class="fixed top-0 right-0 left-0 z-50 flex justify-center items-center w-full h-full transition-transform duration-300 ease-in-out"
+ class="fixed top-0 right-0 left-0 z-50 flex justify-center items-center w-full h-full transition-transform duration-300 ease-in-out overflow-y-auto"
>
diff --git a/src/app/components/add-pin-popup/add-pin-popup.component.ts b/src/app/components/add-pin-popup/add-pin-popup.component.ts
index cb7e1a0..4c47738 100644
--- a/src/app/components/add-pin-popup/add-pin-popup.component.ts
+++ b/src/app/components/add-pin-popup/add-pin-popup.component.ts
@@ -15,11 +15,11 @@ import {
} from 'rxjs/operators';
import { AutocompleteService } from '../../services/auto-complete/auto-complete.service';
import { ExifService } from '../../services/exif/exif.service';
+import { ImageService } from '../../services/image/image.service';
import { MapReloadService } from '../../services/map-reload/map-reload.service';
+import { ModalService } from '../../services/modal/modal.service';
import { PinService } from '../../services/pin/pin.service';
import { DragDropComponent } from '../drag-drop/drag-drop.component';
-import { ModalService } from '../../services/modal/modal.service';
-import { ImageService } from '../../services/image/image.service';
@Component({
selector: 'app-add-pin-popup',
@@ -51,6 +51,7 @@ export class AddPinPopupComponent implements OnInit {
description: new FormControl(''),
location: new FormControl(''),
files: new FormControl(null),
+ date: new FormControl(''),
});
}
@@ -159,6 +160,7 @@ export class AddPinPopupComponent implements OnInit {
const pinData = {
...this.form.value,
files: this.files,
+ date: this.form.get('date')?.value || null,
};
console.log('Files : ' + JSON.stringify(this.files));
diff --git a/src/app/components/edit-pin-popup/edit-pin-popup.component.html b/src/app/components/edit-pin-popup/edit-pin-popup.component.html
index c21d4b5..d1addd5 100644
--- a/src/app/components/edit-pin-popup/edit-pin-popup.component.html
+++ b/src/app/components/edit-pin-popup/edit-pin-popup.component.html
@@ -43,12 +43,12 @@
'opacity-0 scale-50 pointer-events-none': !isPinModalOpen,
'opacity-100 scale-100': isPinModalOpen
}"
- class="fixed top-0 right-0 left-0 z-50 flex justify-center items-center w-full h-full transition-transform duration-300 ease-in-out"
+ class="fixed top-0 right-0 left-0 z-50 flex justify-center items-center w-full h-full transition-transform duration-300 ease-in-out overflow-y-auto"
>
diff --git a/src/app/components/edit-pin-popup/edit-pin-popup.component.ts b/src/app/components/edit-pin-popup/edit-pin-popup.component.ts
index b70a1c4..f56b6d7 100644
--- a/src/app/components/edit-pin-popup/edit-pin-popup.component.ts
+++ b/src/app/components/edit-pin-popup/edit-pin-popup.component.ts
@@ -66,6 +66,7 @@ export class EditPinPopupComponent implements OnInit, AfterViewInit, OnDestroy {
description: new FormControl(''),
location: new FormControl(''),
files: new FormControl(null),
+ date: new FormControl(''),
});
}
@@ -85,6 +86,7 @@ export class EditPinPopupComponent implements OnInit, AfterViewInit, OnDestroy {
title: this.pin?.title || '',
description: this.pin?.description || '',
location: "Chargement de l'adresse...",
+ date: this.pin?.date || '',
});
// Vérifier si nous avons des coordonnées valides dans pin.location
@@ -251,6 +253,7 @@ export class EditPinPopupComponent implements OnInit, AfterViewInit, OnDestroy {
...this.form.value,
files: this.files,
user_id: this.pin.user_id,
+ date: this.form.get('date')?.value || null,
};
this.pinService.updatePin(this.pin.id, pinData).subscribe(() => {
diff --git a/src/app/components/leaflet-map/leaflet-map.component.html b/src/app/components/leaflet-map/leaflet-map.component.html
index 84d3ae6..7b41c94 100644
--- a/src/app/components/leaflet-map/leaflet-map.component.html
+++ b/src/app/components/leaflet-map/leaflet-map.component.html
@@ -1,48 +1,46 @@
-
+
-
-
-
-
+
+
+
-
-
+
+
+
-
diff --git a/src/app/components/navbar/navbar.component.html b/src/app/components/navbar/navbar.component.html
index 7c3eebe..0d266d1 100644
--- a/src/app/components/navbar/navbar.component.html
+++ b/src/app/components/navbar/navbar.component.html
@@ -169,16 +169,16 @@
>
AccueilCarte
CarteTimeline
diff --git a/src/app/components/navbar/navbar.component.ts b/src/app/components/navbar/navbar.component.ts
index f53de85..3f9ec08 100644
--- a/src/app/components/navbar/navbar.component.ts
+++ b/src/app/components/navbar/navbar.component.ts
@@ -38,7 +38,7 @@ import { FriendPageComponent } from '../friend-page/friend-page.component';
templateUrl: './navbar.component.html',
})
export class NavbarComponent implements OnInit {
- isHome: boolean = false;
+ isTimeline: boolean = false;
isSearchOpen: boolean = false;
isNavbarOpen: boolean = false;
@@ -75,10 +75,10 @@ export class NavbarComponent implements OnInit {
this.pins = pins;
});
- this.isHome = this.router.url === '/';
+ this.isTimeline = this.router.url === '/timeline';
this.router.events.subscribe((event) => {
if (event instanceof NavigationEnd) {
- this.isHome = event.url === '/';
+ this.isTimeline = event.url === '/timeline';
}
});
diff --git a/src/app/components/timeline/timeline.component.html b/src/app/components/timeline/timeline.component.html
new file mode 100644
index 0000000..ba8b851
--- /dev/null
+++ b/src/app/components/timeline/timeline.component.html
@@ -0,0 +1,73 @@
+
+
+
+
+ 0"
+ class="relative mx-auto max-w-3xl py-10 px-4"
+>
+
+
+
+
+
+
+
+ {{ i + 1 }}
+
+
+
+
+
+ {{ pin.date ? (pin.date | date : "dd/MM/yyyy") : "Date inconnue" }}
+
+
+ {{ pin.title || "Titre inconnu" }}
+
+
+ {{ pin.description || "Aucune description" }}
+
+
+
0">
+
+
+
+ Aucune image
+
+
+
+
+
+
+
+ Aucun souvenir à afficher pour le moment.
+
diff --git a/src/app/components/timeline/timeline.component.ts b/src/app/components/timeline/timeline.component.ts
new file mode 100644
index 0000000..6b93b32
--- /dev/null
+++ b/src/app/components/timeline/timeline.component.ts
@@ -0,0 +1,47 @@
+import { CommonModule } from '@angular/common';
+import { Component, OnInit } from '@angular/core';
+import { DomSanitizer, SafeUrl } from '@angular/platform-browser';
+import { Pin } from '../../model/Pin';
+import { ImageService } from '../../services/image/image.service';
+import { PinService } from '../../services/pin/pin.service';
+
+@Component({
+ selector: 'app-timeline',
+ standalone: true,
+ imports: [CommonModule],
+ templateUrl: './timeline.component.html',
+})
+export class TimelineComponent implements OnInit {
+ pins: Pin[] = [];
+ imageUrls: SafeUrl[][] = [];
+ loading = true;
+
+ constructor(
+ private pinService: PinService,
+ private imageService: ImageService,
+ private sanitizer: DomSanitizer
+ ) {}
+
+ ngOnInit(): void {
+ this.pinService.getPins().subscribe((pins: Pin[]) => {
+ this.pins = pins
+ .filter((pin) => !!pin.date)
+ .sort((a, b) => (a.date! > b.date! ? 1 : -1));
+ this.imageUrls = this.pins.map(() => []); // initialise le tableau d'images
+
+ this.pins.forEach((pin, index) => {
+ if (pin.files && pin.files.length > 0) {
+ pin.files.forEach((imageId) => {
+ this.imageService.getImage(imageId).subscribe((blob) => {
+ const objectUrl = URL.createObjectURL(blob);
+ const safeUrl = this.sanitizer.bypassSecurityTrustUrl(objectUrl);
+ this.imageUrls[index].push(safeUrl);
+ });
+ });
+ }
+ });
+
+ this.loading = false;
+ });
+ }
+}
diff --git a/src/app/model/Pin.ts b/src/app/model/Pin.ts
index cc6a067..0e04110 100644
--- a/src/app/model/Pin.ts
+++ b/src/app/model/Pin.ts
@@ -5,4 +5,5 @@ export interface Pin {
files: string[];
description: string;
user_id: string;
+ date?: string;
}
diff --git a/src/app/services/pin/pin.service.ts b/src/app/services/pin/pin.service.ts
index db66f3c..4d11d82 100644
--- a/src/app/services/pin/pin.service.ts
+++ b/src/app/services/pin/pin.service.ts
@@ -34,6 +34,7 @@ export class PinService {
description: string;
location: string;
files: string[];
+ date: string;
}) {
const url = `${this.apiURL}/pin/add`;
const headers = new HttpHeaders({
@@ -51,6 +52,7 @@ export class PinService {
location: coords,
files: pin.files,
user_id: '',
+ date: pin.date,
},
{ headers }
);