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

Skip to content

Commit d82e201

Browse files
feat(site): make listening ports scrollable (coder#12660)
1 parent 9028717 commit d82e201

File tree

2 files changed

+93
-58
lines changed

2 files changed

+93
-58
lines changed

site/src/modules/resources/PortForwardButton.tsx

+75-58
Original file line numberDiff line numberDiff line change
@@ -220,73 +220,90 @@ export const PortForwardPopoverView: FC<PortForwardPopoverViewProps> = ({
220220
<>
221221
<div
222222
css={{
223-
padding: 20,
223+
maxHeight: 320,
224+
overflowY: "auto",
224225
}}
225226
>
226-
<Stack
227-
direction="row"
228-
justifyContent="space-between"
229-
alignItems="start"
230-
>
231-
<HelpTooltipTitle>Listening ports</HelpTooltipTitle>
232-
<HelpTooltipLink href={docs("/networking/port-forwarding#dashboard")}>
233-
Learn more
234-
</HelpTooltipLink>
235-
</Stack>
236-
<HelpTooltipText css={{ color: theme.palette.text.secondary }}>
237-
{filteredListeningPorts?.length === 0
238-
? "No open ports were detected."
239-
: "The listening ports are exclusively accessible to you."}
240-
</HelpTooltipText>
241-
<form
242-
css={styles.newPortForm}
243-
onSubmit={(e) => {
244-
e.preventDefault();
245-
const formData = new FormData(e.currentTarget);
246-
const port = Number(formData.get("portNumber"));
247-
const url = portForwardURL(
248-
host,
249-
port,
250-
agent.name,
251-
workspaceName,
252-
username,
253-
);
254-
window.open(url, "_blank");
255-
}}
227+
<header
228+
css={(theme) => ({
229+
padding: 20,
230+
paddingBottom: 10,
231+
position: "sticky",
232+
top: 0,
233+
background: theme.palette.background.paper,
234+
// For some reason the Share button label has a higher z-index than
235+
// the header. Probably some tricky stuff from MUI.
236+
zIndex: 1,
237+
})}
256238
>
257-
<input
258-
aria-label="Port number"
259-
name="portNumber"
260-
type="number"
261-
placeholder="Connect to port..."
262-
min={9}
263-
max={65535}
264-
required
265-
css={styles.newPortInput}
266-
/>
267-
<Button
268-
type="submit"
269-
size="small"
270-
variant="text"
271-
css={{
272-
paddingLeft: 12,
273-
paddingRight: 12,
274-
minWidth: 0,
239+
<Stack
240+
direction="row"
241+
justifyContent="space-between"
242+
alignItems="start"
243+
>
244+
<HelpTooltipTitle>Listening ports</HelpTooltipTitle>
245+
<HelpTooltipLink
246+
href={docs("/networking/port-forwarding#dashboard")}
247+
>
248+
Learn more
249+
</HelpTooltipLink>
250+
</Stack>
251+
<HelpTooltipText css={{ color: theme.palette.text.secondary }}>
252+
{filteredListeningPorts?.length === 0
253+
? "No open ports were detected."
254+
: "The listening ports are exclusively accessible to you."}
255+
</HelpTooltipText>
256+
<form
257+
css={styles.newPortForm}
258+
onSubmit={(e) => {
259+
e.preventDefault();
260+
const formData = new FormData(e.currentTarget);
261+
const port = Number(formData.get("portNumber"));
262+
const url = portForwardURL(
263+
host,
264+
port,
265+
agent.name,
266+
workspaceName,
267+
username,
268+
);
269+
window.open(url, "_blank");
275270
}}
276271
>
277-
<OpenInNewOutlined
272+
<input
273+
aria-label="Port number"
274+
name="portNumber"
275+
type="number"
276+
placeholder="Connect to port..."
277+
min={9}
278+
max={65535}
279+
required
280+
css={styles.newPortInput}
281+
/>
282+
<Button
283+
type="submit"
284+
size="small"
285+
variant="text"
278286
css={{
279-
flexShrink: 0,
280-
width: 14,
281-
height: 14,
282-
color: theme.palette.text.primary,
287+
paddingLeft: 12,
288+
paddingRight: 12,
289+
minWidth: 0,
283290
}}
284-
/>
285-
</Button>
286-
</form>
291+
>
292+
<OpenInNewOutlined
293+
css={{
294+
flexShrink: 0,
295+
width: 14,
296+
height: 14,
297+
color: theme.palette.text.primary,
298+
}}
299+
/>
300+
</Button>
301+
</form>
302+
</header>
287303
<div
288304
css={{
289-
paddingTop: 10,
305+
padding: 20,
306+
paddingTop: 0,
290307
}}
291308
>
292309
{filteredListeningPorts?.map((port) => {

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

+18
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,24 @@ export const WithPorts: Story = {
5151
},
5252
};
5353

54+
export const WithManyPorts: Story = {
55+
args: {
56+
listeningPorts: Array.from({ length: 20 }).map((_, i) => ({
57+
process_name: `port-${i}`,
58+
network: "",
59+
port: 3000 + i,
60+
})),
61+
},
62+
parameters: {
63+
queries: [
64+
{
65+
key: ["sharedPorts", MockWorkspace.id],
66+
data: MockSharedPortsResponse,
67+
},
68+
],
69+
},
70+
};
71+
5472
export const Empty: Story = {
5573
args: {
5674
listeningPorts: [],

0 commit comments

Comments
 (0)