@@ -6,6 +6,7 @@ import { InputTextModule } from "primeng/inputtext";
66import { SkeletonModule } from "primeng/skeleton" ;
77import { FloatLabelModule } from "primeng/floatlabel" ;
88import * as L from "leaflet" ;
9+ import { AntPath , antPath } from "leaflet-ant-path" ;
910import { TableModule } from "primeng/table" ;
1011import {
1112 Trip ,
@@ -60,6 +61,9 @@ export class TripComponent implements AfterViewInit {
6061 currency$ : Observable < string > ;
6162
6263 trip : Trip | undefined ;
64+ tripMapAntLayer : undefined ;
65+ tripMapAntLayerDayID : number | undefined ;
66+
6367 totalPrice : number = 0 ;
6468 dayStatsCache = new Map < number , { price : number ; places : number } > ( ) ;
6569
@@ -137,7 +141,7 @@ export class TripComponent implements AfterViewInit {
137141 this . setPlacesAndMarkers ( ) ;
138142
139143 this . map . setView ( [ 48.107 , - 2.988 ] ) ;
140- this . setMapBounds ( ) ;
144+ this . resetMapBounds ( ) ;
141145 } ,
142146 } ) ;
143147 }
@@ -204,7 +208,7 @@ export class TripComponent implements AfterViewInit {
204208 } ) ;
205209 }
206210
207- setMapBounds ( ) {
211+ resetMapBounds ( ) {
208212 if ( ! this . places . length ) return ;
209213 this . map . fitBounds (
210214 this . places . map ( ( p ) => [ p . lat , p . lng ] ) ,
@@ -224,14 +228,14 @@ export class TripComponent implements AfterViewInit {
224228 ) ?? 0 ;
225229 }
226230
227- resetHighlightMarker ( ) {
231+ resetPlaceHighlightMarker ( ) {
228232 if ( this . hoveredElement ) {
229233 this . hoveredElement . classList . remove ( "listHover" ) ;
230234 this . hoveredElement = undefined ;
231235 }
232236 }
233237
234- highlightMarker ( lat : number , lng : number ) {
238+ placeHighlightMarker ( lat : number , lng : number ) {
235239 if ( this . hoveredElement ) {
236240 this . hoveredElement . classList . remove ( "listHover" ) ;
237241 this . hoveredElement = undefined ;
@@ -266,13 +270,61 @@ export class TripComponent implements AfterViewInit {
266270 }
267271 }
268272
273+ toggleTripDayHighlightPath ( day_id : number ) {
274+ // Click on the currently displayed day: remove
275+ if ( this . tripMapAntLayerDayID == day_id ) {
276+ this . map . removeLayer ( this . tripMapAntLayer ) ;
277+ this . tripMapAntLayerDayID = undefined ;
278+ this . resetMapBounds ( ) ;
279+ return ;
280+ }
281+
282+ let index = this . trip ?. days . findIndex ( ( d ) => d . id === day_id ) ;
283+ if ( ! this . trip || index == - 1 ) return ;
284+
285+ const data = this . trip . days [ index as number ] . items ;
286+ data . sort ( ( a , b ) => a . time . localeCompare ( b . time ) ) ;
287+ const coords = data
288+ . map ( ( item ) => {
289+ if ( item . lat && item . lng ) return [ item . lat , item . lng ] ;
290+ if ( item . place && item . place ) return [ item . place . lat , item . place . lng ] ;
291+ return undefined ;
292+ } )
293+ . filter ( ( n ) : n is number [ ] => n !== undefined ) ;
294+ this . map . fitBounds ( coords , { padding : [ 30 , 30 ] } ) ;
295+
296+ const path = antPath ( coords , {
297+ delay : 400 ,
298+ dashArray : [ 10 , 20 ] ,
299+ weight : 5 ,
300+ color : "#0000FF" ,
301+ pulseColor : "#FFFFFF" ,
302+ paused : false ,
303+ reverse : false ,
304+ hardwareAccelerated : true ,
305+ } ) ;
306+
307+ if ( this . tripMapAntLayer ) {
308+ this . map . removeLayer ( this . tripMapAntLayer ) ;
309+ this . tripMapAntLayerDayID = undefined ;
310+ }
311+
312+ // UX
313+ setTimeout ( ( ) => {
314+ this . map . addLayer ( path ) ;
315+ } , 200 ) ;
316+
317+ this . tripMapAntLayer = path ;
318+ this . tripMapAntLayerDayID = day_id ;
319+ }
320+
269321 onRowClick ( item : FlattenedTripItem ) {
270322 if ( this . selectedItem && this . selectedItem . id === item . id ) {
271323 this . selectedItem = undefined ;
272- this . resetHighlightMarker ( ) ;
324+ this . resetPlaceHighlightMarker ( ) ;
273325 } else {
274326 this . selectedItem = item ;
275- if ( item . lat && item . lng ) this . highlightMarker ( item . lat , item . lng ) ;
327+ if ( item . lat && item . lng ) this . placeHighlightMarker ( item . lat , item . lng ) ;
276328 }
277329 }
278330
@@ -480,7 +532,7 @@ export class TripComponent implements AfterViewInit {
480532 next : ( trip ) => {
481533 this . trip = trip ;
482534 this . setPlacesAndMarkers ( ) ;
483- this . setMapBounds ( ) ;
535+ this . resetMapBounds ( ) ;
484536 } ,
485537 } ) ;
486538 } ,
@@ -543,7 +595,10 @@ export class TripComponent implements AfterViewInit {
543595 data : {
544596 places : this . places ,
545597 days : this . trip ?. days ,
546- item : item ,
598+ item : {
599+ ...item ,
600+ status : item . status ? ( item . status as TripStatus ) . label : null ,
601+ } ,
547602 } ,
548603 breakpoints : {
549604 "640px" : "90vw" ,
@@ -582,6 +637,9 @@ export class TripComponent implements AfterViewInit {
582637
583638 const updatedPrice = - ( item . price || 0 ) + ( it . price || 0 ) ;
584639 this . updateTotalPrice ( updatedPrice ) ;
640+
641+ if ( this . tripMapAntLayerDayID == item . day_id )
642+ this . toggleTripDayHighlightPath ( item . day_id ) ;
585643 } ,
586644 } ) ;
587645 } ,
@@ -621,7 +679,7 @@ export class TripComponent implements AfterViewInit {
621679 ) ;
622680 this . dayStatsCache . delete ( item . day_id ) ;
623681 this . selectedItem = undefined ;
624- this . resetHighlightMarker ( ) ;
682+ this . resetPlaceHighlightMarker ( ) ;
625683 }
626684 } ,
627685 } ) ;
0 commit comments