Skip to content

Commit 135d342

Browse files
authored
adds VS Code launch button (#5)
* adds VSCode connection button * removes nonfunctional password param from uri * make clipboard toast easier to see
1 parent d456254 commit 135d342

5 files changed

Lines changed: 116 additions & 18 deletions

File tree

ui/package-lock.json

Lines changed: 40 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ui/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"@mui/icons-material": "6.1.9",
1414
"@mui/material": "6.1.9",
1515
"react": "^18.2.0",
16+
"react-device-detect": "^2.2.3",
1617
"react-dom": "^18.2.0"
1718
},
1819
"scripts": {
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import { osName } from 'react-device-detect';
2+
import { IconButton, Tooltip } from '@mui/material';
3+
import { DvrRounded } from '@mui/icons-material';
4+
import { copyToClipboard } from './ContainerList';
5+
6+
// copies the password to the clipboard, then opens the connectionURI
7+
const openURI = (connectionURI: string, saPassword: string) => {
8+
copyToClipboard(saPassword);
9+
// wait 1 second
10+
setTimeout(() => {
11+
window.location.href = connectionURI;
12+
}, 1000);
13+
}
14+
15+
export const ConnectionOptions = ({ container, trackEvent }) => {
16+
17+
if (osName !== "Windows") {
18+
return (
19+
<>
20+
<Tooltip title="Connect in Azure Data Studio">
21+
<IconButton size="small" aria-label='connect' disabled={!(container.Status === "running")}
22+
onClick={() => {
23+
trackEvent('OpenADS', { containerId: container.Id });
24+
openURI(container.adsConnectionURI(), container.SApassword);
25+
}}>
26+
<DvrRounded />
27+
</IconButton>
28+
</Tooltip>
29+
<Tooltip title="Connect in VS Code">
30+
<IconButton size="small" aria-label='connect' disabled={!(container.Status === "running")}
31+
onClick={() => {
32+
trackEvent('OpenVSC', { containerId: container.Id });
33+
openURI(container.vscConnectionURI(), container.SApassword);
34+
}}>
35+
<DvrRounded />
36+
</IconButton>
37+
</Tooltip>
38+
</>
39+
);
40+
} else {
41+
return (
42+
<>
43+
<Tooltip title="Connect in Azure Data Studio">
44+
<IconButton size="small" aria-label='connect' disabled={!(container.Status === "running")}
45+
onClick={() => {
46+
trackEvent('OpenADS', { containerId: container.Id });
47+
openURI(container.adsConnectionURI(), container.SApassword);
48+
}}>
49+
<DvrRounded />
50+
</IconButton>
51+
</Tooltip>
52+
<Tooltip title="Connect in VS Code">
53+
<IconButton size="small" aria-label='connect' disabled={!(container.Status === "running")}
54+
onClick={() => {
55+
trackEvent('OpenVSC', { containerId: container.Id });
56+
openURI(container.vscConnectionURI(), container.SApassword);
57+
}}>
58+
<DvrRounded />
59+
</IconButton>
60+
</Tooltip>
61+
</>
62+
);
63+
}
64+
}

ui/src/components/ContainerList.tsx

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,22 @@
11
import * as React from 'react';
22
import { AppBar, Box, Button, Chip, CircularProgress, Collapse, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, FormControl, IconButton, InputLabel, List, ListItem, ListItemIcon, ListItemText, OutlinedInput, Stack, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Toolbar, Tooltip, Typography } from '@mui/material';
3-
import { AddCircleRounded, ArticleRounded, ContentCopyRounded, StopRounded, PlayArrowRounded, KeyboardArrowUpRounded, KeyboardArrowDownRounded, TerminalRounded, DvrRounded, CloseRounded, DeleteRounded } from "@mui/icons-material";
3+
import { AddCircleRounded, ArticleRounded, ContentCopyRounded, StopRounded, PlayArrowRounded, KeyboardArrowUpRounded, KeyboardArrowDownRounded, TerminalRounded, CloseRounded, DeleteRounded } from "@mui/icons-material";
44

55
import { SqlContainer } from '../models/SqlContainer';
6+
import { ConnectionOptions } from './ConnectionOptions';
67
import { useDockerDesktopClient } from '../App';
78

8-
const copyToClipboard = (text: string) => {
9+
export const copyToClipboard = (text: string) => {
910
navigator.clipboard.writeText(text);
11+
const ddClient = useDockerDesktopClient();
12+
ddClient.desktopUI.toast.success("Password copied to clipboard");
1013
}
1114

1215
const navigateToContainer = (containerId: string) => {
1316
const ddClient = useDockerDesktopClient();
1417
ddClient.desktopUI.navigate.viewContainerLogs(containerId);
1518
}
1619

17-
// copies the password to the clipboard, then opens the connectionURI
18-
const openADS = (connectionURI: string, saPassword: string) => {
19-
copyToClipboard(saPassword);
20-
window.location.href = connectionURI;
21-
}
22-
2320
var ContainerStatus = ({ status }) => {
2421
if (status === "running") {
2522
return (
@@ -205,15 +202,7 @@ var ContainerRow = ({ container, startContainer, stopContainer, deleteContainer,
205202
<ContentCopyRounded />
206203
</IconButton>
207204
</Tooltip>
208-
<Tooltip title="Connect in Azure Data Studio">
209-
<IconButton size="small" aria-label='connect' disabled={!(container.Status === "running")}
210-
onClick={() => {
211-
trackEvent('OpenADS', { containerId: container.Id });
212-
openADS(container.adsConnectionURI(), container.SApassword);
213-
}}>
214-
<DvrRounded />
215-
</IconButton>
216-
</Tooltip>
205+
<ConnectionOptions container={container} trackEvent={trackEvent} />
217206
<Tooltip title="Container logs">
218207
<IconButton size="small" aria-label='logs' onClick={() => {
219208
trackEvent('ViewLogs', { containerId: container.Id });

ui/src/models/SqlContainer.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,11 @@ export class SqlContainer {
4141
}
4242

4343
public adsConnectionURI(): string {
44-
return `azuredatastudio://openConnectionDialog?connectionName=${this.Name}&server=localhost,${this.Port1433}&authenticationType=SqlLogin&user=sa&password=${this.SApassword}&database=master&connectionProperties={"trustServerCertificate":"true"}`;
44+
return `azuredatastudio://openConnectionDialog?connectionName=${this.Name}&server=localhost,${this.Port1433}&authenticationType=SqlLogin&user=sa&database=master&connectionProperties={"trustServerCertificate":"true"}`;
45+
}
46+
47+
public vscConnectionURI(): string {
48+
return `vscode://ms-mssql.mssql/connect?profileName=${this.Name}&server=localhost,${this.Port1433}&database=master&authenticationType=SqlLogin&user=sa&trustServerCertificate=true&persistSecurityInfo=true&savePassword=true`;
4549
}
4650

4751
}

0 commit comments

Comments
 (0)