Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitce134bc

Browse files
authored
fix: handle invalid provisioning timings in ui (#18058)
Relates to#15432* Adds a storybook entry for zero values in provisioner timings.* Coerces a 'zero' start time to an 'instant'.* Improves timing chart handling for large timeframes. Previously, thiswould have caused the tab to run out of memory when encountering a`time.Time{}`.* Render 'instants' as 'invalid' in timing chart.
1 parent565fad5 commitce134bc

File tree

3 files changed

+99
-4
lines changed

3 files changed

+99
-4
lines changed

‎site/src/modules/workspaces/WorkspaceTiming/Chart/utils.ts

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
importdayjsfrom"dayjs";
2+
13
exporttypeTimeRange={
24
startedAt:Date;
35
endedAt:Date;
@@ -11,12 +13,26 @@ export const mergeTimeRanges = (ranges: TimeRange[]): TimeRange => {
1113
constsortedDurations=ranges
1214
.slice()
1315
.sort((a,b)=>a.startedAt.getTime()-b.startedAt.getTime());
14-
conststart=sortedDurations[0].startedAt;
1516

1617
constsortedEndDurations=[...ranges].sort(
1718
(a,b)=>a.endedAt.getTime()-b.endedAt.getTime(),
1819
);
1920
constend=sortedEndDurations[sortedEndDurations.length-1].endedAt;
21+
22+
// Ref: #15432: if there start time is the 'zero' value, default
23+
// to the end time. This will result in an 'instant'.
24+
letstart:Date=end;
25+
for(constrofsortedDurations){
26+
if(
27+
Number.isNaN(r.startedAt.getTime())||
28+
r.startedAt.getUTCFullYear()<=1
29+
){
30+
continue;// Skip invalid start dates.
31+
}
32+
start=r.startedAt;
33+
break;
34+
}
35+
2036
return{startedAt:start,endedAt:end};
2137
};
2238

@@ -33,7 +49,12 @@ const second = 1_000;
3349
constminute=60*second;
3450
consthour=60*minute;
3551
constday=24*hour;
52+
constweek=7*day;
53+
constyear=365*day;// Unlikely, and leap years won't matter here.
54+
3655
constscales=[
56+
year,
57+
week,
3758
day,
3859
hour,
3960
5*minute,
@@ -44,6 +65,8 @@ const scales = [
4465
100,
4566
];
4667

68+
constzeroTime:Date=dayjs("0001-01-01T00:00:00Z").toDate();
69+
4770
constpickScale=(totalTime:number):number=>{
4871
for(constsofscales){
4972
if(totalTime>s){
@@ -64,6 +87,7 @@ export const formatTime = (time: number): string => {
6487
constabsTime=Math.abs(time);
6588
letunit="";
6689
letvalue=0;
90+
letfrac=2;
6791

6892
if(absTime<second){
6993
value=time;
@@ -74,15 +98,26 @@ export const formatTime = (time: number): string => {
7498
}elseif(absTime<hour){
7599
value=time/minute;
76100
unit="m";
101+
frac=1;
77102
}elseif(absTime<day){
78103
value=time/hour;
79104
unit="h";
80-
}else{
105+
frac=0;
106+
}elseif(absTime<week){
81107
value=time/day;
82108
unit="d";
109+
frac=0;
110+
}elseif(absTime<year){
111+
value=time/week;
112+
unit="w";
113+
frac=0;
114+
}else{
115+
value=time/year;
116+
unit="y";
117+
frac=0;
83118
}
84119
return`${value.toLocaleString(undefined,{
85-
maximumFractionDigits:2,
120+
maximumFractionDigits:frac,
86121
})}${unit}`;
87122
};
88123

‎site/src/modules/workspaces/WorkspaceTiming/StagesChart.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ export const StagesChart: FC<StagesChartProps> = ({
141141

142142
constvalue=calcDuration(t.range);
143143
constoffset=calcOffset(t.range,totalRange);
144+
constvalidDuration=value>0&&!Number.isNaN(value);
144145

145146
return(
146147
<XAxisRow
@@ -172,7 +173,17 @@ export const StagesChart: FC<StagesChartProps> = ({
172173
) :(
173174
<Barscale={scale}value={value}offset={offset}/>
174175
)}
175-
{formatTime(calcDuration(t.range))}
176+
{validDuration ?(
177+
<span>{formatTime(value)}</span>
178+
) :(
179+
<span
180+
css={(theme)=>({
181+
color:theme.palette.error.main,
182+
})}
183+
>
184+
Invalid
185+
</span>
186+
)}
176187
</XAxisRow>
177188
);
178189
})}

‎site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,3 +228,52 @@ export const MissedAction: Story = {
228228
awaitcanvas.findByText("missed action");
229229
},
230230
};
231+
232+
// Ref: #15432
233+
exportconstInvalidTimeRange:Story={
234+
args:{
235+
provisionerTimings:[
236+
{
237+
...WorkspaceTimingsResponse.provisioner_timings[0],
238+
stage:"init",
239+
started_at:"2025-01-01T00:00:00Z",
240+
ended_at:"2025-01-01T00:01:00Z",
241+
},
242+
{
243+
...WorkspaceTimingsResponse.provisioner_timings[0],
244+
stage:"plan",
245+
started_at:"2025-01-01T00:01:00Z",
246+
ended_at:"0001-01-01T00:00:00Z",
247+
},
248+
{
249+
...WorkspaceTimingsResponse.provisioner_timings[0],
250+
stage:"graph",
251+
started_at:"0001-01-01T00:00:00Z",
252+
ended_at:"2025-01-01T00:03:00Z",
253+
},
254+
{
255+
...WorkspaceTimingsResponse.provisioner_timings[0],
256+
stage:"apply",
257+
started_at:"2025-01-01T00:03:00Z",
258+
ended_at:"2025-01-01T00:04:00Z",
259+
},
260+
],
261+
agentConnectionTimings:[
262+
{
263+
started_at:"2025-01-01T00:05:00Z",
264+
ended_at:"2025-01-01T00:06:00Z",
265+
stage:"connect",
266+
workspace_agent_id:"67e37a9d-ccac-497e-8f48-4093bcc4f3e7",
267+
workspace_agent_name:"main",
268+
},
269+
],
270+
agentScriptTimings:[
271+
{
272+
...WorkspaceTimingsResponse.agent_script_timings[0],
273+
display_name:"Startup Script 1",
274+
started_at:"0001-01-01T00:00:00Z",
275+
ended_at:"2025-01-01T00:10:00Z",
276+
},
277+
],
278+
},
279+
};

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp