feat: :sparkles: Hide/show map on travels view #551
Tim Izzo tim@5ika.ch
Mon, 09 Dec 2024 14:51:49 +0100
10 files changed,
43 insertions(+),
19 deletions(-)
jump to
M
frontend/containers/Map/MapWrapper.tsx
→
frontend/containers/Map/MapWrapper.tsx
@@ -11,7 +11,7 @@ <ThemeProvider theme={theme}>
<Box id="map" width="100%" - height={mobile ? '40vh' : '50vh'} + height={mobile ? '60vh' : '50vh'} sx={{position: 'relative'}} > {children}
M
frontend/containers/Map/SearchField.tsx
→
frontend/containers/Map/SearchField.tsx
@@ -1,7 +1,7 @@
-import {Icon, InputAdornment, TextField} from '@mui/material'; +import {Icon, InputAdornment} from '@mui/material'; import {useTranslation} from 'react-i18next'; import PlaceInput from '../PlaceInput'; -import useTravelsStore from '../../stores/travelsStore'; +import useTravelsStore from '../../stores/useTravelsStore'; type Props = {};
M
frontend/containers/PlaceInput/index.tsx
→
frontend/containers/PlaceInput/index.tsx
@@ -110,7 +110,7 @@ return (
<Autocomplete freeSolo autoComplete - getOptionLabel={option => option?.place_name} + getOptionLabel={option => option?.place_name || ''} options={options} defaultValue={previousOption} filterOptions={x => x}@@ -130,8 +130,10 @@ formHelperText: {
sx: {color: 'warning.main'}, }, input: { + style: {paddingRight: 0}, ...params.InputProps, ...(textFieldProps?.slotProps?.input || { + paddingRight: 0, endAdornment: ( <InputAdornment position="end" sx={{mr: -0.5}}> <PlaceOutlinedIcon />@@ -149,7 +151,7 @@
return ( <ListItem key={key || option.id || 'text'} {...props}> <ListItemText - primary={option.place_name} + primary={option?.place_name || ''} secondary={!option.center && t`placeInput.item.noCoordinates`} secondaryTypographyProps={{ color: option.center ? 'inherit' : 'warning.main',
M
frontend/containers/TravelColumns/FilterByDate.tsx
→
frontend/containers/TravelColumns/FilterByDate.tsx
@@ -8,7 +8,7 @@ Menu,
MenuItem, } from '@mui/material'; import {type Moment} from 'moment'; -import useTravelsStore from '../../stores/travelsStore'; +import useTravelsStore from '../../stores/useTravelsStore'; interface FilterByDateProps { dates: Moment[];
M
frontend/containers/TravelColumns/index.tsx
→
frontend/containers/TravelColumns/index.tsx
@@ -1,4 +1,4 @@
-import {useMemo, useState} from 'react'; +import {useMemo, useReducer, useState} from 'react'; import Masonry from '@mui/lab/Masonry'; import Box from '@mui/material/Box'; import moment from 'moment';@@ -21,7 +21,7 @@ import useDisplayTravels from './useDisplayTravels';
import useDisplayMarkers from './useDisplayMarkers'; import FilterByDate from './FilterByDate'; import {Button, Icon} from '@mui/material'; -import useTravelsStore from '../../stores/travelsStore'; +import useTravelsStore from '../../stores/useTravelsStore'; interface Props { showTravelModal: () => void;@@ -40,6 +40,7 @@ userPermissions: {canAddTravel},
} = usePermissions(); const [selectedTravel, setSelectedTravel] = useState<TravelEntity>(); + const [mapEnabled, toggleMap] = useReducer(i => !i, true); const datesFilters = useTravelsStore(s => s.datesFilter); const {addPassenger} = usePassengersActions(); const {displayedTravels} = useDisplayTravels();@@ -72,12 +73,13 @@ };
const isCarosterPlus = event?.enabled_modules?.includes('caroster-plus'); - const showMap = + const haveGeopoints = (!!event?.latitude && !!event?.longitude) || travels?.some( ({attributes: {meeting_latitude, meeting_longitude}}) => meeting_latitude && meeting_longitude ); + const showMap = mapEnabled && haveGeopoints; if (!event || travels?.length === 0) return (@@ -100,7 +102,15 @@
return ( <> {showMap && <Map />} - <Box px={3} py={2} display="flex" gap={2} maxWidth="100%" flexWrap="wrap"> + <Box + px={3} + pb={2} + pt={showMap ? 2 : 10} + display="flex" + gap={2} + maxWidth="100%" + flexWrap="wrap" + > <FilterByDate dates={dates} buttonFilterContent={buttonFilterContent} /> {canAddTravel() && ( <Button@@ -114,10 +124,19 @@ >
{t('travel.creation.title')} </Button> )} + {haveGeopoints && ( + <Button + sx={{width: {xs: 1, sm: 'auto'}}} + onClick={toggleMap} + startIcon={<Icon>{mapEnabled ? 'visibility_off' : 'map'}</Icon>} + > + {mapEnabled ? t`travel.hideMap` : t`travel.showMap`} + </Button> + )} </Box> <Box p={0} - pt={showMap ? 0 : 13} + pt={showMap ? 0 : 3} pb={11} sx={{ overflowX: 'hidden',
M
frontend/containers/TravelColumns/useDisplayMarkers.tsx
→
frontend/containers/TravelColumns/useDisplayMarkers.tsx
@@ -3,7 +3,7 @@ import {useEffect, useMemo} from 'react';
import useMapStore from '../../stores/useMapStore'; import dynamic from 'next/dynamic'; import {Event} from '../../generated/graphql'; -import useTravelsStore from '../../stores/travelsStore'; +import useTravelsStore from '../../stores/useTravelsStore'; import {calculateHaversineDistance} from '../../lib/geography'; const EventMarker = dynamic(() => import('../Markers/EventMarker'), {@@ -79,10 +79,6 @@ // Set bounds
useEffect(() => { let bounds = []; - // Set event bounds - const {latitude, longitude} = event || {}; - if (latitude && longitude) bounds.push([latitude, longitude]); - if (meetingFilter?.latitude && meetingFilter?.longitude) { bounds.push([meetingFilter.latitude, meetingFilter.longitude]);@@ -106,6 +102,9 @@ travel.attributes.meeting_longitude,
]); bounds.push(...travelCoords); } else { + // Set event bounds + const {latitude, longitude} = event || {}; + if (latitude && longitude) bounds.push([latitude, longitude]); // Set travels bounds const travelCoords = travelsWithGeoloc.map(travel => [ travel.attributes.meeting_latitude,
M
frontend/containers/TravelColumns/useDisplayTravels.tsx
→
frontend/containers/TravelColumns/useDisplayTravels.tsx
@@ -2,7 +2,7 @@ import useEventStore from '../../stores/useEventStore';
import {TravelEntity} from '../../generated/graphql'; import useProfile from '../../hooks/useProfile'; import moment from 'moment'; -import useTravelsStore from '../../stores/travelsStore'; +import useTravelsStore from '../../stores/useTravelsStore'; import {useMemo} from 'react'; import {calculateHaversineDistance} from '../../lib/geography';
M
frontend/locales/en.json
→
frontend/locales/en.json
@@ -310,5 +310,7 @@ "travel.vehicle.add": "Add a new vehicle",
"travel.vehicle.empty": "There is no vehicle assigned to you. Click the button bellow in order to create one.", "travel.vehicle.name": "Name of the vehicle", "travel.vehicle.seats_number": "Seats number", - "travel.vehicle.title": "My Vehicles" + "travel.vehicle.title": "My Vehicles", + "travel.showMap": "Show map", + "travel.hideMap": "Hide map" }
M
frontend/locales/fr.json
→
frontend/locales/fr.json
@@ -309,5 +309,7 @@ "travel.vehicle.add": "Ajouter un nouveau véhicule",
"travel.vehicle.empty": "Vous n'avez aucun véhicule assigné. Utilisez le bouton ci-dessous pour en créer un.", "travel.vehicle.name": "Nom du véhicule", "travel.vehicle.seats_number": "Nombre de places", - "travel.vehicle.title": "Mes véhicules" + "travel.vehicle.title": "Mes véhicules", + "travel.showMap": "Afficher la carte", + "travel.hideMap": "Masquer la carte" }