diff --git a/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx b/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx index 9c8ce12168..f82f1ccae5 100644 --- a/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx @@ -277,3 +277,47 @@ export const InvalidTimeRange: Story = { ], }, }; + +// A template with no agent scripts. +export const NoAgentScripts: Story = { + args: { + provisionerTimings: [ + { + ...WorkspaceTimingsResponse.provisioner_timings[0], + stage: "init", + started_at: "2025-01-01T00:00:00Z", + ended_at: "2025-01-01T00:01:00Z", + }, + { + ...WorkspaceTimingsResponse.provisioner_timings[0], + stage: "plan", + started_at: "2025-01-01T00:01:00Z", + ended_at: "0001-01-01T00:00:00Z", + }, + { + ...WorkspaceTimingsResponse.provisioner_timings[0], + stage: "graph", + started_at: "0001-01-01T00:00:00Z", + ended_at: "2025-01-01T00:03:00Z", + }, + { + ...WorkspaceTimingsResponse.provisioner_timings[0], + stage: "apply", + started_at: "2025-01-01T00:03:00Z", + ended_at: "2025-01-01T00:04:00Z", + }, + ], + agentConnectionTimings: [ + { + started_at: "2025-01-01T00:05:00Z", + ended_at: "2025-01-01T00:06:00Z", + stage: "connect", + workspace_agent_id: "67e37a9d-ccac-497e-8f48-4093bcc4f3e7", + workspace_agent_name: "main", + }, + ], + agentScriptTimings: [ + // No agent scripts in the template + ], + }, +}; diff --git a/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.tsx b/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.tsx index 7614013c9b..b4cffd4d71 100644 --- a/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.tsx +++ b/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.tsx @@ -69,8 +69,10 @@ export const WorkspaceTimings: FC = ({ // filled in different moments. const isLoading = [ provisionerTimings, - agentScriptTimings, agentConnectionTimings, + // agentScriptTimings might be an empty array if there are no scripts to run. + // Only provisionerTimings and agentConnectionTimings are guaranteed to have + // at least one entry. ].some((t) => t.length === 0); // Each agent connection timing is a stage in the timeline to make it easier