@@ -20,6 +20,7 @@ import * as React from 'react';
2020import { FeedStatusIndicator } from '../../components/FeedStatus' ;
2121import { useTranslations } from 'next-intl' ;
2222import LockIcon from '@mui/icons-material/Lock' ;
23+ import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined' ;
2324import GtfsRtEntities from './GtfsRtEntities' ;
2425import { getEmojiFlag , type TCountryCode } from 'countries-list' ;
2526import OfficialChip from '../../components/OfficialChip' ;
@@ -33,18 +34,28 @@ export interface AdvancedSearchTableProps {
3334 feedsData : AllFeedsType | undefined ;
3435 selectedFeatures : string [ ] | undefined ;
3536 selectedGbfsVersions : string [ ] | undefined ;
37+ selectedLicenseTags : string [ ] | undefined ;
3638 isLoadingFeeds : boolean ;
3739}
3840
3941interface DetailsContainerProps {
4042 children : React . ReactNode ;
4143 feedSearchItem : SearchFeedItem ;
44+ selectedLicenseTags : string [ ] ;
4245}
4346
4447const DetailsContainer = ( {
4548 children,
4649 feedSearchItem,
50+ selectedLicenseTags,
4751} : DetailsContainerProps ) : React . ReactElement => {
52+ const licenseTags = feedSearchItem . source_info ?. license_tags ;
53+ const licenseTagsTitle =
54+ licenseTags != null && licenseTags . length > 0
55+ ? licenseTags . join ( ', ' )
56+ : undefined ;
57+ const matchingTags =
58+ licenseTags ?. filter ( ( tag ) => selectedLicenseTags . includes ( tag ) ) ?? [ ] ;
4859 return (
4960 < Box
5061 sx = { {
@@ -55,20 +66,52 @@ const DetailsContainer = ({
5566 } }
5667 >
5768 < Box sx = { { width : 'calc(100% - 100px' } } > { children } </ Box >
58- < Tooltip title = { 'Feed License' } placement = { 'top-end' } >
59- < Typography
60- variant = 'caption'
61- sx = { {
62- opacity : 0.7 ,
63- ml : { xs : 0 , lg : 2 } ,
64- minWidth : { xs : '100%' , lg : '100px' } ,
65- textAlign : 'right' ,
66- pt : { xs : 1 , lg : 0 } ,
67- } }
69+ < Box
70+ sx = { {
71+ display : 'flex' ,
72+ alignItems : 'center' ,
73+ gap : 0.5 ,
74+ ml : { xs : 0 , lg : 2 } ,
75+ minWidth : { xs : '100%' , lg : '100px' } ,
76+ justifyContent : 'flex-end' ,
77+ flexWrap : 'wrap' ,
78+ pt : { xs : 1 , lg : 0 } ,
79+ } }
80+ >
81+ { matchingTags . map ( ( tag ) => (
82+ < Chip
83+ key = { tag }
84+ label = { tag }
85+ size = 'small'
86+ color = 'primary'
87+ variant = 'outlined'
88+ sx = { { opacity : 0.8 } }
89+ />
90+ ) ) }
91+ < Tooltip
92+ title = { licenseTagsTitle ?? '' }
93+ placement = 'top-end'
94+ disableTouchListener = { licenseTagsTitle == null }
6895 >
69- { feedSearchItem . source_info ?. license_id }
70- </ Typography >
71- </ Tooltip >
96+ < Box
97+ sx = { {
98+ display : 'flex' ,
99+ alignItems : 'center' ,
100+ gap : 0.5 ,
101+ } }
102+ >
103+ { licenseTagsTitle != null && (
104+ < InfoOutlinedIcon sx = { { fontSize : 14 , opacity : 0.7 } } />
105+ ) }
106+ < Typography
107+ variant = 'caption'
108+ sx = { { opacity : 0.7 , textAlign : 'right' } }
109+ >
110+ { feedSearchItem . source_info ?. license_id }
111+ </ Typography >
112+ </ Box >
113+ </ Tooltip >
114+ </ Box >
72115 </ Box >
73116 ) ;
74117} ;
@@ -77,11 +120,15 @@ const renderGTFSDetails = (
77120 gtfsFeed : SearchFeedItem ,
78121 selectedFeatures : string [ ] ,
79122 theme : Theme ,
123+ selectedLicenseTags : string [ ] ,
80124) : React . ReactElement => {
81125 const feedFeatures =
82126 gtfsFeed ?. latest_dataset ?. validation_report ?. features ?? [ ] ;
83127 return (
84- < DetailsContainer feedSearchItem = { gtfsFeed } >
128+ < DetailsContainer
129+ feedSearchItem = { gtfsFeed }
130+ selectedLicenseTags = { selectedLicenseTags }
131+ >
85132 { gtfsFeed ?. feed_name != null && (
86133 < Typography
87134 variant = 'body1'
@@ -123,9 +170,13 @@ const renderGTFSDetails = (
123170
124171const renderGTFSRTDetails = (
125172 gtfsRtFeed : SearchFeedItem ,
173+ selectedLicenseTags : string [ ] ,
126174) : React . ReactElement => {
127175 return (
128- < DetailsContainer feedSearchItem = { gtfsRtFeed } >
176+ < DetailsContainer
177+ feedSearchItem = { gtfsRtFeed }
178+ selectedLicenseTags = { selectedLicenseTags }
179+ >
129180 < GtfsRtEntities
130181 entities = { gtfsRtFeed ?. entity_types }
131182 includeName = { true }
@@ -138,9 +189,13 @@ const renderGBFSDetails = (
138189 gbfsFeedSearchElement : SearchFeedItem ,
139190 selectedGbfsVersions : string [ ] ,
140191 theme : Theme ,
192+ selectedLicenseTags : string [ ] ,
141193) : React . ReactElement => {
142194 return (
143- < DetailsContainer feedSearchItem = { gbfsFeedSearchElement } >
195+ < DetailsContainer
196+ feedSearchItem = { gbfsFeedSearchElement }
197+ selectedLicenseTags = { selectedLicenseTags }
198+ >
144199 { gbfsFeedSearchElement . versions ?. map ( ( version : string , index : number ) => (
145200 < Chip
146201 label = { 'v' + version }
@@ -164,6 +219,7 @@ export default function AdvancedSearchTable({
164219 feedsData,
165220 selectedFeatures,
166221 selectedGbfsVersions,
222+ selectedLicenseTags,
167223 isLoadingFeeds,
168224} : AdvancedSearchTableProps ) : React . ReactElement {
169225 const t = useTranslations ( 'feeds' ) ;
@@ -390,18 +446,28 @@ export default function AdvancedSearchTable({
390446 : { }
391447 }
392448 >
393- { renderGTFSDetails ( feed , selectedFeatures ?? [ ] , theme ) }
449+ { renderGTFSDetails (
450+ feed ,
451+ selectedFeatures ?? [ ] ,
452+ theme ,
453+ selectedLicenseTags ?? [ ] ,
454+ ) }
394455 </ Box >
395456 ) }
396457 { feed . data_type === 'gtfs_rt' && (
397458 < Box sx = { descriptionDividerStyle } >
398- { renderGTFSRTDetails ( feed ) }
459+ { renderGTFSRTDetails ( feed , selectedLicenseTags ?? [ ] ) }
399460 </ Box >
400461 ) }
401462
402463 { feed . data_type === 'gbfs' && (
403464 < Box sx = { hasGbfsVersions ? descriptionDividerStyle : { } } >
404- { renderGBFSDetails ( feed , selectedGbfsVersions ?? [ ] , theme ) }
465+ { renderGBFSDetails (
466+ feed ,
467+ selectedGbfsVersions ?? [ ] ,
468+ theme ,
469+ selectedLicenseTags ?? [ ] ,
470+ ) }
405471 </ Box >
406472 ) }
407473 </ Box >
0 commit comments