From 2d87c2355fa7b3cccca8f612f734ef918416a4e0 Mon Sep 17 00:00:00 2001 From: Abhineet Jain Date: Tue, 12 Jul 2022 01:09:45 +0000 Subject: [PATCH 1/3] feat: show last build initiator for workspaces --- .../components/WorkspaceStats/WorkspaceStats.tsx | 15 +++++++++++++-- .../components/WorkspacesTable/WorkspacesRow.tsx | 6 +++++- .../WorkspacesTable/WorkspacesTable.tsx | 8 +++++--- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/site/src/components/WorkspaceStats/WorkspaceStats.tsx b/site/src/components/WorkspaceStats/WorkspaceStats.tsx index 149cd1a4727b3..96b058b0cd038 100644 --- a/site/src/components/WorkspaceStats/WorkspaceStats.tsx +++ b/site/src/components/WorkspaceStats/WorkspaceStats.tsx @@ -6,7 +6,7 @@ import { Link as RouterLink } from "react-router-dom" import { Workspace } from "../../api/typesGenerated" import { CardRadius, MONOSPACE_FONT_FAMILY } from "../../theme/constants" import { combineClasses } from "../../util/combineClasses" -import { getDisplayStatus } from "../../util/workspace" +import { getDisplayStatus, getDisplayWorkspaceBuildInitiatedBy } from "../../util/workspace" import { WorkspaceSection } from "../WorkspaceSection/WorkspaceSection" const Language = { @@ -17,6 +17,7 @@ const Language = { lastBuiltLabel: "Last Built", outdated: "Outdated", upToDate: "Up to date", + byLabel: "Last Built by", } export interface WorkspaceStatsProps { @@ -27,6 +28,7 @@ export const WorkspaceStats: FC = ({ workspace }) => { const styles = useStyles() const theme = useTheme() const status = getDisplayStatus(theme, workspace.latest_build) + const initiatedBy = getDisplayWorkspaceBuildInitiatedBy(theme, workspace.latest_build) return ( @@ -59,6 +61,15 @@ export const WorkspaceStats: FC = ({ workspace }) => {
+
+ {Language.byLabel} + + + {initiatedBy.initiatedBy} + + +
+
{Language.statusLabel} @@ -88,7 +99,7 @@ const useStyles = makeStyles((theme) => ({ }, statItem: { - minWidth: "20%", + minWidth: "16%", padding: theme.spacing(2), paddingTop: theme.spacing(1.75), }, diff --git a/site/src/components/WorkspacesTable/WorkspacesRow.tsx b/site/src/components/WorkspacesTable/WorkspacesRow.tsx index 82fe62a551bc5..c177c3827c660 100644 --- a/site/src/components/WorkspacesTable/WorkspacesRow.tsx +++ b/site/src/components/WorkspacesTable/WorkspacesRow.tsx @@ -7,7 +7,7 @@ import dayjs from "dayjs" import relativeTime from "dayjs/plugin/relativeTime" import { FC } from "react" import { useNavigate } from "react-router-dom" -import { getDisplayStatus } from "../../util/workspace" +import { getDisplayStatus, getDisplayWorkspaceBuildInitiatedBy } from "../../util/workspace" import { WorkspaceItemMachineRef } from "../../xServices/workspaces/workspacesXService" import { AvatarData } from "../AvatarData/AvatarData" import { TableCellLink } from "../TableCellLink/TableCellLink" @@ -27,6 +27,7 @@ export const WorkspacesRow: FC<{ workspaceRef: WorkspaceItemMachineRef }> = ({ w const [workspaceState, send] = useActor(workspaceRef) const { data: workspace } = workspaceState.context const status = getDisplayStatus(theme, workspace.latest_build) + const initiatedBy = getDisplayWorkspaceBuildInitiatedBy(theme, workspace.latest_build) const workspacePageLink = `/@${workspace.owner_name}/${workspace.name}` return ( @@ -64,6 +65,9 @@ export const WorkspacesRow: FC<{ workspaceRef: WorkspaceItemMachineRef }> = ({ w {dayjs().to(dayjs(workspace.latest_build.created_at))} + + {initiatedBy.initiatedBy} + {status.status} diff --git a/site/src/components/WorkspacesTable/WorkspacesTable.tsx b/site/src/components/WorkspacesTable/WorkspacesTable.tsx index f4fc08dfcfc68..98984c065d5db 100644 --- a/site/src/components/WorkspacesTable/WorkspacesTable.tsx +++ b/site/src/components/WorkspacesTable/WorkspacesTable.tsx @@ -13,6 +13,7 @@ const Language = { version: "Version", lastBuilt: "Last Built", status: "Status", + lastBuiltBy: "By", } export interface WorkspacesTableProps { @@ -26,10 +27,11 @@ export const WorkspacesTable: FC = ({ isLoading, workspace - {Language.name} + {Language.name} {Language.template} - {Language.version} - {Language.lastBuilt} + {Language.version} + {Language.lastBuilt} + {Language.lastBuiltBy} {Language.status} From 2ac3cce9643e57f83122dcb0ddc441cec0dfea65 Mon Sep 17 00:00:00 2001 From: Abhineet Jain Date: Tue, 12 Jul 2022 01:25:48 +0000 Subject: [PATCH 2/3] fix lint --- site/src/components/WorkspaceStats/WorkspaceStats.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/site/src/components/WorkspaceStats/WorkspaceStats.tsx b/site/src/components/WorkspaceStats/WorkspaceStats.tsx index 96b058b0cd038..d1fb1a51e16c8 100644 --- a/site/src/components/WorkspaceStats/WorkspaceStats.tsx +++ b/site/src/components/WorkspaceStats/WorkspaceStats.tsx @@ -64,9 +64,7 @@ export const WorkspaceStats: FC = ({ workspace }) => {
{Language.byLabel} - - {initiatedBy.initiatedBy} - + {initiatedBy.initiatedBy}
From d2d0ba85c379b167eb332a4c06870b36e1c0be48 Mon Sep 17 00:00:00 2001 From: Abhineet Jain Date: Tue, 12 Jul 2022 16:57:36 +0000 Subject: [PATCH 3/3] test util method --- site/src/util/workspace.test.ts | 38 ++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/site/src/util/workspace.test.ts b/site/src/util/workspace.test.ts index 257882815ec9c..bcc8154ca48aa 100644 --- a/site/src/util/workspace.test.ts +++ b/site/src/util/workspace.test.ts @@ -1,7 +1,13 @@ import dayjs from "dayjs" import * as TypesGen from "../api/typesGenerated" import * as Mocks from "../testHelpers/entities" -import { defaultWorkspaceExtension, isWorkspaceDeleted, isWorkspaceOn } from "./workspace" +import { dark } from "../theme/theme" +import { + defaultWorkspaceExtension, + getDisplayWorkspaceBuildInitiatedBy, + isWorkspaceDeleted, + isWorkspaceOn, +} from "./workspace" describe("util > workspace", () => { describe("isWorkspaceOn", () => { @@ -101,4 +107,34 @@ describe("util > workspace", () => { expect(defaultWorkspaceExtension(dayjs(startTime))).toEqual(request) }) }) + + describe("getDisplayWorkspaceBuildInitiatedBy", () => { + it.each<[TypesGen.WorkspaceBuild, string, string]>([ + [Mocks.MockWorkspaceBuild, "#C1C1C1", "TestUser"], + [ + { + ...Mocks.MockWorkspaceBuild, + reason: "autostart", + }, + "#7057FF", + "system/autostart", + ], + [ + { + ...Mocks.MockWorkspaceBuild, + reason: "autostop", + }, + "#7057FF", + "system/autostop", + ], + ])( + `getDisplayWorkspaceBuildInitiatedBy(%p) returns color: %p, initiatedBy: %p`, + (build, color, initiatedBy) => { + expect(getDisplayWorkspaceBuildInitiatedBy(dark, build)).toEqual({ + color: color, + initiatedBy: initiatedBy, + }) + }, + ) + }) })