feat: host manager improvements and added over electron files

This commit is contained in:
LukeGus
2026-05-20 13:58:15 -05:00
parent d3fa8c4420
commit ec69c338da
12 changed files with 535 additions and 350 deletions
+1 -1
View File
@@ -209,7 +209,7 @@ export function AppRail({
{username || "User"}
</span>
<span className="text-[10px] text-muted-foreground leading-tight whitespace-nowrap">
Administrator
{isAdmin ? t("nav.roleAdministrator") : t("nav.roleUser")}
</span>
</div>
</button>
+141 -56
View File
@@ -64,6 +64,7 @@ import {
} from "@/components/dropdown-menu";
import { toast } from "sonner";
import { SectionCard, SettingRow, FakeSwitch } from "@/components/section-card";
import { TerminalPreview } from "@/features/terminal/TerminalPreview";
import {
getSSHHosts,
getCredentials,
@@ -2047,58 +2048,15 @@ function HostEditor({
<label className="text-[10px] font-bold uppercase tracking-widest text-muted-foreground">
{t("hosts.themePreview")}
</label>
<div className="w-full bg-[#111210] border border-border font-mono text-xs leading-relaxed overflow-hidden">
<div className="px-3 py-2.5 flex flex-col gap-0.5">
<div>
<span className="text-[#5af78e]">deploy@web-01</span>
<span className="text-[#555]">:</span>
<span className="text-[#57c7ff]">~</span>
<span className="text-[#555]">$</span>
<span className="text-[#f1f1f0]"> ls -la</span>
</div>
<div className="text-[#555]">total 48</div>
<div>
<span className="text-[#9aedfe]">drwxr-xr-x</span>
<span className="text-[#555]">
{" "}
5 deploy deploy 4096 May 1 09:12{" "}
</span>
<span className="text-[#57c7ff]">.</span>
</div>
<div>
<span className="text-[#9aedfe]">drwxr-xr-x</span>
<span className="text-[#555]">
{" "}
3 root root 4096 Apr 15 18:44{" "}
</span>
<span className="text-[#57c7ff]">..</span>
</div>
<div>
<span className="text-[#9aedfe]">-rw-r--r--</span>
<span className="text-[#555]">
{" "}
1 deploy deploy 220 Apr 15 18:44{" "}
</span>
<span className="text-[#f1f1f0]">.bash_logout</span>
</div>
<div>
<span className="text-[#9aedfe]">-rwxr-xr-x</span>
<span className="text-[#555]">
{" "}
1 deploy deploy 8192 May 1 08:55{" "}
</span>
<span className="text-[#5af78e]">deploy.sh</span>
</div>
<div className="flex items-center gap-0.5 mt-0.5">
<span className="text-[#5af78e]">deploy@web-01</span>
<span className="text-[#555]">:</span>
<span className="text-[#57c7ff]">~</span>
<span className="text-[#555]">$</span>
<span className="text-[#f1f1f0]"> </span>
<span className="inline-block w-1.5 h-3.5 bg-[#f1f1f0] animate-pulse" />
</div>
</div>
</div>
<TerminalPreview
theme={form.theme}
fontSize={form.fontSize}
fontFamily={form.fontFamily}
cursorStyle={form.cursorStyle}
cursorBlink={form.cursorBlink}
letterSpacing={form.letterSpacing}
lineHeight={form.lineHeight}
/>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div className="flex flex-col gap-1.5">
@@ -5506,19 +5464,146 @@ export function HostManager({
{
hosts: [
{
name: "My Server",
ip: "192.168.1.1",
username: "root",
port: 22,
name: "Web Server (Production)",
ip: "192.168.1.100",
username: "admin",
authType: "password",
password: "your_secure_password_here",
folder: "Production",
tags: ["web", "production", "nginx"],
pin: true,
notes: "Main production web server running Nginx",
enableSsh: true,
enableRdp: false,
enableVnc: false,
enableTelnet: false,
sshPort: 22,
enableTerminal: true,
enableTunnel: false,
enableFileManager: true,
enableDocker: false,
defaultPath: "/var/www",
},
{
name: "Database Server",
ip: "192.168.1.101",
username: "dbadmin",
authType: "key",
key: "-----BEGIN OPENSSH PRIVATE KEY-----\nYour SSH private key content here\n-----END OPENSSH PRIVATE KEY-----",
keyPassword: "optional_key_passphrase",
keyType: "ssh-ed25519",
folder: "Production",
tags: ["database", "production", "postgresql"],
enableSsh: true,
enableRdp: false,
enableVnc: false,
enableTelnet: false,
sshPort: 22,
enableTerminal: true,
enableTunnel: true,
enableFileManager: false,
enableDocker: false,
tunnelConnections: [
{
sourcePort: 5432,
endpointPort: 5432,
endpointHost: "localhost",
maxRetries: 3,
retryInterval: 10,
autoStart: true,
},
],
statsConfig: {
enabledWidgets: ["cpu", "memory", "disk", "network", "uptime"],
statusCheckEnabled: true,
statusCheckInterval: 30,
metricsEnabled: true,
metricsInterval: 30,
},
},
{
name: "Development Server",
ip: "192.168.1.102",
username: "developer",
authType: "password",
password: "dev_password",
folder: "Development",
tags: ["dev", "testing"],
enableSsh: true,
enableRdp: false,
enableVnc: false,
enableTelnet: false,
sshPort: 2222,
enableTerminal: true,
enableTunnel: false,
enableFileManager: true,
enableDocker: true,
defaultPath: "/home/developer",
},
{
name: "Windows Server 2022",
ip: "192.168.1.200",
username: "Administrator",
folder: "Remote Desktop",
tags: ["rdp", "windows", "production"],
enableSsh: false,
enableRdp: true,
enableVnc: false,
enableTelnet: false,
rdpPort: 3389,
rdpUser: "Administrator",
rdpPassword: "windows_password",
rdpDomain: "COMPANY",
rdpSecurity: "nla",
rdpIgnoreCert: false,
},
{
name: "Ubuntu Desktop",
ip: "192.168.1.201",
username: "vncuser",
folder: "Remote Desktop",
tags: ["vnc", "linux", "desktop"],
enableSsh: false,
enableRdp: false,
enableVnc: true,
enableTelnet: false,
vncPort: 5900,
vncPassword: "vnc_password",
},
{
name: "Network Switch",
ip: "192.168.1.254",
username: "admin",
folder: "Infrastructure",
tags: ["telnet", "network", "switch"],
enableSsh: false,
enableRdp: false,
enableVnc: false,
enableTelnet: true,
telnetPort: 23,
telnetUser: "admin",
telnetPassword: "switch_password",
},
{
name: "Server with SOCKS5 Proxy",
ip: "10.10.10.100",
username: "proxyuser",
authType: "password",
password: "secure_password",
folder: "Proxied Hosts",
tags: ["proxy", "socks5"],
enableSsh: true,
enableRdp: false,
enableVnc: false,
enableTelnet: false,
sshPort: 22,
enableTerminal: true,
enableFileManager: true,
useSocks5: true,
socks5Host: "proxy.example.com",
socks5Port: 1080,
socks5Username: "proxyauth",
socks5Password: "proxypass",
},
],
},
+7 -1
View File
@@ -139,7 +139,13 @@ export function HostItem({
className={`relative flex items-stretch cursor-pointer select-none transition-colors hover:bg-muted/40 ${stripeIndex % 2 === 1 ? "bg-muted/20" : ""}`}
onMouseEnter={() => setHovered(true)}
onMouseLeave={() => setHovered(false)}
onClick={() => onOpenTab("terminal")}
onClick={() => {
if (host.enableSsh) onOpenTab("terminal");
else if (host.enableRdp) onOpenTab("rdp");
else if (host.enableVnc) onOpenTab("vnc");
else if (host.enableTelnet) onOpenTab("telnet");
else onOpenTab("terminal");
}}
>
{/* Status stripe */}
<div
+15
View File
@@ -480,6 +480,9 @@ export function UserProfilePanel({
const [disableUpdateCheck, setDisableUpdateCheck] = useState(
() => localStorage.getItem("disableUpdateCheck") === "true",
);
const [confirmTabClose, setConfirmTabClose] = useState(
() => localStorage.getItem("confirmTabClose") === "true",
);
// API keys
const [apiKeys, setApiKeys] = useState<ApiKey[]>([]);
@@ -1008,6 +1011,18 @@ export function UserProfilePanel({
}}
/>
</SettingRow>
<SettingRow
label={t("newUi.sidebar.userProfile.confirmTabClose")}
description={t("newUi.sidebar.userProfile.confirmTabCloseDesc")}
>
<FakeSwitch
checked={confirmTabClose}
onChange={(v) => {
setConfirmTabClose(v);
localStorage.setItem("confirmTabClose", v.toString());
}}
/>
</SettingRow>
</div>
<div className="flex flex-col gap-1 border-t border-border pt-3">