Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { useParams } from "@tanstack/react-router";
import { electronTrpc } from "renderer/lib/electron-trpc";
import { OpenInMenuButton } from "./OpenInMenuButton";
import { OrganizationDropdown } from "./OrganizationDropdown";
import { WindowControls } from "./WindowControls";
import { OpenInMenuButton } from "./components/OpenInMenuButton";
import { OrganizationDropdown } from "./components/OrganizationDropdown";
import { SidebarToggle } from "./components/SidebarToggle";
import { WindowControls } from "./components/WindowControls";

export function TopBar() {
const { data: platform } = electronTrpc.window.getPlatform.useQuery();
Expand All @@ -21,7 +22,9 @@ export function TopBar() {
style={{
paddingLeft: isMac ? "88px" : "16px",
}}
/>
>
<SidebarToggle />
</div>

<div className="flex-1" />

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { OpenInMenuButton } from "./OpenInMenuButton";
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { OrganizationDropdown } from "./OrganizationDropdown";
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { Tooltip, TooltipContent, TooltipTrigger } from "@superset/ui/tooltip";
import { LuPanelLeft, LuPanelLeftClose, LuPanelLeftOpen } from "react-icons/lu";
import { HotkeyTooltipContent } from "renderer/components/HotkeyTooltipContent";
import { useWorkspaceSidebarStore } from "renderer/stores";

export function SidebarToggle() {
const { isCollapsed, toggleCollapsed } = useWorkspaceSidebarStore();
const collapsed = isCollapsed();

const getToggleIcon = (isHovering: boolean) => {
if (collapsed) {
return isHovering ? (
<LuPanelLeftOpen className="size-4" strokeWidth={1.5} />
) : (
<LuPanelLeft className="size-4" strokeWidth={1.5} />
);
}
return isHovering ? (
<LuPanelLeftClose className="size-4" strokeWidth={1.5} />
) : (
<LuPanelLeft className="size-4" strokeWidth={1.5} />
);
};

return (
<Tooltip delayDuration={300}>
<TooltipTrigger asChild>
<button
type="button"
onClick={toggleCollapsed}
className="no-drag group flex items-center justify-center size-8 rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50 transition-colors"
>
<span className="group-hover:hidden">{getToggleIcon(false)}</span>
<span className="hidden group-hover:block">
{getToggleIcon(true)}
</span>
</button>
Comment on lines +28 to +37
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Add accessible labeling for the icon-only toggle.
Screen readers won’t have a usable name without an aria-label/pressed state.

✅ Suggested fix
 				<button
 					type="button"
 					onClick={toggleCollapsed}
+					aria-label="Toggle sidebar"
+					aria-pressed={collapsed}
 					className="no-drag group flex items-center justify-center size-8 rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50 transition-colors"
 				>
🤖 Prompt for AI Agents
In
`@apps/desktop/src/renderer/screens/main/components/TopBar/SidebarToggle/SidebarToggle.tsx`
around lines 28 - 37, The icon-only toggle button lacks accessible labeling and
state. Update the button element (the one using onClick={toggleCollapsed} and
rendering getToggleIcon(...)) to include an aria-label that changes based on the
collapsed state (e.g., "Collapse sidebar" vs "Expand sidebar") and set
aria-pressed (or aria-expanded) to reflect the current collapsed value; derive
the label/state from the component's collapsed/isCollapsed prop or state and
keep toggleCollapsed as the click handler so screen readers get both a
meaningful name and the current pressed/expanded state.

</TooltipTrigger>
<TooltipContent side="right">
<HotkeyTooltipContent
label="Toggle sidebar"
hotkeyId="TOGGLE_WORKSPACE_SIDEBAR"
/>
</TooltipContent>
</Tooltip>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { SidebarToggle } from "./SidebarToggle";
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { WindowControls } from "./WindowControls";
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { TopBar } from "./TopBar";
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import {
} from "@tanstack/react-router";
import { electronTrpc } from "renderer/lib/electron-trpc";
import { ResizablePanel } from "renderer/screens/main/components/ResizablePanel";
import { TopBar } from "renderer/screens/main/components/TopBar";
import { WorkspaceSidebar } from "renderer/screens/main/components/WorkspaceSidebar";
import { useAppHotkey } from "renderer/stores/hotkeys";
import { useOpenNewWorkspaceModal } from "renderer/stores/new-workspace-modal";
Expand All @@ -15,6 +14,7 @@ import {
MAX_WORKSPACE_SIDEBAR_WIDTH,
useWorkspaceSidebarStore,
} from "renderer/stores/workspace-sidebar-state";
import { TopBar } from "./components/TopBar";

export const Route = createFileRoute("/_authenticated/_dashboard")({
component: DashboardLayout,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { electronTrpc } from "renderer/lib/electron-trpc";
import { WindowControls } from "../TopBar/WindowControls";
import { WindowControls } from "renderer/routes/_authenticated/_dashboard/components/TopBar/components/WindowControls";

export function StartTopBar() {
const { data: platform, isLoading } =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,9 @@ import { Tooltip, TooltipContent, TooltipTrigger } from "@superset/ui/tooltip";
import { cn } from "@superset/ui/utils";
import { useMatchRoute, useNavigate } from "@tanstack/react-router";
import { useFeatureFlagEnabled } from "posthog-js/react";
import { useState } from "react";
import { HiOutlineClipboardDocumentList } from "react-icons/hi2";
import {
LuLayers,
LuPanelLeft,
LuPanelLeftClose,
LuPanelLeftOpen,
} from "react-icons/lu";
import { useWorkspaceSidebarStore } from "renderer/stores";
import { STROKE_WIDTH, STROKE_WIDTH_THIN } from "../constants";
import { LuLayers } from "react-icons/lu";
import { STROKE_WIDTH } from "../constants";
import { NewWorkspaceButton } from "./NewWorkspaceButton";

interface WorkspaceSidebarHeaderProps {
Expand All @@ -24,8 +17,6 @@ export function WorkspaceSidebarHeader({
}: WorkspaceSidebarHeaderProps) {
const navigate = useNavigate();
const matchRoute = useMatchRoute();
const { toggleCollapsed } = useWorkspaceSidebarStore();
const [isHovering, setIsHovering] = useState(false);
const hasTasksAccess = useFeatureFlagEnabled(
FEATURE_FLAGS.ELECTRIC_TASKS_ACCESS,
);
Expand All @@ -47,43 +38,9 @@ export function WorkspaceSidebarHeader({
navigate({ to: "/tasks" });
};

const handleToggleSidebar = () => {
toggleCollapsed();
};

const getToggleIcon = () => {
if (isCollapsed) {
return isHovering ? (
<LuPanelLeftOpen className="size-4" strokeWidth={STROKE_WIDTH_THIN} />
) : (
<LuPanelLeft className="size-4" strokeWidth={STROKE_WIDTH_THIN} />
);
}
return isHovering ? (
<LuPanelLeftClose className="size-4" strokeWidth={STROKE_WIDTH_THIN} />
) : (
<LuPanelLeft className="size-4" strokeWidth={STROKE_WIDTH_THIN} />
);
};

if (isCollapsed) {
return (
<div className="flex flex-col items-center border-b border-border py-2 gap-2">
<Tooltip delayDuration={300}>
<TooltipTrigger asChild>
<button
type="button"
onClick={handleToggleSidebar}
onMouseEnter={() => setIsHovering(true)}
onMouseLeave={() => setIsHovering(false)}
className="flex items-center justify-center size-8 rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50 transition-colors"
>
{getToggleIcon()}
</button>
</TooltipTrigger>
<TooltipContent side="right">Toggle sidebar</TooltipContent>
</Tooltip>

<Tooltip delayDuration={300}>
<TooltipTrigger asChild>
<button
Expand Down Expand Up @@ -132,28 +89,6 @@ export function WorkspaceSidebarHeader({

return (
<div className="flex flex-col gap-1 border-b border-border px-2 pt-2 pb-2">
<Tooltip delayDuration={300}>
<TooltipTrigger asChild>
<button
type="button"
onClick={handleToggleSidebar}
onMouseEnter={() => setIsHovering(true)}
onMouseLeave={() => setIsHovering(false)}
className="flex items-center gap-2 px-2 py-1.5 w-full rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50 transition-colors"
>
<div className="flex items-center justify-center size-5">
{getToggleIcon()}
</div>
{isHovering && (
<span className="text-sm font-medium flex-1 text-left">
Toggle sidebar
</span>
)}
</button>
</TooltipTrigger>
<TooltipContent side="right">Toggle sidebar</TooltipContent>
</Tooltip>

<button
type="button"
onClick={handleWorkspacesClick}
Expand Down
Loading