@@ -30,8 +30,10 @@ import { useSearchParams } from 'react-router-dom';
3030import SearchTable from './SearchTable' ;
3131import { Trans , useTranslation } from 'react-i18next' ;
3232import {
33+ type AllowedFeedSearchStatus ,
3334 getDataTypeParamFromSelectedFeedTypes ,
3435 getInitialSelectedFeedTypes ,
36+ parseQueryParamStatus ,
3537} from './utility' ;
3638import {
3739 chipHolderStyles ,
@@ -65,6 +67,9 @@ export default function Feed(): React.ReactElement {
6567 const [ selectedFeatures , setSelectedFeatures ] = useState < string [ ] > (
6668 searchParams . get ( 'features' ) ?. split ( ',' ) ?? [ ] ,
6769 ) ;
70+ const [ selectedStatuses , setSelectedStatuses ] = useState <
71+ AllowedFeedSearchStatus [ ]
72+ > ( parseQueryParamStatus ( searchParams . get ( 'status' ) ?. split ( ',' ) ) ) ;
6873 const [ selectGbfsVersions , setSelectGbfsVersions ] = useState < string [ ] > (
6974 searchParams . get ( 'gbfs_versions' ) ?. split ( ',' ) ?? [ ] ,
7075 ) ;
@@ -91,6 +96,9 @@ export default function Feed(): React.ReactElement {
9196 const areFeatureFiltersEnabled =
9297 ( ! selectedFeedTypes . gtfs_rt && ! selectedFeedTypes . gbfs ) ||
9398 selectedFeedTypes . gtfs ;
99+ const areStatusFiltersEnabled =
100+ ( ! selectedFeedTypes . gtfs_rt && ! selectedFeedTypes . gbfs ) ||
101+ selectedFeedTypes . gtfs ;
94102 const areGBFSFiltersEnabled =
95103 selectedFeedTypes . gbfs &&
96104 ! selectedFeedTypes . gtfs_rt &&
@@ -122,9 +130,10 @@ export default function Feed(): React.ReactElement {
122130 is_official : isOfficialTagFilterEnabled
123131 ? isOfficialFeedSearch || undefined
124132 : undefined ,
125- // Fixed status values for now, until a status filter is implemented
126- // Filtering out deprecated feeds
127- status : [ 'active' , 'inactive' , 'development' , 'future' ] ,
133+ status :
134+ areStatusFiltersEnabled && selectedStatuses . length > 0
135+ ? selectedStatuses
136+ : [ 'active' , 'inactive' , 'development' , 'future' ] ,
128137 feature : areFeatureFiltersEnabled ? selectedFeatures : undefined ,
129138 version : areGBFSFiltersEnabled
130139 ? selectGbfsVersions . join ( ',' ) . replaceAll ( 'v' , '' )
@@ -141,6 +150,7 @@ export default function Feed(): React.ReactElement {
141150 searchLimit ,
142151 isOfficialFeedSearch ,
143152 selectedFeatures ,
153+ selectedStatuses ,
144154 selectGbfsVersions ,
145155 ] ) ;
146156
@@ -165,6 +175,9 @@ export default function Feed(): React.ReactElement {
165175 if ( selectedFeatures . length > 0 ) {
166176 newSearchParams . set ( 'features' , selectedFeatures . join ( ',' ) ) ;
167177 }
178+ if ( selectedStatuses . length > 0 ) {
179+ newSearchParams . set ( 'status' , selectedStatuses . join ( ',' ) ) ;
180+ }
168181 if ( selectGbfsVersions . length > 0 ) {
169182 newSearchParams . set ( 'gbfs_versions' , selectGbfsVersions . join ( ',' ) ) ;
170183 }
@@ -179,6 +192,7 @@ export default function Feed(): React.ReactElement {
179192 activePagination ,
180193 selectedFeedTypes ,
181194 selectedFeatures ,
195+ selectedStatuses ,
182196 selectGbfsVersions ,
183197 isOfficialFeedSearch ,
184198 ] ) ;
@@ -202,6 +216,12 @@ export default function Feed(): React.ReactElement {
202216 setSelectedFeatures ( [ ...newFeatures ] ) ;
203217 }
204218
219+ const newStatusesRaw = searchParams . get ( 'status' ) ?. split ( ',' ) ?? [ ] ;
220+ const newStatuses = parseQueryParamStatus ( newStatusesRaw ) ;
221+ if ( newStatuses . join ( ',' ) !== selectedStatuses . join ( ',' ) ) {
222+ setSelectedStatuses ( [ ...newStatuses ] ) ;
223+ }
224+
205225 const newGbfsVersions = searchParams . get ( 'gbfs_versions' ) ?. split ( ',' ) ?? [ ] ;
206226 if ( newGbfsVersions . join ( ',' ) !== selectGbfsVersions . join ( ',' ) ) {
207227 setSelectGbfsVersions ( [ ...newGbfsVersions ] ) ;
@@ -257,6 +277,7 @@ export default function Feed(): React.ReactElement {
257277 gbfs : false ,
258278 } ) ;
259279 setSelectedFeatures ( [ ] ) ;
280+ setSelectedStatuses ( [ ] ) ;
260281 setSelectGbfsVersions ( [ ] ) ;
261282 setIsOfficialFeedSearch ( false ) ;
262283 }
@@ -388,6 +409,7 @@ export default function Feed(): React.ReactElement {
388409 selectedFeedTypes = { selectedFeedTypes }
389410 isOfficialFeedSearch = { isOfficialFeedSearch }
390411 selectedFeatures = { selectedFeatures }
412+ selectedStatuses = { selectedStatuses }
391413 selectedGbfsVersions = { selectGbfsVersions }
392414 setSelectedFeedTypes = { ( feedTypes ) => {
393415 setActivePagination ( 1 ) ;
@@ -401,12 +423,17 @@ export default function Feed(): React.ReactElement {
401423 setActivePagination ( 1 ) ;
402424 setSelectedFeatures ( features ) ;
403425 } }
426+ setSelectedStatuses = { ( statuses ) => {
427+ setActivePagination ( 1 ) ;
428+ setSelectedStatuses ( statuses ) ;
429+ } }
404430 setSelectedGbfsVerions = { ( versions ) => {
405431 setSelectGbfsVersions ( versions ) ;
406432 setActivePagination ( 1 ) ;
407433 } }
408434 isOfficialTagFilterEnabled = { isOfficialTagFilterEnabled }
409435 areFeatureFiltersEnabled = { areFeatureFiltersEnabled }
436+ areStatusFiltersEnabled = { areStatusFiltersEnabled }
410437 areGBFSFiltersEnabled = { areGBFSFiltersEnabled }
411438 > </ SearchFilters >
412439 </ Grid >
@@ -486,6 +513,22 @@ export default function Feed(): React.ReactElement {
486513 />
487514 ) ) }
488515
516+ { areStatusFiltersEnabled &&
517+ selectedStatuses . map ( ( status ) => (
518+ < Chip
519+ color = 'primary'
520+ variant = 'outlined'
521+ size = 'small'
522+ label = { t ( 'feedStatus.' + status + '.label' ) }
523+ key = { status }
524+ onDelete = { ( ) => {
525+ setSelectedStatuses ( [
526+ ...selectedStatuses . filter ( ( s ) => s !== status ) ,
527+ ] ) ;
528+ } }
529+ />
530+ ) ) }
531+
489532 { areGBFSFiltersEnabled &&
490533 selectGbfsVersions . map ( ( gbfsVersion ) => (
491534 < Chip
@@ -505,6 +548,7 @@ export default function Feed(): React.ReactElement {
505548 ) ) }
506549
507550 { ( selectedFeatures . length > 0 ||
551+ selectedStatuses . length > 0 ||
508552 selectGbfsVersions . length > 0 ||
509553 isOfficialFeedSearch ||
510554 selectedFeedTypes . gtfs_rt ||
0 commit comments