@@ -34,6 +34,7 @@ import { MetricsChart } from '@/components/charts/metrics-chart';
3434import { useBatchDynamicQuery } from '@/hooks/use-dynamic-query' ;
3535import { useTableTabs } from '@/lib/table-tabs' ;
3636import { getUserTimezone } from '@/lib/timezone' ;
37+
3738import {
3839 metricVisibilityAtom ,
3940 toggleMetricAtom ,
@@ -143,6 +144,7 @@ export function WebsiteOverviewTab({
143144 isRefreshing,
144145 setIsRefreshing,
145146 filters,
147+ addFilter,
146148} : FullTabProps ) {
147149 const calculatePreviousPeriod = useCallback (
148150 ( currentRange : typeof dateRange ) => {
@@ -313,24 +315,43 @@ export function WebsiteOverviewTab({
313315 primaryField : 'name' ,
314316 primaryHeader : 'Source' ,
315317 customCell : referrerCustomCell ,
318+ getFilter : ( row : any ) => {
319+ // For referrers, use the referrer field and get the actual referrer URL
320+ return {
321+ field : 'referrer' ,
322+ value : row . referrer
323+ } ;
324+ } ,
316325 } ,
317326 utm_sources : {
318327 data : analytics . utm_sources || [ ] ,
319328 label : 'UTM Sources' ,
320329 primaryField : 'name' ,
321330 primaryHeader : 'Source' ,
331+ getFilter : ( row : any ) => ( {
332+ field : 'utm_source' ,
333+ value : row . name
334+ } ) ,
322335 } ,
323336 utm_mediums : {
324337 data : analytics . utm_mediums || [ ] ,
325338 label : 'UTM Mediums' ,
326339 primaryField : 'name' ,
327340 primaryHeader : 'Medium' ,
341+ getFilter : ( row : any ) => ( {
342+ field : 'utm_medium' ,
343+ value : row . name
344+ } ) ,
328345 } ,
329346 utm_campaigns : {
330347 data : analytics . utm_campaigns || [ ] ,
331348 label : 'UTM Campaigns' ,
332349 primaryField : 'name' ,
333350 primaryHeader : 'Campaign' ,
351+ getFilter : ( row : any ) => ( {
352+ field : 'utm_campaign' ,
353+ value : row . name
354+ } ) ,
334355 } ,
335356 } ) ;
336357
@@ -343,6 +364,10 @@ export function WebsiteOverviewTab({
343364 label : 'Top Pages' ,
344365 primaryField : 'name' ,
345366 primaryHeader : 'Page' ,
367+ getFilter : ( row : any ) => ( {
368+ field : 'path' ,
369+ value : row . name
370+ } ) ,
346371 } ,
347372 entry_pages : {
348373 data : ( analytics . entry_pages || [ ] ) . map ( ( page : PageData ) => ( {
@@ -352,6 +377,10 @@ export function WebsiteOverviewTab({
352377 label : 'Entry Pages' ,
353378 primaryField : 'name' ,
354379 primaryHeader : 'Page' ,
380+ getFilter : ( row : any ) => ( {
381+ field : 'path' ,
382+ value : row . name
383+ } ) ,
355384 } ,
356385 exit_pages : {
357386 data : ( analytics . exit_pages || [ ] ) . map ( ( page : PageData ) => ( {
@@ -361,6 +390,10 @@ export function WebsiteOverviewTab({
361390 label : 'Exit Pages' ,
362391 primaryField : 'name' ,
363392 primaryHeader : 'Page' ,
393+ getFilter : ( row : any ) => ( {
394+ field : 'path' ,
395+ value : row . name
396+ } ) ,
364397 } ,
365398 } ) ;
366399
@@ -875,6 +908,17 @@ export function WebsiteOverviewTab({
875908 return < UnauthorizedAccessError /> ;
876909 }
877910
911+ const onAddFilter = useCallback ( ( field : string , value : string , tableTitle ?: string ) => {
912+ // The field parameter now contains the correct filter field from the tab configuration
913+ const filter = {
914+ field,
915+ operator : 'eq' as const ,
916+ value
917+ } ;
918+
919+ addFilter ( filter ) ;
920+ } , [ addFilter ] ) ;
921+
878922 return (
879923 < div className = "space-y-6" >
880924 < EventLimitIndicator />
@@ -1059,6 +1103,7 @@ export function WebsiteOverviewTab({
10591103 description = "Referrers and campaign data"
10601104 isLoading = { isLoading }
10611105 minHeight = { 350 }
1106+ onAddFilter = { onAddFilter }
10621107 tabs = { referrerTabs }
10631108 title = "Traffic Sources"
10641109 />
@@ -1067,25 +1112,27 @@ export function WebsiteOverviewTab({
10671112 description = "Top pages and entry/exit points"
10681113 isLoading = { isLoading }
10691114 minHeight = { 350 }
1115+ onAddFilter = { onAddFilter }
10701116 tabs = { pagesTabs }
10711117 title = "Pages"
10721118 />
10731119 </ div >
10741120
10751121 { /* Custom Events Table */ }
1076- < DataTable
1077- columns = { customEventsColumns }
1078- data = { processedCustomEventsData }
1079- description = "User-defined events and interactions with property breakdowns"
1080- emptyMessage = "No custom events tracked yet"
1081- expandable = { true }
1082- getSubRows = { ( row : CustomEventData ) =>
1083- row . propertyCategories as unknown as CustomEventData [ ]
1084- }
1085- initialPageSize = { 8 }
1086- isLoading = { isLoading }
1087- minHeight = { 350 }
1088- renderSubRow = { ( subRow : CustomEventData , parentRow : CustomEventData ) => {
1122+ < DataTable
1123+ columns = { customEventsColumns }
1124+ data = { processedCustomEventsData }
1125+ description = "User-defined events and interactions with property breakdowns"
1126+ emptyMessage = "No custom events tracked yet"
1127+ expandable = { true }
1128+ getSubRows = { ( row : CustomEventData ) =>
1129+ row . propertyCategories as unknown as CustomEventData [ ]
1130+ }
1131+ initialPageSize = { 8 }
1132+ isLoading = { isLoading }
1133+ minHeight = { 350 }
1134+ onAddFilter = { onAddFilter }
1135+ renderSubRow = { ( subRow : CustomEventData , parentRow : CustomEventData ) => {
10891136 const typedSubRow = subRow as unknown as PropertyCategory ;
10901137 const propertyKey = typedSubRow . key ;
10911138 const propertyTotal = typedSubRow . total ;
@@ -1171,8 +1218,29 @@ export function WebsiteOverviewTab({
11711218 initialPageSize = { 8 }
11721219 isLoading = { isLoading }
11731220 minHeight = { 350 }
1221+ onAddFilter = { onAddFilter }
11741222 showSearch = { false }
11751223 title = "Devices"
1224+ tabs = { [
1225+ {
1226+ id : 'devices' ,
1227+ label : 'Devices' ,
1228+ data : processedDeviceData ,
1229+ columns : deviceColumns ,
1230+ getFilter : ( row : any ) => {
1231+ // Map display device names to filter values
1232+ const deviceDisplayToFilterMap : Record < string , string > = {
1233+ 'laptop' : 'mobile' ,
1234+ 'tablet' : 'tablet' ,
1235+ 'desktop' : 'desktop' ,
1236+ } ;
1237+ return {
1238+ field : 'device_type' ,
1239+ value : deviceDisplayToFilterMap [ row . name ] || row . name
1240+ } ;
1241+ }
1242+ }
1243+ ] }
11761244 />
11771245
11781246 < DataTable
@@ -1182,8 +1250,21 @@ export function WebsiteOverviewTab({
11821250 initialPageSize = { 8 }
11831251 isLoading = { isLoading }
11841252 minHeight = { 350 }
1253+ onAddFilter = { onAddFilter }
11851254 showSearch = { false }
11861255 title = "Browsers"
1256+ tabs = { [
1257+ {
1258+ id : 'browsers' ,
1259+ label : 'Browsers' ,
1260+ data : processedBrowserData ,
1261+ columns : browserColumns ,
1262+ getFilter : ( row : any ) => ( {
1263+ field : 'browser_name' ,
1264+ value : row . name
1265+ } ) ,
1266+ }
1267+ ] }
11871268 />
11881269
11891270 < DataTable
@@ -1193,8 +1274,21 @@ export function WebsiteOverviewTab({
11931274 initialPageSize = { 8 }
11941275 isLoading = { isLoading }
11951276 minHeight = { 350 }
1277+ onAddFilter = { onAddFilter }
11961278 showSearch = { false }
11971279 title = "Operating Systems"
1280+ tabs = { [
1281+ {
1282+ id : 'operating_systems' ,
1283+ label : 'Operating Systems' ,
1284+ data : processedOSData ,
1285+ columns : osColumns ,
1286+ getFilter : ( row : any ) => ( {
1287+ field : 'os_name' ,
1288+ value : row . name
1289+ } ) ,
1290+ }
1291+ ] }
11981292 />
11991293 </ div >
12001294 </ div >
0 commit comments