@@ -46,6 +46,7 @@ import { RunsIcon } from "~/assets/icons/RunsIcon";
4646import { TaskRunListSearchFilters } from "~/components/runs/v3/RunFilters" ;
4747import { useSearchParams } from "~/hooks/useSearchParam" ;
4848import { CopyableText } from "~/components/primitives/CopyableText" ;
49+ import { LogsVersionFilter } from "~/components/logs/LogsVersionFilter" ;
4950
5051export const meta : MetaFunction < typeof loader > = ( { data } ) => {
5152 return [
@@ -82,6 +83,7 @@ export const loader = async ({ request, params }: LoaderFunctionArgs) => {
8283 const toStr = url . searchParams . get ( "to" ) ;
8384 const from = fromStr ? parseInt ( fromStr , 10 ) : undefined ;
8485 const to = toStr ? parseInt ( toStr , 10 ) : undefined ;
86+ const versions = url . searchParams . getAll ( "versions" ) . filter ( ( v ) => v . length > 0 ) ;
8587 const cursor = url . searchParams . get ( "cursor" ) ?? undefined ;
8688 const directionRaw = url . searchParams . get ( "direction" ) ?? undefined ;
8789 const direction = directionRaw ? DirectionSchema . parse ( directionRaw ) : undefined ;
@@ -93,6 +95,7 @@ export const loader = async ({ request, params }: LoaderFunctionArgs) => {
9395 userId,
9496 projectId : project . id ,
9597 fingerprint,
98+ versions : versions . length > 0 ? versions : undefined ,
9699 period,
97100 from,
98101 to,
@@ -115,7 +118,8 @@ export const loader = async ({ request, params }: LoaderFunctionArgs) => {
115118 environment . id ,
116119 fingerprint ,
117120 time . from ,
118- time . to
121+ time . to ,
122+ versions . length > 0 ? versions : undefined
119123 )
120124 . catch ( ( ) => ( { data : [ ] as ErrorGroupActivity } ) ) ;
121125
@@ -149,6 +153,9 @@ export default function Page() {
149153 if ( period ) carry . set ( "period" , period ) ;
150154 if ( from ) carry . set ( "from" , from ) ;
151155 if ( to ) carry . set ( "to" , to ) ;
156+ for ( const v of searchParams . getAll ( "versions" ) ) {
157+ if ( v ) carry . append ( "versions" , v ) ;
158+ }
152159 const qs = carry . toString ( ) ;
153160 return qs ? `${ base } ?${ qs } ` : base ;
154161 } , [ organizationSlug , projectParam , envParam , searchParams . toString ( ) ] ) ;
@@ -232,7 +239,7 @@ function ErrorGroupDetail({
232239 envParam : string ;
233240 fingerprint : string ;
234241} ) {
235- const { value } = useSearchParams ( ) ;
242+ const { value, values } = useSearchParams ( ) ;
236243 const organization = useOrganization ( ) ;
237244 const project = useProject ( ) ;
238245 const environment = useEnvironment ( ) ;
@@ -252,11 +259,13 @@ function ErrorGroupDetail({
252259
253260 const fromValue = value ( "from" ) ?? undefined ;
254261 const toValue = value ( "to" ) ?? undefined ;
262+ const selectedVersions = values ( "versions" ) . filter ( ( v ) => v !== "" ) ;
255263
256264 const filters : TaskRunListSearchFilters = {
257265 period : value ( "period" ) ?? undefined ,
258266 from : fromValue ? parseInt ( fromValue , 10 ) : undefined ,
259267 to : toValue ? parseInt ( toValue , 10 ) : undefined ,
268+ versions : selectedVersions . length > 0 ? selectedVersions : undefined ,
260269 rootOnly : false ,
261270 errorId : ErrorId . toFriendlyId ( fingerprint ) ,
262271 } ;
@@ -318,8 +327,9 @@ function ErrorGroupDetail({
318327
319328 { /* Activity chart */ }
320329 < div className = "flex flex-col gap-3 overflow-hidden border-b border-grid-bright px-4 py-3" >
321- < div className = "flex items-center" >
330+ < div className = "flex items-center gap-1 " >
322331 < TimeFilter defaultPeriod = "7d" labelName = "Occurred" />
332+ < LogsVersionFilter />
323333 </ div >
324334
325335 < Suspense fallback = { < ActivityChartBlankState /> } >
@@ -369,10 +379,10 @@ function ErrorGroupDetail({
369379 { runList ? (
370380 < TaskRunsTable
371381 total = { runList . runs . length }
372- hasFilters = { false }
382+ hasFilters = { selectedVersions . length > 0 }
373383 filters = { {
374384 tasks : [ ] ,
375- versions : [ ] ,
385+ versions : selectedVersions ,
376386 statuses : [ ] ,
377387 from : undefined ,
378388 to : undefined ,
0 commit comments