Skip to content

Commit 00502dc

Browse files
feat: hide parent apps on devcontainer agents (#18120)
**Demo:** https://github.com/user-attachments/assets/d68cbc33-5199-426b-8f97-35ee1c3ae133
1 parent 696d264 commit 00502dc

File tree

4 files changed

+43
-25
lines changed

4 files changed

+43
-25
lines changed

site/src/modules/resources/AgentDevcontainerCard.tsx

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@ import {
1212
HelpTooltipTitle,
1313
HelpTooltipTrigger,
1414
} from "components/HelpTooltip/HelpTooltip";
15+
import { Spinner } from "components/Spinner/Spinner";
1516
import {
1617
Tooltip,
1718
TooltipContent,
1819
TooltipProvider,
1920
TooltipTrigger,
2021
} from "components/Tooltip/Tooltip";
21-
import { ExternalLinkIcon, Loader2Icon } from "lucide-react";
22+
import { ExternalLinkIcon } from "lucide-react";
2223
import type { FC } from "react";
2324
import { useEffect, useState } from "react";
2425
import { portForwardURL } from "utils/portForward";
@@ -95,7 +96,8 @@ export const AgentDevcontainerCard: FC<AgentDevcontainerCardProps> = ({
9596
<header className="flex justify-between items-center mb-4">
9697
<div className="flex items-center gap-2">
9798
<h3 className="m-0 text-xs font-medium text-content-secondary">
98-
{container.name}
99+
dev container:{" "}
100+
<span className="font-semibold">{container.name}</span>
99101
</h3>
100102
{container.devcontainer_dirty && (
101103
<HelpTooltip>
@@ -117,18 +119,11 @@ export const AgentDevcontainerCard: FC<AgentDevcontainerCardProps> = ({
117119
<Button
118120
variant="outline"
119121
size="sm"
120-
className="text-xs font-medium"
121122
onClick={handleRecreateDevcontainer}
122123
disabled={isRecreating}
123124
>
124-
{isRecreating ? (
125-
<>
126-
<Loader2Icon className="mr-2 h-4 w-4 animate-spin" />
127-
Recreating...
128-
</>
129-
) : (
130-
"Recreate"
131-
)}
125+
<Spinner loading={isRecreating} />
126+
Recreate
132127
</Button>
133128

134129
<AgentDevcontainerSSHButton

site/src/modules/resources/AgentRow.stories.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,3 +284,11 @@ export const GroupApp: Story = {
284284
await userEvent.click(canvas.getByText("group"));
285285
},
286286
};
287+
288+
export const Devcontainer: Story = {
289+
beforeEach: () => {
290+
spyOn(API, "getAgentContainers").mockResolvedValue({
291+
containers: [M.MockWorkspaceAgentContainer],
292+
});
293+
},
294+
};

site/src/modules/resources/AgentRow.tsx

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import type { Interpolation, Theme } from "@emotion/react";
2-
import Button from "@mui/material/Button";
32
import Collapse from "@mui/material/Collapse";
43
import Divider from "@mui/material/Divider";
54
import Skeleton from "@mui/material/Skeleton";
@@ -12,6 +11,7 @@ import type {
1211
WorkspaceApp,
1312
} from "api/typesGenerated";
1413
import { isAxiosError } from "axios";
14+
import { Button } from "components/Button/Button";
1515
import { DropdownArrow } from "components/DropdownArrow/DropdownArrow";
1616
import {
1717
DropdownMenu,
@@ -71,7 +71,7 @@ export const AgentRow: FC<AgentRowProps> = ({
7171
const appSections = organizeAgentApps(agent.apps);
7272
const hasAppsToDisplay =
7373
!browser_only || appSections.some((it) => it.apps.length > 0);
74-
const shouldDisplayApps =
74+
const shouldDisplayAgentApps =
7575
(agent.status === "connected" && hasAppsToDisplay) ||
7676
agent.status === "connecting";
7777
const hasVSCodeApp =
@@ -160,6 +160,14 @@ export const AgentRow: FC<AgentRowProps> = ({
160160
},
161161
});
162162

163+
// This is used to show the parent apps of the devcontainer.
164+
const [showParentApps, setShowParentApps] = useState(false);
165+
166+
let shouldDisplayAppsSection = shouldDisplayAgentApps;
167+
if (containers && containers.length > 0 && !showParentApps) {
168+
shouldDisplayAppsSection = false;
169+
}
170+
163171
return (
164172
<Stack
165173
key={agent.id}
@@ -191,7 +199,18 @@ export const AgentRow: FC<AgentRowProps> = ({
191199
)}
192200
</div>
193201

194-
<div css={{ display: "flex" }}>
202+
<div className="flex items-center gap-2">
203+
{containers && containers.length > 0 && (
204+
<Button
205+
variant="outline"
206+
size="sm"
207+
onClick={() => setShowParentApps((show) => !show)}
208+
>
209+
Show parent apps
210+
<DropdownArrow close={showParentApps} margin={false} />
211+
</Button>
212+
)}
213+
195214
{!browser_only && agent.display_apps.includes("ssh_helper") && (
196215
<AgentSSHButton
197216
workspaceName={workspace.name}
@@ -218,9 +237,9 @@ export const AgentRow: FC<AgentRowProps> = ({
218237
</section>
219238
)}
220239

221-
{agent.status === "connected" && (
240+
{shouldDisplayAppsSection && (
222241
<section css={styles.apps}>
223-
{shouldDisplayApps && (
242+
{shouldDisplayAgentApps && (
224243
<>
225244
{showVSCode && (
226245
<VSCodeDesktopButton
@@ -319,11 +338,11 @@ export const AgentRow: FC<AgentRowProps> = ({
319338

320339
<Stack css={{ padding: "12px 16px" }} direction="row" spacing={1}>
321340
<Button
322-
variant="text"
323-
size="small"
324-
startIcon={<DropdownArrow close={showLogs} margin={false} />}
341+
size="sm"
342+
variant="subtle"
325343
onClick={() => setShowLogs((v) => !v)}
326344
>
345+
<DropdownArrow close={showLogs} margin={false} />
327346
Logs
328347
</Button>
329348
<Divider orientation="vertical" variant="middle" flexItem />

site/src/modules/resources/SSHButton/SSHButton.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,9 @@ export const AgentSSHButton: FC<AgentSSHButtonProps> = ({
3535
return (
3636
<Popover>
3737
<PopoverTrigger>
38-
<Button
39-
size="sm"
40-
variant="subtle"
41-
css={{ fontSize: 13, padding: "8px 12px" }}
42-
>
38+
<Button size="sm" variant="subtle">
4339
Connect via SSH
44-
<ChevronDownIcon className="size-4 ml-2" />
40+
<ChevronDownIcon />
4541
</Button>
4642
</PopoverTrigger>
4743

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy