Skip to content

Commit d01498c

Browse files
authored
Merge branch 'main' into fix/new-agencies-should-appear-in-the-dashboard
2 parents 87ce6b1 + 84a9704 commit d01498c

File tree

10 files changed

+1466
-573
lines changed

10 files changed

+1466
-573
lines changed

package-lock.json

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

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@
8585
]
8686
},
8787
"devDependencies": {
88-
"@babel/preset-env": "^7.23.9",
88+
"@babel/preset-env": "^7.24.7",
8989
"@babel/preset-react": "^7.24.1",
9090
"@eslint/eslintrc": "^3.0.2",
9191
"@eslint/js": "~8.57.0",
@@ -97,7 +97,7 @@
9797
"@storybook/addon-interactions": "^7.6.17",
9898
"@storybook/addon-links": "^7.6.17",
9999
"@storybook/addon-onboarding": "^1.0.11",
100-
"@storybook/blocks": "^7.5.3",
100+
"@storybook/blocks": "^8.1.6",
101101
"@storybook/react": "^7.5.3",
102102
"@storybook/react-vite": "^8.0.5",
103103
"@storybook/testing-library": "^0.2.2",

src/pages/components/map-related/MapContent.tsx

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { Marker, Polyline, Popup, TileLayer } from 'react-leaflet'
2-
import { Icon, IconOptions } from 'leaflet'
1+
import { useRef } from 'react'
2+
import { Marker, Polyline, Popup, TileLayer, useMap } from 'react-leaflet'
3+
import { Icon, IconOptions, Marker as LeafletMarker } from 'leaflet'
34
import { useAgencyList } from 'src/api/agencyList'
45
import { busIcon, busIconPath } from '../utils/BusIcon'
56
import { BusToolTip } from './MapLayers/BusToolTip'
@@ -8,12 +9,13 @@ import '../../Map.scss'
89
import { MapProps } from './map-types'
910
import { useRecenterOnDataChange } from './useRecenterOnDataChange'
1011
import { MapIndex } from './MapIndex'
12+
import MapFooterButtons from './MapFooterButtons/MapFooterButtons'
1113

12-
export function MapContent({ positions, plannedRouteStops }: MapProps) {
14+
export function MapContent({ positions, plannedRouteStops, showNavigationButtons }: MapProps) {
1315
useRecenterOnDataChange({ positions, plannedRouteStops })
14-
16+
const markerRef = useRef<{ [key: number]: LeafletMarker | null }>({})
17+
const map = useMap()
1518
const agencyList = useAgencyList()
16-
1719
const getIcon = (path: string, width: number = 10, height: number = 10): Icon<IconOptions> => {
1820
return new Icon<IconOptions>({
1921
iconUrl: path,
@@ -28,6 +30,16 @@ export function MapContent({ positions, plannedRouteStops }: MapProps) {
2830
const actualRouteStopMarker = getIcon(actualRouteStopMarkerPath, 20, 20)
2931
const plannedRouteStopMarker = getIcon(plannedRouteStopMarkerPath, 20, 25)
3032

33+
const navigateMarkers = (positionId: number) => {
34+
const loc = positions[positionId]?.loc
35+
if (!map || !loc) return
36+
const marker = markerRef?.current && markerRef?.current[positionId]
37+
if (marker) {
38+
map.flyTo(loc, map.getZoom())
39+
marker.openPopup()
40+
}
41+
}
42+
3143
return (
3244
<>
3345
<TileLayer
@@ -56,9 +68,21 @@ export function MapContent({ positions, plannedRouteStops }: MapProps) {
5668
})
5769
: actualRouteStopMarker
5870
return (
59-
<Marker position={pos.loc} icon={icon} key={i}>
71+
<Marker
72+
ref={(ref) => (markerRef.current[i] = ref)}
73+
position={pos.loc}
74+
icon={icon}
75+
key={i}>
6076
<Popup minWidth={300} maxWidth={700}>
61-
<BusToolTip position={pos} icon={busIconPath(pos.operator!)} />
77+
<BusToolTip position={pos} icon={busIconPath(pos.operator!)}>
78+
{showNavigationButtons && (
79+
<MapFooterButtons
80+
index={i}
81+
positions={positions}
82+
navigateMarkers={navigateMarkers}
83+
/>
84+
)}
85+
</BusToolTip>
6286
</Popup>
6387
</Marker>
6488
)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
.map-footer-buttons {
2+
display: flex;
3+
justify-content: space-between;
4+
5+
.disabled {
6+
pointer-events: none;
7+
opacity: 0.5;
8+
}
9+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { LeftOutlined, RightOutlined } from '@ant-design/icons'
2+
import { Point } from 'src/pages/timeBasedMap'
3+
import './MapFooterButtons.scss'
4+
5+
type TMapFooterButtons = {
6+
index: number
7+
positions: Point[]
8+
navigateMarkers: (id: number) => void
9+
}
10+
11+
function MapFooterButtons({ index, positions, navigateMarkers }: TMapFooterButtons) {
12+
const rightStep = index + 1
13+
const leftStep = index - 1
14+
15+
const checkIfValidStep = (i: number) => {
16+
return Boolean(positions.at(i))
17+
}
18+
19+
return (
20+
<div className="map-footer-buttons">
21+
<RightOutlined
22+
title={'right-chevron'}
23+
className={`${checkIfValidStep(rightStep) ? '' : 'disabled'}`}
24+
onClick={() => navigateMarkers(rightStep)}
25+
/>
26+
<LeftOutlined
27+
title={'left-chevron'}
28+
className={`${checkIfValidStep(leftStep) ? '' : 'disabled'}`}
29+
onClick={() => navigateMarkers(leftStep)}
30+
/>
31+
</div>
32+
)
33+
}
34+
35+
export default MapFooterButtons

src/pages/components/map-related/MapLayers/BusToolTip.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect, useState } from 'react'
1+
import { ReactNode, useEffect, useState } from 'react'
22
import { Link } from 'react-router-dom'
33
import { Point } from 'src/pages/timeBasedMap'
44
import { Button } from '@mui/material'
@@ -11,9 +11,9 @@ import CircularProgress from '@mui/material/CircularProgress'
1111
import cn from 'classnames'
1212
import CustomTreeView from '../../CustomTreeView'
1313

14-
export type BusToolTipProps = { position: Point; icon: string }
14+
export type BusToolTipProps = { position: Point; icon: string; children?: ReactNode }
1515

16-
export function BusToolTip({ position, icon }: BusToolTipProps) {
16+
export function BusToolTip({ position, icon, children }: BusToolTipProps) {
1717
const [siriRide, setSiriRide] = useState<SiriRideWithRelatedPydanticModel | undefined>()
1818
const [isLoading, setIsLoading] = useState(false)
1919
const [showJson, setShowJson] = useState(false)
@@ -110,6 +110,7 @@ export function BusToolTip({ position, icon }: BusToolTipProps) {
110110
</div>
111111
)}
112112
</div>
113+
{children}
113114
</>
114115
)}
115116
</div>

src/pages/components/map-related/MapWithLocationsAndPath.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ const position: Point = {
1212
color: 0,
1313
}
1414

15-
export function MapWithLocationsAndPath({ positions, plannedRouteStops }: MapProps) {
15+
export function MapWithLocationsAndPath({
16+
positions,
17+
plannedRouteStops,
18+
showNavigationButtons,
19+
}: MapProps) {
1620
const [isExpanded, setIsExpanded] = useState<boolean>(false)
1721
const toggleExpanded = useCallback(() => setIsExpanded((expanded) => !expanded), [])
1822

@@ -23,7 +27,11 @@ export function MapWithLocationsAndPath({ positions, plannedRouteStops }: MapPro
2327
</IconButton>
2428

2529
<MapContainer center={position.loc} zoom={13} scrollWheelZoom={true}>
26-
<MapContent positions={positions} plannedRouteStops={plannedRouteStops} />
30+
<MapContent
31+
positions={positions}
32+
plannedRouteStops={plannedRouteStops}
33+
showNavigationButtons={showNavigationButtons}
34+
/>
2735
</MapContainer>
2836
</div>
2937
)

src/pages/components/map-related/map-types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ export interface Path {
1212
export interface MapProps {
1313
positions: Point[]
1414
plannedRouteStops: BusStop[]
15+
showNavigationButtons?: boolean
1516
}

src/pages/homepage/HomePage.scss

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
gap: 1rem;
4040

4141
@media (width <= 600px) {
42+
grid-template-columns: repeat(2, 1fr);
4243
margin-bottom: 3rem;
4344
}
4445
}
@@ -61,6 +62,7 @@
6162
padding: 0 1.5rem;
6263
border-radius: 0.5rem;
6364
transition: 0.2s ease-in-out 0s;
65+
margin-bottom: 0.25rem;
6466

6567
&:hover {
6668
transform: scale(1.25);

src/pages/singleLineMap/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ const SingleLineMapPage = () => {
136136
<MapWithLocationsAndPath
137137
positions={filteredPositions}
138138
plannedRouteStops={plannedRouteStops}
139+
showNavigationButtons
139140
/>
140141
</PageContainer>
141142
)

0 commit comments

Comments
 (0)