diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/components/SettingsSidebar/components/GeneralSettings/GeneralSettings.tsx b/apps/desktop/src/renderer/routes/_authenticated/settings/components/SettingsSidebar/components/GeneralSettings/GeneralSettings.tsx index ab5b60538a7..66bc8d51269 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/components/SettingsSidebar/components/GeneralSettings/GeneralSettings.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/components/SettingsSidebar/components/GeneralSettings/GeneralSettings.tsx @@ -31,7 +31,7 @@ const GENERAL_SECTIONS: { }, { id: "/settings/team", - label: "Team", + label: "Organization", icon: , }, { diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/team/components/MemberActions/MemberActions.tsx b/apps/desktop/src/renderer/routes/_authenticated/settings/team/components/MemberActions/MemberActions.tsx index c2af9941532..6177b921ae8 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/team/components/MemberActions/MemberActions.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/team/components/MemberActions/MemberActions.tsx @@ -103,7 +103,7 @@ export function MemberActions({ - {isCurrentUser ? "Leave organization?" : "Remove team member?"} + {isCurrentUser ? "Leave organization?" : "Remove member?"} {isCurrentUser ? ( diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/team/page.tsx b/apps/desktop/src/renderer/routes/_authenticated/settings/team/page.tsx index da44838303b..9de60a8fe83 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/team/page.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/team/page.tsx @@ -65,7 +65,7 @@ function TeamSettingsPage() {
-

Team

+

Organization

Manage members in your organization

@@ -95,7 +95,7 @@ function TeamSettingsPage() {
) : members.length === 0 ? (
- No team members yet + No members yet
) : (
diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebarHeader/OrganizationDropdown.tsx b/apps/desktop/src/renderer/screens/main/components/TopBar/OrganizationDropdown.tsx similarity index 50% rename from apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebarHeader/OrganizationDropdown.tsx rename to apps/desktop/src/renderer/screens/main/components/TopBar/OrganizationDropdown.tsx index 91405aeb3ec..56a9ac55b8f 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebarHeader/OrganizationDropdown.tsx +++ b/apps/desktop/src/renderer/screens/main/components/TopBar/OrganizationDropdown.tsx @@ -1,3 +1,4 @@ +import { COMPANY } from "@superset/shared/constants"; import { Avatar } from "@superset/ui/atoms/Avatar"; import { DropdownMenu, @@ -5,34 +6,37 @@ import { DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, + DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from "@superset/ui/dropdown-menu"; -import { Tooltip, TooltipContent, TooltipTrigger } from "@superset/ui/tooltip"; import { useLiveQuery } from "@tanstack/react-db"; import { useNavigate } from "@tanstack/react-router"; +import { FaDiscord, FaXTwitter } from "react-icons/fa6"; import { HiCheck, HiChevronUpDown, HiOutlineArrowRightOnRectangle, + HiOutlineBugAnt, + HiOutlineCog6Tooth, + HiOutlineEnvelope, + HiOutlineUserGroup, } from "react-icons/hi2"; +import { LuKeyboard, LuLifeBuoy } from "react-icons/lu"; import { authClient } from "renderer/lib/auth-client"; import { electronTrpc } from "renderer/lib/electron-trpc"; import { useCollections } from "renderer/routes/_authenticated/providers/CollectionsProvider"; +import { useHotkeyText } from "renderer/stores/hotkeys"; -interface OrganizationDropdownProps { - isCollapsed?: boolean; -} - -export function OrganizationDropdown({ - isCollapsed = false, -}: OrganizationDropdownProps) { +export function OrganizationDropdown() { const { data: session } = authClient.useSession(); const collections = useCollections(); const signOutMutation = electronTrpc.auth.signOut.useMutation(); const navigate = useNavigate(); + const shortcutsHotkey = useHotkeyText("SHOW_HOTKEYS"); + const showShortcut = shortcutsHotkey !== "Unassigned"; const activeOrganizationId = session?.session?.activeOrganizationId; @@ -45,8 +49,7 @@ export function OrganizationDropdown({ (o) => o.id === activeOrganizationId, ); - // Always render dropdown to prevent trapping users without orgs - const orgName = activeOrganization?.name ?? "No Organization"; + const userEmail = session?.user?.email; const switchOrganization = async (newOrgId: string) => { await authClient.organization.setActive({ @@ -59,65 +62,64 @@ export function OrganizationDropdown({ signOutMutation.mutate(); }; - const trigger = isCollapsed ? ( - - + const handleKeyboardShortcuts = () => { + navigate({ to: "/settings/keyboard" }); + }; + + const handleContactUs = () => { + window.open(COMPANY.MAIL_TO, "_blank"); + }; + + const handleReportIssue = () => { + window.open(COMPANY.REPORT_ISSUE_URL, "_blank"); + }; + + const handleJoinDiscord = () => { + window.open(COMPANY.DISCORD_URL, "_blank"); + }; + + const handleTwitter = () => { + window.open(COMPANY.X_URL, "_blank"); + }; + + const userName = session?.user?.name; + const displayName = activeOrganization?.name ?? userName ?? "Organization"; + + return ( + + - - {orgName} - - ) : ( - - ); - - const userEmail = session?.user?.email; + + + {/* Settings and team management - always shown for logged in users */} + navigate({ to: "/settings/account" })} + > + + Settings + - return ( - - {trigger} - - {/* Only show org-specific items if user has an active organization */} - {activeOrganization && ( - <> - {/* Settings */} - navigate({ to: "/settings/account" })} - > - Settings - + navigate({ to: "/settings/team" })}> + + Organization + - {/* Team management */} - navigate({ to: "/settings/team" })} - > - Invite and manage members - - - - - )} + {/* Org switcher - only show if user has multiple orgs */} {organizations && organizations.length > 1 && ( @@ -127,7 +129,6 @@ export function OrganizationDropdown({ Switch organization - {/* User email header in submenu */} {userEmail && ( {userEmail} @@ -157,6 +158,40 @@ export function OrganizationDropdown({ )} + {/* Support section */} + + + Report Issue + + + + Keyboard Shortcuts + {showShortcut && ( + {shortcutsHotkey} + )} + + + + + Contact Us + + + + + Discord + + + X + + + + Email Founders + + + + + + {/* Sign out - ALWAYS show so users can never get trapped */} diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/SupportMenu.tsx b/apps/desktop/src/renderer/screens/main/components/TopBar/SupportMenu.tsx deleted file mode 100644 index 087a771ae01..00000000000 --- a/apps/desktop/src/renderer/screens/main/components/TopBar/SupportMenu.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import { COMPANY } from "@superset/shared/constants"; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuShortcut, - DropdownMenuSub, - DropdownMenuSubContent, - DropdownMenuSubTrigger, - DropdownMenuTrigger, -} from "@superset/ui/dropdown-menu"; -import { useNavigate } from "@tanstack/react-router"; -import { FaDiscord, FaXTwitter } from "react-icons/fa6"; -import { - HiOutlineBugAnt, - HiOutlineEnvelope, - HiOutlineQuestionMarkCircle, -} from "react-icons/hi2"; -import { LuKeyboard, LuLifeBuoy } from "react-icons/lu"; -import { useHotkeyText } from "renderer/stores/hotkeys"; - -export function SupportMenu() { - const navigate = useNavigate(); - const shortcutsHotkey = useHotkeyText("SHOW_HOTKEYS"); - const showShortcut = shortcutsHotkey !== "Unassigned"; - - const handleKeyboardShortcuts = () => { - navigate({ to: "/settings/keyboard" }); - }; - - const handleContactUs = () => { - window.open(COMPANY.MAIL_TO, "_blank"); - }; - - const handleReportIssue = () => { - window.open(COMPANY.REPORT_ISSUE_URL, "_blank"); - }; - - const handleJoinDiscord = () => { - window.open(COMPANY.DISCORD_URL, "_blank"); - }; - - const handleTwitter = () => { - window.open(COMPANY.X_URL, "_blank"); - }; - - return ( - - - - - - - - Report Issue - - - - Keyboard Shortcuts - {showShortcut && ( - {shortcutsHotkey} - )} - - - - - Contact Us - - - - - Discord - - - - X - - - - - Email Founders - - - - - - ); -} diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/index.tsx b/apps/desktop/src/renderer/screens/main/components/TopBar/index.tsx index 2cadd982720..9e36080cd8c 100644 --- a/apps/desktop/src/renderer/screens/main/components/TopBar/index.tsx +++ b/apps/desktop/src/renderer/screens/main/components/TopBar/index.tsx @@ -1,7 +1,7 @@ import { useParams } from "@tanstack/react-router"; import { electronTrpc } from "renderer/lib/electron-trpc"; import { OpenInMenuButton } from "./OpenInMenuButton"; -import { SupportMenu } from "./SupportMenu"; +import { OrganizationDropdown } from "./OrganizationDropdown"; import { WindowControls } from "./WindowControls"; export function TopBar() { @@ -32,7 +32,7 @@ export function TopBar() { branch={workspace.worktree?.branch} /> )} - + {!isMac && }
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 5fc833ec00c..d9acbddb7c6 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 @@ -14,7 +14,6 @@ import { import { useWorkspaceSidebarStore } from "renderer/stores"; import { STROKE_WIDTH, STROKE_WIDTH_THIN } from "../constants"; import { NewWorkspaceButton } from "./NewWorkspaceButton"; -import { OrganizationDropdown } from "./OrganizationDropdown"; interface WorkspaceSidebarHeaderProps { isCollapsed?: boolean; @@ -85,8 +84,6 @@ export function WorkspaceSidebarHeader({ Toggle sidebar - -