Skip to content

Commit 8a19a7e

Browse files
Feat: gbfs version filtering + versions display on search page (#1190)
* gbfs version filtering * gbfs filtering * logic fix for isofficial filter * rm gbfs status from search * updated gbfs version filtering availability * gbfs versions added to firebase config * updated gbfs remote config
1 parent 4d2867c commit 8a19a7e

File tree

6 files changed

+419
-190
lines changed

6 files changed

+419
-190
lines changed

web-app/src/app/interface/RemoteConfig.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ export interface BypassConfig {
66
regex: string[];
77
}
88

9+
export type GbfsVersionConfig = string[];
10+
911
export interface RemoteConfigValues extends FirebaseDefaultConfig {
1012
enableAppleSSO: boolean;
1113
enableFeedsPage: boolean;
@@ -32,12 +34,15 @@ export interface RemoteConfigValues extends FirebaseDefaultConfig {
3234
enableIsOfficialFilterSearch: boolean;
3335
enableFeedStatusBadge: boolean;
3436
enableGbfsInSearchPage: boolean;
37+
gbfsVersions: string;
3538
}
3639

3740
const featureByPassDefault: BypassConfig = {
3841
regex: [],
3942
};
4043

44+
const gbfsVersionsDefault: GbfsVersionConfig = [];
45+
4146
// Add default values for remote config here
4247
export const defaultRemoteConfigValues: RemoteConfigValues = {
4348
enableAppleSSO: false,
@@ -54,6 +59,7 @@ export const defaultRemoteConfigValues: RemoteConfigValues = {
5459
enableIsOfficialFilterSearch: false,
5560
enableFeedStatusBadge: false,
5661
enableGbfsInSearchPage: false,
62+
gbfsVersions: JSON.stringify(gbfsVersionsDefault),
5763
};
5864

5965
remoteConfig.defaultConfig = defaultRemoteConfigValues;

web-app/src/app/screens/Feeds/AdvancedSearchTable.tsx

Lines changed: 45 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ import {
1212
type AllFeedsType,
1313
getCountryLocationSummaries,
1414
getLocationName,
15-
type GTFSFeedType,
16-
type GTFSRTFeedType,
15+
type SearchFeedItem,
1716
} from '../../services/feeds/utils';
1817
import * as React from 'react';
1918
import { FeedStatusIndicator } from '../../components/FeedStatus';
@@ -29,10 +28,11 @@ import ProviderTitle from './ProviderTitle';
2928
export interface AdvancedSearchTableProps {
3029
feedsData: AllFeedsType | undefined;
3130
selectedFeatures: string[] | undefined;
31+
selectedGbfsVersions: string[] | undefined;
3232
}
3333

3434
const renderGTFSDetails = (
35-
gtfsFeed: GTFSFeedType,
35+
gtfsFeed: SearchFeedItem,
3636
selectedFeatures: string[],
3737
): React.ReactElement => {
3838
const theme = useTheme();
@@ -78,7 +78,7 @@ const renderGTFSDetails = (
7878
};
7979

8080
const renderGTFSRTDetails = (
81-
gtfsRtFeed: GTFSRTFeedType,
81+
gtfsRtFeed: SearchFeedItem,
8282
): React.ReactElement => {
8383
return (
8484
<GtfsRtEntities
@@ -88,27 +88,36 @@ const renderGTFSRTDetails = (
8888
);
8989
};
9090

91-
// TODO: Finalize with types and versions when GBFS endpoint is implemented
92-
// const renderGBFSDetails = (gbfsFeed: any) => {
93-
// const fakeVersions = ['v3.0', 'v2.0', 'v1.0'];
94-
// return (
95-
// <>
96-
// {fakeVersions.map((version: string, index: number) => (
97-
// <Chip
98-
// label={version}
99-
// key={index}
100-
// size='small'
101-
// variant='outlined'
102-
// sx={{ mr: 1 }}
103-
// />
104-
// ))}
105-
// </>
106-
// );
107-
// };
91+
const renderGBFSDetails = (
92+
gbfsFeedSearchElement: SearchFeedItem,
93+
selectedGbfsVersions: string[],
94+
): JSX.Element => {
95+
const theme = useTheme();
96+
return (
97+
<Box>
98+
{gbfsFeedSearchElement.versions?.map((version: string, index: number) => (
99+
<Chip
100+
label={'v' + version}
101+
key={index}
102+
size='small'
103+
variant='outlined'
104+
sx={{
105+
mr: 1,
106+
border: selectedGbfsVersions.includes('v' + version)
107+
? `2px solid ${theme.palette.primary.main}`
108+
: '',
109+
color: 'black',
110+
}}
111+
/>
112+
))}
113+
</Box>
114+
);
115+
};
108116

109117
export default function AdvancedSearchTable({
110118
feedsData,
111119
selectedFeatures,
120+
selectedGbfsVersions,
112121
}: AdvancedSearchTableProps): React.ReactElement {
113122
const { t } = useTranslation('feeds');
114123
const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);
@@ -135,6 +144,8 @@ export default function AdvancedSearchTable({
135144
}
136145
const hasGtfsFeatures =
137146
(feed?.latest_dataset?.validation_report?.features?.length ?? 0) > 0;
147+
const hasGbfsVersions = (feed.versions?.length ?? 0) > 0;
148+
138149
return (
139150
<Card
140151
key={index}
@@ -181,9 +192,11 @@ export default function AdvancedSearchTable({
181192
{feed.official === true && (
182193
<OfficialChip isLongDisplay={false}></OfficialChip>
183194
)}
184-
<FeedStatusIndicator
185-
status={feed.status}
186-
></FeedStatusIndicator>
195+
{feed.data_type !== 'gbfs' && (
196+
<FeedStatusIndicator
197+
status={feed.status}
198+
></FeedStatusIndicator>
199+
)}
187200
</Box>
188201

189202
<Box
@@ -285,22 +298,20 @@ export default function AdvancedSearchTable({
285298
: {}
286299
}
287300
>
288-
{renderGTFSDetails(
289-
feed as GTFSFeedType,
290-
selectedFeatures ?? [],
291-
)}
301+
{renderGTFSDetails(feed, selectedFeatures ?? [])}
292302
</Box>
293303
)}
294304
{feed.data_type === 'gtfs_rt' && (
295305
<Box sx={descriptionDividerStyle}>
296-
{renderGTFSRTDetails(feed as GTFSRTFeedType)}
306+
{renderGTFSRTDetails(feed)}
307+
</Box>
308+
)}
309+
310+
{feed.data_type === 'gbfs' && (
311+
<Box sx={hasGbfsVersions ? descriptionDividerStyle : {}}>
312+
{renderGBFSDetails(feed, selectedGbfsVersions ?? [])}
297313
</Box>
298314
)}
299-
{/*
300-
TODO: uncomment when GBFS option is available
301-
{feed.data_type === ('gbfs' as any) && (
302-
<Box>{renderGBFSDetails(feed)}</Box>
303-
)} */}
304315
</Box>
305316
</CardActionArea>
306317
</Card>

web-app/src/app/screens/Feeds/Feeds.styles.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import { styled, type SxProps, type Theme, Typography } from '@mui/material';
22

33
export const SearchHeader = styled(Typography)(({ theme }) => ({
4+
'&.no-collapse': {
5+
margin: '12px 0',
6+
},
47
'&:not(:first-of-type)': {
5-
marginTop: theme.spacing(2),
8+
marginTop: theme.spacing(1),
69
},
710
'&:after': {
811
content: '""',

0 commit comments

Comments
 (0)