diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebarFooter.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebarFooter.tsx index 517c44616bd..637ed3f2be9 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebarFooter.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebarFooter.tsx @@ -5,6 +5,7 @@ import { LuFolderOpen } from "react-icons/lu"; import { useOpenNew } from "renderer/react-query/projects"; import { useCreateBranchWorkspace } from "renderer/react-query/workspaces"; import { STROKE_WIDTH } from "./constants"; +import { OrganizationDropdown } from "./WorkspaceSidebarHeader/OrganizationDropdown"; interface WorkspaceSidebarFooterProps { isCollapsed?: boolean; @@ -55,7 +56,7 @@ export function WorkspaceSidebarFooter({ if (isCollapsed) { return ( -
+
); } return ( -
+
+
); } diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebarHeader/OrganizationDropdown.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebarHeader/OrganizationDropdown.tsx index 370f689a6f7..13c0944e0d6 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebarHeader/OrganizationDropdown.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebarHeader/OrganizationDropdown.tsx @@ -6,6 +6,7 @@ import { DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, + DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, @@ -13,15 +14,21 @@ import { } from "@superset/ui/dropdown-menu"; import { Tooltip, TooltipContent, TooltipTrigger } from "@superset/ui/tooltip"; import { useLiveQuery } from "@tanstack/react-db"; +import { FaDiscord, FaXTwitter } from "react-icons/fa6"; import { HiCheck, HiChevronUpDown, HiOutlineArrowRightOnRectangle, + HiOutlineCog6Tooth, + HiOutlineCommandLine, + HiOutlineEnvelope, + HiOutlineUserGroup, } from "react-icons/hi2"; import { useAuth } from "renderer/contexts/AuthProvider"; import { useCollections } from "renderer/contexts/CollectionsProvider"; import { trpc } from "renderer/lib/trpc"; import { useOpenSettings } from "renderer/stores/app-state"; +import { useHotkeyText } from "renderer/stores/hotkeys/store"; interface OrganizationDropdownProps { isCollapsed?: boolean; @@ -34,7 +41,9 @@ export function OrganizationDropdown({ const collections = useCollections(); const setActiveOrg = trpc.auth.setActiveOrganization.useMutation(); const signOut = trpc.auth.signOut.useMutation(); + const openUrl = trpc.external.openUrl.useMutation(); const openSettings = useOpenSettings(); + const hotkeysShortcut = useHotkeyText("SHOW_HOTKEYS"); const activeOrganizationId = session?.session?.activeOrganizationId; @@ -102,13 +111,30 @@ export function OrganizationDropdown({ {activeOrganization && ( <> {/* Settings */} - openSettings()}> + openSettings()} className="gap-2"> + Settings {/* Team management */} - openSettings("team")}> - Invite and manage members + openSettings("team")} + className="gap-2" + > + + Team + + + {/* Hotkeys */} + openSettings("keyboard")} + className="gap-2" + > + + Hotkeys + {hotkeysShortcut !== "Unassigned" && ( + {hotkeysShortcut} + )} @@ -153,6 +179,39 @@ export function OrganizationDropdown({ )} + {/* Contact Us */} + + + + Contact us + + + openUrl.mutate("https://discord.gg/superset")} + className="gap-2" + > + + Discord + + openUrl.mutate("mailto:founders@superset.sh")} + className="gap-2" + > + + Email founders + + openUrl.mutate("https://x.com/supersetsh")} + className="gap-2" + > + + X (Twitter) + + + + + + {/* Sign out - ALWAYS show so users can never get trapped */} diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebarHeader/WorkspaceSidebarHeader.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebarHeader/WorkspaceSidebarHeader.tsx index ec8598c5c26..759dfc8e0af 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebarHeader/WorkspaceSidebarHeader.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebarHeader/WorkspaceSidebarHeader.tsx @@ -19,7 +19,6 @@ import { } from "renderer/stores/app-state"; import { STROKE_WIDTH, STROKE_WIDTH_THIN } from "../constants"; import { NewWorkspaceButton } from "./NewWorkspaceButton"; -import { OrganizationDropdown } from "./OrganizationDropdown"; interface WorkspaceSidebarHeaderProps { isCollapsed?: boolean; @@ -86,8 +85,6 @@ export function WorkspaceSidebarHeader({ Toggle sidebar - - diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/Terminal.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/Terminal.tsx index 5d1d21b5a2a..ccc8554a3c6 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/Terminal.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/Terminal.tsx @@ -44,6 +44,7 @@ export const Terminal = ({ tabId, workspaceId }: TerminalProps) => { const commandBufferRef = useRef(""); const [subscriptionEnabled, setSubscriptionEnabled] = useState(false); const [isSearchOpen, setIsSearchOpen] = useState(false); + const [isHovered, setIsHovered] = useState(false); const [xtermInstance, setXtermInstance] = useState(null); const [terminalCwd, setTerminalCwd] = useState(null); const [cwdConfirmed, setCwdConfirmed] = useState(false); @@ -613,13 +614,15 @@ export const Terminal = ({ tabId, workspaceId }: TerminalProps) => { style={{ backgroundColor: terminalBg }} onDragOver={handleDragOver} onDrop={handleDrop} + onMouseEnter={() => setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} > setIsSearchOpen(false)} /> - +
);