"use client"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { Sheet, SheetContent, SheetHeader, SheetTitle } from "@kandev/ui/sheet"; import { Button } from "@kandev/ui/button"; import { Checkbox } from "@kandev/ui/checkbox"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@kandev/ui/select"; import { ToggleGroup, ToggleGroupItem } from "@kandev/ui/toggle-group"; import { IconAlertTriangle, IconChartBar, IconLayoutKanban, IconList, IconSettings, IconSparkles, IconTimeline, } from "@tabler/icons-react"; import { MobileIntegrationsSection } from "@/components/integrations/integrations-menu"; import { TaskSearchInput } from "./task-search-input"; import { useKanbanDisplaySettings } from "@/hooks/use-kanban-display-settings"; import { linkToTasks } from "@/lib/links"; import type { Workspace, Repository } from "@/lib/types/http"; import type { WorkflowsState } from "@/lib/state/slices"; type MobileMenuSheetProps = { open: boolean; onOpenChange: (open: boolean) => void; workspaceId?: string; currentPage?: "kanban" | "tasks"; searchQuery?: string; onSearchChange?: (query: string) => void; isSearchLoading?: boolean; showReleaseNotesButton: boolean; onOpenReleaseNotes: () => void; showHealthIndicator: boolean; onOpenHealthDialog: () => void; }; function getRepositoryPlaceholder(loading: boolean, empty: boolean): string { if (loading) return "Loading repositories..."; if (empty) return "No repositories"; return "Select repository"; } function getMobileViewValue(currentPage: string, kanbanViewMode: string | null): string { if (currentPage === "tasks") return "list"; if (kanbanViewMode === "graph2") return "pipeline"; return "kanban"; } type MobileDisplayOptionsProps = { activeWorkspaceId: string | null; workspaces: Workspace[]; onWorkspaceChange: (id: string | null) => void; activeWorkflowId: string | null; workflows: WorkflowsState["items"]; onWorkflowChange: (id: string | null) => void; repositoryValue: string; repositories: Repository[]; repositoriesLoading: boolean; onRepositoryChange: (value: string | "all") => void; enablePreviewOnClick: boolean | undefined; onTogglePreviewOnClick: ((checked: boolean) => void) | undefined; }; function MobileDisplaySelects({ activeWorkspaceId, workspaces, onWorkspaceChange, activeWorkflowId, workflows, onWorkflowChange, repositoryValue, repositories, repositoriesLoading, onRepositoryChange, }: Omit) { return ( <>
); } function MobileDisplayOptions(props: MobileDisplayOptionsProps) { const { enablePreviewOnClick, onTogglePreviewOnClick, ...selectProps } = props; return (
); } function MobileSearchSection({ searchQuery, onSearchChange, isSearchLoading, }: { searchQuery: string; onSearchChange?: (query: string) => void; isSearchLoading: boolean; }) { if (!onSearchChange) return null; return (
); } function MobileViewSection({ viewValue, onViewChange, }: { viewValue: string; onViewChange: (value: string) => void; }) { return (
Kanban Pipeline List
); } function MobileUtilityActions({ showReleaseNotesButton, onOpenReleaseNotes, showHealthIndicator, onOpenHealthDialog, onOpenChange, }: { showReleaseNotesButton: boolean; onOpenReleaseNotes: () => void; showHealthIndicator: boolean; onOpenHealthDialog: () => void; onOpenChange: (open: boolean) => void; }) { const closeSheet = () => onOpenChange(false); const openReleaseNotes = () => { closeSheet(); onOpenReleaseNotes(); }; const openHealth = () => { closeSheet(); onOpenHealthDialog(); }; return (
Utilities
{showReleaseNotesButton && ( )}
); } export function MobileMenuSheet({ open, onOpenChange, workspaceId, currentPage = "kanban", searchQuery = "", onSearchChange, isSearchLoading = false, showReleaseNotesButton, onOpenReleaseNotes, showHealthIndicator, onOpenHealthDialog, }: MobileMenuSheetProps) { const router = useRouter(); const { workspaces, workflows, activeWorkspaceId, activeWorkflowId, repositories, repositoriesLoading, allRepositoriesSelected, selectedRepositoryId, enablePreviewOnClick, onWorkspaceChange, onWorkflowChange, onRepositoryChange, onTogglePreviewOnClick, kanbanViewMode, onViewModeChange, } = useKanbanDisplaySettings(); const repositoryValue = allRepositoriesSelected ? "all" : (selectedRepositoryId ?? "all"); const viewValue = getMobileViewValue(currentPage, kanbanViewMode); const handleViewChange = (value: string) => { if (!value) return; if (value === "list") { if (currentPage !== "tasks") router.push(linkToTasks(workspaceId)); onOpenChange(false); } else if (value === "kanban") { if (currentPage !== "kanban") router.push("/"); onViewModeChange(""); onOpenChange(false); } else if (value === "pipeline") { if (currentPage !== "kanban") router.push("/"); onViewModeChange("graph2"); onOpenChange(false); } }; return ( Menu
onOpenChange(false)} />
); }