Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 597da97

Browse files
committed
feat(site): add workspace health badge to workspace list
Fixes #6461
1 parent b73f9d8 commit 597da97

File tree

4 files changed

+136
-0
lines changed

4 files changed

+136
-0
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import { Story } from "@storybook/react"
2+
import {
3+
MockCanceledWorkspace,
4+
MockCancelingWorkspace,
5+
MockDeletedWorkspace,
6+
MockDeletingWorkspace,
7+
MockFailedWorkspace,
8+
MockPendingWorkspace,
9+
MockStartingWorkspace,
10+
MockStoppedWorkspace,
11+
MockStoppingWorkspace,
12+
MockWorkspace,
13+
MockBuildInfo,
14+
MockEntitlementsWithScheduling,
15+
MockExperiments,
16+
MockAppearance,
17+
} from "testHelpers/entities"
18+
import {
19+
WorkspaceHealthBadge,
20+
WorkspaceHealthBadgeProps,
21+
} from "./WorkspaceHealthBadge"
22+
import { DashboardProviderContext } from "components/Dashboard/DashboardProvider"
23+
24+
export default {
25+
title: "components/WorkspaceHealthBadge",
26+
component: WorkspaceHealthBadge,
27+
}
28+
29+
const MockedAppearance = {
30+
config: MockAppearance,
31+
preview: false,
32+
setPreview: () => null,
33+
save: () => null,
34+
}
35+
36+
const Template: Story<WorkspaceHealthBadgeProps> = (args) => (
37+
<DashboardProviderContext.Provider
38+
value={{
39+
buildInfo: MockBuildInfo,
40+
entitlements: MockEntitlementsWithScheduling,
41+
experiments: MockExperiments,
42+
appearance: MockedAppearance,
43+
}}
44+
>
45+
<WorkspaceHealthBadge {...args} />
46+
</DashboardProviderContext.Provider>
47+
)
48+
49+
export const Running = Template.bind({})
50+
Running.args = {
51+
workspace: MockWorkspace,
52+
}
53+
54+
// TODO(mafredri): Healthyness mocks.
55+
56+
export const Starting = Template.bind({})
57+
Starting.args = {
58+
workspace: MockStartingWorkspace,
59+
}
60+
61+
export const Stopped = Template.bind({})
62+
Stopped.args = {
63+
workspace: MockStoppedWorkspace,
64+
}
65+
66+
export const Stopping = Template.bind({})
67+
Stopping.args = {
68+
workspace: MockStoppingWorkspace,
69+
}
70+
71+
export const Deleting = Template.bind({})
72+
Deleting.args = {
73+
workspace: MockDeletingWorkspace,
74+
}
75+
76+
export const Deleted = Template.bind({})
77+
Deleted.args = {
78+
workspace: MockDeletedWorkspace,
79+
}
80+
81+
export const Canceling = Template.bind({})
82+
Canceling.args = {
83+
workspace: MockCancelingWorkspace,
84+
}
85+
86+
export const Canceled = Template.bind({})
87+
Canceled.args = {
88+
workspace: MockCanceledWorkspace,
89+
}
90+
91+
export const Failed = Template.bind({})
92+
Failed.args = {
93+
workspace: MockFailedWorkspace,
94+
}
95+
96+
export const Pending = Template.bind({})
97+
Pending.args = {
98+
workspace: MockPendingWorkspace,
99+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { Workspace } from "api/typesGenerated"
2+
import { Pill } from "components/Pill/Pill"
3+
import { FC, PropsWithChildren } from "react"
4+
import { ErrorIcon } from "components/Icons/ErrorIcon"
5+
import FavoriteIcon from "@mui/icons-material/Favorite"
6+
import { Maybe } from "components/Conditionals/Maybe"
7+
8+
export type WorkspaceHealthBadgeProps = {
9+
workspace: Workspace
10+
className?: string
11+
}
12+
13+
export const WorkspaceHealthBadge: FC<
14+
PropsWithChildren<WorkspaceHealthBadgeProps>
15+
> = ({ workspace, className }) => {
16+
return (
17+
<Maybe
18+
condition={["starting", "running", "stopping"].includes(
19+
workspace.latest_build.status,
20+
)}
21+
>
22+
<Pill
23+
className={className}
24+
icon={workspace.health.healthy ? <FavoriteIcon /> : <ErrorIcon />}
25+
text={workspace.health.healthy ? "Healthy" : "Unhealthy"}
26+
type={workspace.health.healthy ? "success" : "warning"}
27+
/>
28+
</Maybe>
29+
)
30+
}

site/src/components/WorkspacesTable/WorkspacesRow.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { OutdatedHelpTooltip } from "components/Tooltips/OutdatedHelpTooltip"
1313
import { Avatar } from "components/Avatar/Avatar"
1414
import { Stack } from "components/Stack/Stack"
1515
import { useClickableTableRow } from "hooks/useClickableTableRow"
16+
import { WorkspaceHealthBadge } from "components/WorkspaceHealthBadge/WorkspaceHealthBadge"
1617

1718
export const WorkspacesRow: FC<{
1819
workspace: Workspace
@@ -65,6 +66,10 @@ export const WorkspacesRow: FC<{
6566
<WorkspaceStatusBadge workspace={workspace} />
6667
</TableCell>
6768

69+
<TableCell>
70+
<WorkspaceHealthBadge workspace={workspace} />
71+
</TableCell>
72+
6873
<TableCell>
6974
<div className={styles.arrowCell}>
7075
<KeyboardArrowRight className={styles.arrowRight} />

site/src/components/WorkspacesTable/WorkspacesTable.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const Language = {
1313
template: "Template",
1414
lastUsed: "Last Used",
1515
status: "Status",
16+
health: "Health",
1617
}
1718

1819
export interface WorkspacesTableProps {
@@ -37,6 +38,7 @@ export const WorkspacesTable: FC<WorkspacesTableProps> = ({
3738
<TableCell width="25%">{Language.template}</TableCell>
3839
<TableCell width="20%">{Language.lastUsed}</TableCell>
3940
<TableCell width="15%">{Language.status}</TableCell>
41+
<TableCell width="15%">{Language.health}</TableCell>
4042
<TableCell width="1%" />
4143
</TableRow>
4244
</TableHead>

0 commit comments

Comments
 (0)