@@ -2,15 +2,17 @@ import { SessionDetails } from 'data-services/models/session-details'
2
2
import { TimelineTick } from 'data-services/models/timeline-tick'
3
3
import { useRef } from 'react'
4
4
import Plot from 'react-plotly.js'
5
+ import { getCompactTimespanString } from 'utils/date/getCompactTimespanString/getCompactTimespanString'
5
6
import { useDynamicPlotWidth } from './useDynamicPlotWidth'
7
+ import { findClosestCaptureId } from '../session-captures-slider/utils'
6
8
7
9
const fontFamily = 'Mazzard, sans-serif'
8
10
const lineColorCaptures = '#4E4F57'
9
11
const lineColorDetections = '#5F8AC6'
12
+ const spikeColor = '#FFFFFF'
10
13
const textColor = '#303137'
11
- const tooltipBgColor = '#ffffff '
14
+ const tooltipBgColor = '#FFFFFF '
12
15
const tooltipBorderColor = '#303137'
13
- const gridLineColor = '#4E4F57'
14
16
15
17
export const ActivityPlot = ( {
16
18
session,
@@ -48,8 +50,7 @@ export const ActivityPlot = ({
48
50
( timelineTick ) => new Date ( timelineTick . startDate )
49
51
) ,
50
52
y : timeline . map ( ( timelineTick ) => timelineTick . numCaptures ) ,
51
- text : timeline . map ( ( timelineTick ) => timelineTick . tooltip ) ,
52
- hovertemplate : '%{text}<extra></extra>' ,
53
+ hovertemplate : 'Captures: %{y}<extra></extra>' ,
53
54
fill : 'tozeroy' ,
54
55
type : 'scatter' ,
55
56
mode : 'lines' ,
@@ -62,8 +63,7 @@ export const ActivityPlot = ({
62
63
( timelineTick ) => new Date ( timelineTick . startDate )
63
64
) ,
64
65
y : timeline . map ( ( timelineTick ) => timelineTick . avgDetections ) ,
65
- text : timeline . map ( ( timelineTick ) => timelineTick . tooltip ) ,
66
- hovertemplate : '%{text}<extra></extra>' ,
66
+ hovertemplate : 'Avg. detections: %{y}<extra></extra>' ,
67
67
fill : 'tozeroy' ,
68
68
type : 'scatter' ,
69
69
mode : 'lines' ,
@@ -84,6 +84,7 @@ export const ActivityPlot = ({
84
84
t : 0 ,
85
85
pad : 0 ,
86
86
} ,
87
+ hovermode : 'x unified' ,
87
88
// y-axis for captures
88
89
yaxis : {
89
90
showgrid : false ,
@@ -106,16 +107,26 @@ export const ActivityPlot = ({
106
107
overlaying : 'y' ,
107
108
} ,
108
109
xaxis : {
110
+ fixedrange : true ,
111
+ range : [ new Date ( session . startDate ) , new Date ( session . endDate ) ] ,
112
+ showgrid : false ,
109
113
showline : false ,
110
- showgrid : true ,
111
- griddash : 'dot' ,
112
- gridwidth : 1 ,
113
- gridcolor : gridLineColor ,
114
114
showticklabels : false ,
115
+ spikecolor : spikeColor ,
116
+ spikethickness : - 2 ,
117
+ ticktext : timeline . map ( ( timelineTick ) =>
118
+ getCompactTimespanString ( {
119
+ date1 : timelineTick . startDate ,
120
+ date2 : timelineTick . endDate ,
121
+ options : {
122
+ second : true ,
123
+ } ,
124
+ } )
125
+ ) ,
126
+ tickvals : timeline . map (
127
+ ( timelineTick ) => new Date ( timelineTick . startDate )
128
+ ) ,
115
129
zeroline : false ,
116
- fixedrange : true ,
117
- range : [ new Date ( session . startDate ) , new Date ( session . endDate ) ] ,
118
- dtick : 3600000 , // milliseconds in an hour
119
130
} ,
120
131
hoverlabel : {
121
132
bgcolor : tooltipBgColor ,
@@ -134,8 +145,17 @@ export const ActivityPlot = ({
134
145
onClick = { ( data ) => {
135
146
const timelineTickIndex = data . points [ 0 ] . pointIndex
136
147
const timelineTick = timeline [ timelineTickIndex ]
137
- if ( timelineTick ?. representativeCaptureId ) {
138
- setActiveCaptureId ( timelineTick . representativeCaptureId )
148
+
149
+ if ( ! timelineTick ) {
150
+ return
151
+ }
152
+
153
+ const captureId =
154
+ timelineTick . representativeCaptureId ??
155
+ findClosestCaptureId ( timeline , timelineTick . startDate )
156
+
157
+ if ( captureId ) {
158
+ setActiveCaptureId ( captureId )
139
159
}
140
160
} }
141
161
/>
0 commit comments