@@ -46,6 +46,7 @@ export const WorkspaceTimings: FC<WorkspaceTimingsProps> = ({
46
46
provisionerTimings,
47
47
} ) => {
48
48
const [ view , setView ] = useState < TimingView > ( { name : "basic" } ) ;
49
+ const data = selectChartData ( view , provisionerTimings ) ;
49
50
50
51
return (
51
52
< div css = { styles . panelBody } >
@@ -80,11 +81,28 @@ export const WorkspaceTimings: FC<WorkspaceTimingsProps> = ({
80
81
} ) ) ;
81
82
} }
82
83
/>
84
+
85
+ < ul css = { styles . legends } >
86
+ { Object . entries ( colorsByActions ) . map ( ( [ action , colors ] ) => (
87
+ < li key = { action } css = { styles . legend } >
88
+ < div
89
+ css = { [
90
+ styles . legendSquare ,
91
+ {
92
+ borderColor : colors ?. border ,
93
+ backgroundColor : colors ?. fill ,
94
+ } ,
95
+ ] }
96
+ />
97
+ { action }
98
+ </ li >
99
+ ) ) }
100
+ </ ul >
83
101
</ div >
84
102
) }
85
103
86
104
< Chart
87
- data = { selectChartData ( view , provisionerTimings ) }
105
+ data = { data }
88
106
onBarClick = { ( stage , section ) => {
89
107
setView ( {
90
108
name : "advanced" ,
@@ -98,10 +116,21 @@ export const WorkspaceTimings: FC<WorkspaceTimingsProps> = ({
98
116
) ;
99
117
} ;
100
118
119
+ const selectActions = ( timings : readonly ProvisionerTiming [ ] ) => {
120
+ return [ ...new Set ( timings . map ( ( t ) => t . action ) ) ] ;
121
+ } ;
122
+
101
123
export const selectChartData = (
102
124
view : TimingView ,
103
125
timings : readonly ProvisionerTiming [ ] ,
104
126
) => {
127
+ const extractDuration = ( t : ProvisionerTiming ) : Duration => {
128
+ return {
129
+ startedAt : new Date ( t . started_at ) ,
130
+ endedAt : new Date ( t . ended_at ) ,
131
+ } ;
132
+ } ;
133
+
105
134
switch ( view . name ) {
106
135
case "basic" : {
107
136
const groupedTimingsByStage = provisioningStages . map ( ( stage ) => {
@@ -159,13 +188,6 @@ export const selectChartData = (
159
188
}
160
189
} ;
161
190
162
- const extractDuration = ( t : ProvisionerTiming ) : Duration => {
163
- return {
164
- startedAt : new Date ( t . started_at ) ,
165
- endedAt : new Date ( t . ended_at ) ,
166
- } ;
167
- } ;
168
-
169
191
const styles = {
170
192
panelBody : {
171
193
display : "flex" ,
@@ -176,6 +198,7 @@ const styles = {
176
198
borderBottom : `1px solid ${ theme . palette . divider } ` ,
177
199
fontSize : 12 ,
178
200
display : "flex" ,
201
+ flexAlign : "stretch" ,
179
202
} ) ,
180
203
breadcrumbs : ( theme ) => ( {
181
204
listStyle : "none" ,
@@ -211,6 +234,7 @@ const styles = {
211
234
} ) ,
212
235
breadcrumbButton : ( theme ) => ( {
213
236
background : "none" ,
237
+ padding : 0 ,
214
238
border : "none" ,
215
239
fontSize : "inherit" ,
216
240
color : "inherit" ,
@@ -221,7 +245,7 @@ const styles = {
221
245
} ,
222
246
} ) ,
223
247
searchField : ( theme ) => ( {
224
- width : "100% " ,
248
+ flex : "1 " ,
225
249
226
250
"& fieldset" : {
227
251
border : 0 ,
@@ -234,4 +258,27 @@ const styles = {
234
258
fontSize : 12 ,
235
259
} ,
236
260
} ) ,
261
+ legends : {
262
+ listStyle : "none" ,
263
+ margin : 0 ,
264
+ padding : 0 ,
265
+ display : "flex" ,
266
+ alignItems : "center" ,
267
+ gap : 24 ,
268
+ paddingRight : YAxisSidePadding ,
269
+ } ,
270
+ legend : {
271
+ fontWeight : 500 ,
272
+ display : "flex" ,
273
+ alignItems : "center" ,
274
+ gap : 8 ,
275
+ lineHeight : 1 ,
276
+ } ,
277
+ legendSquare : ( theme ) => ( {
278
+ width : 18 ,
279
+ height : 18 ,
280
+ borderRadius : 4 ,
281
+ border : `1px solid ${ theme . palette . divider } ` ,
282
+ backgroundColor : theme . palette . background . default ,
283
+ } ) ,
237
284
} satisfies Record < string , Interpolation < Theme > > ;
0 commit comments