@@ -23,6 +23,7 @@ import {
23
23
ChartTooltip ,
24
24
ChartTooltipContent ,
25
25
} from '@/components/ui/chart' ;
26
+ import { DateRangePicker , presetLast7Days } from '@/components/ui/date-range-picker' ;
26
27
import { Meta } from '@/components/ui/meta' ;
27
28
import { SubPageLayoutHeader } from '@/components/ui/page-content-layout' ;
28
29
import { QueryError } from '@/components/ui/query-error' ;
@@ -52,6 +53,7 @@ import {
52
53
} from '@/components/ui/table' ;
53
54
import { Tooltip , TooltipContent , TooltipProvider , TooltipTrigger } from '@/components/ui/tooltip' ;
54
55
import { FragmentType , graphql , useFragment } from '@/gql' ;
56
+ import { useDateRangeController } from '@/lib/hooks/use-date-range-controller' ;
55
57
import { cn } from '@/lib/utils' ;
56
58
import { Link , useNavigate , useRouter } from '@tanstack/react-router' ;
57
59
import {
@@ -63,18 +65,12 @@ import {
63
65
useReactTable ,
64
66
} from '@tanstack/react-table' ;
65
67
import * as GraphQLSchema from '../gql/graphql' ;
66
- import * as dateMath from '../lib/date-math' ;
67
68
import {
68
69
CopyIconButton ,
69
70
formatNanoseconds ,
70
71
TraceSheet as ImportedTraceSheet ,
71
72
} from './target-trace' ;
72
- import {
73
- DurationFilter ,
74
- MultiInputFilter ,
75
- MultiSelectFilter ,
76
- TimelineFilter ,
77
- } from './traces/target-traces-filter' ;
73
+ import { DurationFilter , MultiInputFilter , MultiSelectFilter } from './traces/target-traces-filter' ;
78
74
79
75
const chartConfig = {
80
76
ok : {
@@ -154,16 +150,13 @@ const TrafficBucketDiagram = memo(function Traffic(props: TrafficProps) {
154
150
// Ensure left is always before right
155
151
let left = refAreaLeft ;
156
152
let right = refAreaRight ;
157
- const now = new Date ( ) ;
158
153
159
- if (
160
- parseDate ( left , 'yyyy-MM-dd' , now ) . getTime ( ) > parseDate ( right , 'yyyy-MM-dd' , now ) . getTime ( )
161
- ) {
154
+ if ( new Date ( left ) . getTime ( ) > new Date ( right ) . getTime ( ) ) {
162
155
[ left , right ] = [ right , left ] ;
163
156
}
164
157
165
158
void navigate ( {
166
- search : ( prev : any ) => ( { ...prev , filter : { ... prev . filter , period : [ left , right ] } } ) ,
159
+ search : ( prev : any ) => ( { ...prev , from : left , to : right } ) ,
167
160
} ) ;
168
161
169
162
setRefAreaLeft ( null ) ;
@@ -226,6 +219,7 @@ const TrafficBucketDiagram = memo(function Traffic(props: TrafficProps) {
226
219
/>
227
220
< Bar stackId = "all" dataKey = "ok" fill = "var(--color-ok)" name = "Ok" />
228
221
< Bar stackId = "all" dataKey = "error" fill = "var(--color-error)" name = "Error" />
222
+ // TODO: hide this if there is no filter declared
229
223
< Bar stackId = "all" dataKey = "remaining" fill = "rgba(170,175,180,0.1)" name = "Filtered out" />
230
224
{ refAreaLeft && refAreaRight && (
231
225
< ReferenceArea x1 = { refAreaLeft } x2 = { refAreaRight } fill = "white" fillOpacity = { 0.2 } />
@@ -708,7 +702,6 @@ function LabelWithColor(props: { className: string; children: ReactNode }) {
708
702
}
709
703
710
704
export const TargetTracesFilterState = z . object ( {
711
- period : z . union ( [ z . tuple ( [ z . string ( ) , z . string ( ) ] ) , z . tuple ( [ ] ) ] ) . default ( [ ] ) ,
712
705
duration : z . union ( [ z . tuple ( [ z . number ( ) , z . number ( ) ] ) , z . tuple ( [ ] ) ] ) . default ( [ ] ) ,
713
706
'trace.id' : z . array ( z . string ( ) ) . default ( [ ] ) ,
714
707
'graphql.status' : z . array ( z . string ( ) ) . default ( [ ] ) ,
@@ -818,7 +811,6 @@ function Filters(
818
811
</ Button >
819
812
) : null }
820
813
</ SidebarGroupLabel >
821
- < TimelineFilter value = { filterSelector ( 'period' ) } onChange = { updateFilter ( 'period' ) } />
822
814
< DurationFilter value = { filterSelector ( 'duration' ) } onChange = { updateFilter ( 'duration' ) } />
823
815
< MultiInputFilter
824
816
key = "trace.id"
@@ -1144,15 +1136,14 @@ const TargetTracesFetchMoreTracesQuery = graphql(`
1144
1136
function TargetTracesPageContent ( props : SortProps & PaginationProps & FilterProps ) {
1145
1137
const targetRef = useTargetReference ( ) ;
1146
1138
1147
- const period = useMemo ( ( ) => {
1148
- if ( ! props . filter . period ?. length ) {
1149
- return null ;
1150
- }
1151
- return dateMath . resolveRange ( { from : props . filter . period [ 0 ] , to : props . filter . period [ 1 ] } ) ;
1152
- } , [ props . filter . period ] ) ;
1139
+ const dateRangeController = useDateRangeController ( {
1140
+ // TODO: ressolve retention from account
1141
+ dataRetentionInDays : 365 ,
1142
+ defaultPreset : presetLast7Days ,
1143
+ } ) ;
1153
1144
1154
1145
const filter : GraphQLSchema . TracesFilterInput = {
1155
- period,
1146
+ period : dateRangeController . resolvedRange ,
1156
1147
duration : {
1157
1148
min : props . filter . duration ?. [ 0 ] ?? null ,
1158
1149
max : props . filter . duration ?. [ 1 ] ?? null ,
@@ -1302,10 +1293,17 @@ function TargetTracesPageContent(props: SortProps & PaginationProps & FilterProp
1302
1293
< div className = "py-6" >
1303
1294
< SubPageLayoutHeader
1304
1295
subPageTitle = "Traces"
1305
- description = {
1306
- < >
1307
- < CardDescription > Insights into the requests made to your GraphQL API.</ CardDescription >
1308
- </ >
1296
+ description = "Insights into the requests made to your GraphQL API."
1297
+ sideContent = {
1298
+ < div className = "ml-auto mr-0" >
1299
+ < DateRangePicker
1300
+ validUnits = { [ 'y' , 'M' , 'w' , 'd' , 'h' , 'm' ] }
1301
+ selectedRange = { dateRangeController . selectedPreset . range }
1302
+ startDate = { dateRangeController . startDate }
1303
+ align = "end"
1304
+ onUpdate = { args => dateRangeController . setSelectedPreset ( args . preset ) }
1305
+ />
1306
+ </ div >
1309
1307
}
1310
1308
/>
1311
1309
< SidebarProvider className = "mt-4" >
@@ -1315,7 +1313,7 @@ function TargetTracesPageContent(props: SortProps & PaginationProps & FilterProp
1315
1313
</ SidebarContent >
1316
1314
</ Sidebar >
1317
1315
< SidebarInset className = "bg-transparent" >
1318
- < div className = "flex flex-1 flex-col gap-4 p -4 pt-0" >
1316
+ < div className = "flex flex-1 flex-col gap-4 pl -4 pt-0" >
1319
1317
< div >
1320
1318
< TrafficBucketDiagram buckets = { query . data ?. target ?. tracesStatusBreakdown ?? [ ] } />
1321
1319
</ div >
0 commit comments