From eca4407e539233bea0457e3ff1e57713b3525176 Mon Sep 17 00:00:00 2001 From: Cian Johnston Date: Tue, 24 Jun 2025 11:43:23 +0100 Subject: [PATCH 1/3] fix: WorkspacesTable: update icons to differentiate between updateAndStart and start --- .../pages/WorkspacesPage/WorkspacesTable.tsx | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/site/src/pages/WorkspacesPage/WorkspacesTable.tsx b/site/src/pages/WorkspacesPage/WorkspacesTable.tsx index 2dc25c0a392dc..22baf597c63b9 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesTable.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesTable.tsx @@ -48,6 +48,8 @@ import { ExternalLinkIcon, FileIcon, StarIcon } from "lucide-react"; import { EllipsisVertical } from "lucide-react"; import { BanIcon, + CirclePlayIcon, + CloudIcon, PlayIcon, RefreshCcwIcon, SquareIcon, @@ -558,7 +560,46 @@ const WorkspaceActionsCell: FC = ({ isLoading={workspaceUpdate.isUpdating} label="Update and start workspace" > - + + + + + )} + + {abilities.actions.includes("updateAndStartRequireActiveVersion") && ( + <> + + + + + + )} + + {abilities.actions.includes("updateAndRestart") && ( + <> + + + + + + )} + + {abilities.actions.includes("updateAndRestartRequireActiveVersion") && ( + <> + + From 42b3539336f4614bb7d4a0734d53097853864453 Mon Sep 17 00:00:00 2001 From: Cian Johnston Date: Tue, 24 Jun 2025 11:43:45 +0100 Subject: [PATCH 2/3] chore: WorkspacePageView: update storybook --- .../WorkspacesPageView.stories.tsx | 58 +++++++++++++++++-- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/site/src/pages/WorkspacesPage/WorkspacesPageView.stories.tsx b/site/src/pages/WorkspacesPage/WorkspacesPageView.stories.tsx index d7527a067c2ad..11120f95ce78b 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesPageView.stories.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesPageView.stories.tsx @@ -33,6 +33,7 @@ import { import { WorkspacesPageView } from "./WorkspacesPageView"; const createWorkspace = ( + name: string, status: WorkspaceStatus, outdated = false, lastUsedAt = "0001-01-01", @@ -42,6 +43,7 @@ const createWorkspace = ( return { ...MockWorkspace, id: uniqueId("workspace"), + name: name, outdated, latest_build: { ...MockWorkspace.latest_build, @@ -59,17 +61,50 @@ const createWorkspace = ( // This is type restricted to prevent future statuses from slipping // through the cracks unchecked! -const workspaces = WorkspaceStatuses.map((status) => createWorkspace(status)); +const workspaces = WorkspaceStatuses.map((status) => + createWorkspace(status, status), +); // Additional Workspaces depending on time const additionalWorkspaces: Record = { today: createWorkspace( + "running", "running", true, dayjs().subtract(3, "hour").toString(), ), - old: createWorkspace("running", true, dayjs().subtract(1, "week").toString()), + old: createWorkspace( + "old", + "running", + true, + dayjs().subtract(1, "week").toString(), + ), + oldStopped: createWorkspace( + "old-stopped", + "stopped", + true, + dayjs().subtract(1, "week").toString(), + ), + oldRequireActiveVersion: { + ...createWorkspace( + "old-require-active-version", + "running", + true, + dayjs().subtract(1, "week").toString(), + ), + template_require_active_version: true, + }, + oldStoppedRequireActiveVersion: { + ...createWorkspace( + "old-stopped-require-active-version", + "stopped", + true, + dayjs().subtract(1, "week").toString(), + ), + template_require_active_version: true, + }, veryOld: createWorkspace( + "very-old-running", "running", true, dayjs().subtract(1, "month").subtract(4, "day").toString(), @@ -78,12 +113,14 @@ const additionalWorkspaces: Record = { const dormantWorkspaces: Record = { dormantNoDelete: createWorkspace( + "dormant-no-delete", "stopped", false, dayjs().subtract(1, "month").toString(), dayjs().subtract(1, "month").toString(), ), dormantAutoDelete: createWorkspace( + "dormant-auto-delete", "stopped", false, dayjs().subtract(1, "month").toString(), @@ -245,7 +282,7 @@ export const UnhealthyWorkspace: Story = { args: { workspaces: [ { - ...createWorkspace("running"), + ...createWorkspace("unhealthy", "running"), health: { healthy: false, failing_agents: [], @@ -282,6 +319,7 @@ export const MultipleApps: Story = { workspaces: [ { ...MockWorkspace, + name: "multiple-apps", latest_build: { ...MockWorkspace.latest_build, resources: [ @@ -315,7 +353,13 @@ export const MultipleApps: Story = { export const ShowOrganizations: Story = { args: { - workspaces: [{ ...MockWorkspace, organization_name: "limbus-co" }], + workspaces: [ + { + ...MockWorkspace, + name: "other-org-workspace", + organization_name: "limbus-co", + }, + ], }, parameters: { @@ -347,6 +391,7 @@ export const WithLatestAppStatus: Story = { workspaces: [ { ...MockWorkspace, + name: "long-app-status", latest_app_status: { ...MockWorkspaceAppStatus, message: @@ -355,10 +400,12 @@ export const WithLatestAppStatus: Story = { }, { ...MockWorkspace, + name: "no-app-status", latest_app_status: null, }, { ...MockWorkspace, + name: "app-status-working", latest_app_status: { ...MockWorkspaceAppStatus, state: "working", @@ -367,6 +414,7 @@ export const WithLatestAppStatus: Story = { }, { ...MockWorkspace, + name: "app-status-failure", latest_app_status: { ...MockWorkspaceAppStatus, state: "failure", @@ -381,6 +429,7 @@ export const WithLatestAppStatus: Story = { resources: [], }, }, + name: "stopped-app-status-failure", latest_app_status: { ...MockWorkspaceAppStatus, state: "failure", @@ -390,6 +439,7 @@ export const WithLatestAppStatus: Story = { }, { ...MockWorkspace, + name: "app-status-working-with-uri", latest_app_status: { ...MockWorkspaceAppStatus, state: "working", From 6f902e0d858a5d11908e8cbe3fa5d042df2dbd71 Mon Sep 17 00:00:00 2001 From: Cian Johnston Date: Tue, 24 Jun 2025 12:23:55 +0100 Subject: [PATCH 3/3] add outdated suffix to oudated workspcaes --- .../WorkspacesPage/WorkspacesPageView.stories.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/site/src/pages/WorkspacesPage/WorkspacesPageView.stories.tsx b/site/src/pages/WorkspacesPage/WorkspacesPageView.stories.tsx index 11120f95ce78b..e0178dea06c09 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesPageView.stories.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesPageView.stories.tsx @@ -68,26 +68,26 @@ const workspaces = WorkspaceStatuses.map((status) => // Additional Workspaces depending on time const additionalWorkspaces: Record = { today: createWorkspace( - "running", + "running-outdated", "running", true, dayjs().subtract(3, "hour").toString(), ), old: createWorkspace( - "old", + "old-outdated", "running", true, dayjs().subtract(1, "week").toString(), ), oldStopped: createWorkspace( - "old-stopped", + "old-stopped-outdated", "stopped", true, dayjs().subtract(1, "week").toString(), ), oldRequireActiveVersion: { ...createWorkspace( - "old-require-active-version", + "old-require-active-version-outdated", "running", true, dayjs().subtract(1, "week").toString(), @@ -96,7 +96,7 @@ const additionalWorkspaces: Record = { }, oldStoppedRequireActiveVersion: { ...createWorkspace( - "old-stopped-require-active-version", + "old-stopped-require-active-version-outdated", "stopped", true, dayjs().subtract(1, "week").toString(), @@ -104,7 +104,7 @@ const additionalWorkspaces: Record = { template_require_active_version: true, }, veryOld: createWorkspace( - "very-old-running", + "very-old-running-outdated", "running", true, dayjs().subtract(1, "month").subtract(4, "day").toString(),