From 09b4e3e652365c4609e54eaafbfbb09e4cdb262e Mon Sep 17 00:00:00 2001 From: Satya Patel Date: Sat, 10 Jan 2026 14:31:12 -0800 Subject: [PATCH 01/18] WIP --- apps/desktop/package.json | 1 + .../components/ComponentsShowcase/index.tsx | 209 +++++++++++++ .../main/components/TasksView/TasksView.tsx | 293 +----------------- .../components/StatusIcon/StatusIcon.tsx | 164 ++++++++++ .../components/StatusIcon/constants.ts | 10 + .../TasksView/components/StatusIcon/index.ts | 2 + .../TasksTableView/TasksTableView.tsx | 57 ++++ .../components/TasksTableView/index.ts | 1 + .../cells/AssigneeCell/AssigneeCell.tsx | 156 ++++++++++ .../components/cells/AssigneeCell/index.ts | 1 + .../cells/LabelsCell/LabelsCell.tsx | 134 ++++++++ .../components/cells/LabelsCell/index.ts | 1 + .../cells/PriorityCell/PriorityCell.tsx | 154 +++++++++ .../cells/PriorityCell/constants.ts | 7 + .../components/cells/PriorityCell/index.ts | 1 + .../cells/StatusCell/StatusCell.tsx | 105 +++++++ .../components/cells/StatusCell/index.ts | 1 + .../TasksView/hooks/useTasksTable/index.ts | 1 + .../hooks/useTasksTable/useTasksTable.tsx | 178 +++++++++++ .../WorkspaceSidebarHeader.tsx | 38 +++ .../src/renderer/screens/main/index.tsx | 4 + apps/desktop/src/renderer/stores/app-state.ts | 18 +- bun.lock | 7 +- 23 files changed, 1255 insertions(+), 288 deletions(-) create mode 100644 apps/desktop/src/renderer/screens/main/components/ComponentsShowcase/index.tsx create mode 100644 apps/desktop/src/renderer/screens/main/components/TasksView/components/StatusIcon/StatusIcon.tsx create mode 100644 apps/desktop/src/renderer/screens/main/components/TasksView/components/StatusIcon/constants.ts create mode 100644 apps/desktop/src/renderer/screens/main/components/TasksView/components/StatusIcon/index.ts create mode 100644 apps/desktop/src/renderer/screens/main/components/TasksView/components/TasksTableView/TasksTableView.tsx create mode 100644 apps/desktop/src/renderer/screens/main/components/TasksView/components/TasksTableView/index.ts create mode 100644 apps/desktop/src/renderer/screens/main/components/TasksView/components/cells/AssigneeCell/AssigneeCell.tsx create mode 100644 apps/desktop/src/renderer/screens/main/components/TasksView/components/cells/AssigneeCell/index.ts create mode 100644 apps/desktop/src/renderer/screens/main/components/TasksView/components/cells/LabelsCell/LabelsCell.tsx create mode 100644 apps/desktop/src/renderer/screens/main/components/TasksView/components/cells/LabelsCell/index.ts create mode 100644 apps/desktop/src/renderer/screens/main/components/TasksView/components/cells/PriorityCell/PriorityCell.tsx create mode 100644 apps/desktop/src/renderer/screens/main/components/TasksView/components/cells/PriorityCell/constants.ts create mode 100644 apps/desktop/src/renderer/screens/main/components/TasksView/components/cells/PriorityCell/index.ts create mode 100644 apps/desktop/src/renderer/screens/main/components/TasksView/components/cells/StatusCell/StatusCell.tsx create mode 100644 apps/desktop/src/renderer/screens/main/components/TasksView/components/cells/StatusCell/index.ts create mode 100644 apps/desktop/src/renderer/screens/main/components/TasksView/hooks/useTasksTable/index.ts create mode 100644 apps/desktop/src/renderer/screens/main/components/TasksView/hooks/useTasksTable/useTasksTable.tsx diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 738586d1158..0bd431f8968 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -50,6 +50,7 @@ "@tanstack/electric-db-collection": "^0.2.20", "@tanstack/react-db": "^0.1.60", "@tanstack/react-query": "^5.90.10", + "@tanstack/react-table": "^8.21.3", "@trpc/client": "^11.7.1", "@trpc/react-query": "^11.7.1", "@trpc/server": "^11.7.1", diff --git a/apps/desktop/src/renderer/screens/main/components/ComponentsShowcase/index.tsx b/apps/desktop/src/renderer/screens/main/components/ComponentsShowcase/index.tsx new file mode 100644 index 00000000000..593d504e6f0 --- /dev/null +++ b/apps/desktop/src/renderer/screens/main/components/ComponentsShowcase/index.tsx @@ -0,0 +1,209 @@ +import { ScrollArea } from "@superset/ui/scroll-area"; +import { StatusIcon, type StatusType } from "../TasksView/components/StatusIcon"; + +const STATUS_VARIANTS: Array<{ + type: StatusType; + color: string; + label: string; +}> = [ + { type: "backlog", color: "#6B7280", label: "Backlog (Gray)" }, + { type: "unstarted", color: "#3B82F6", label: "Todo (Blue)" }, + { type: "unstarted", color: "#EF4444", label: "Blocked (Red)" }, + { type: "started", color: "#F59E0B", label: "In Progress (Orange)" }, + { type: "started", color: "#10B981", label: "In Review (Green)" }, + { type: "completed", color: "#8B5CF6", label: "Done (Purple)" }, + { type: "cancelled", color: "#6B7280", label: "Canceled (Gray)" }, + { type: "cancelled", color: "#EF4444", label: "Duplicate (Red)" }, +]; + +export function ComponentsShowcase() { + return ( +
+ {/* Header */} +
+
+

Components Showcase

+

+ View all component variants and states +

+
+
+ + {/* Content */} + +
+ {/* Status Icon Display */} +
+

Status Icon Display

+

+ Linear-style status icons with support for different types and + colors +

+ +
+ {/* All Variants Grid */} +
+

All Variants

+
+ {STATUS_VARIANTS.map((variant, index) => ( +
+ +
+

{variant.label}

+

+ {variant.type} +

+
+
+ ))} +
+
+ + {/* Type Breakdown */} +
+

Type Breakdown

+
+ {/* Backlog */} +
+
+ + Backlog Type +
+

+ Dashed circle outline +

+
+ + {/* Unstarted */} +
+
+ + Unstarted Type +
+

+ Solid circle outline +

+
+ + {/* Started */} +
+
+ + Started Type +
+

+ Filled circle with thin gap between fill and border +

+
+ + {/* Completed */} +
+
+ + Completed Type +
+

+ Filled circle with hollow check icon +

+
+ + {/* Cancelled */} +
+
+ + Cancelled Type +
+

+ Filled circle with hollow X icon +

+
+
+
+ + {/* Hover States */} +
+

Hover States

+
+
+ + + Backlog + +
+
+ + + Unstarted + +
+
+ + + Started + +
+
+ + + Completed + +
+
+ + + Cancelled + +
+
+

+ Hover over any icon to see the brightness effect +

+
+
+
+
+
+
+ ); +} diff --git a/apps/desktop/src/renderer/screens/main/components/TasksView/TasksView.tsx b/apps/desktop/src/renderer/screens/main/components/TasksView/TasksView.tsx index 5e58414e87c..edaae24726b 100644 --- a/apps/desktop/src/renderer/screens/main/components/TasksView/TasksView.tsx +++ b/apps/desktop/src/renderer/screens/main/components/TasksView/TasksView.tsx @@ -1,270 +1,10 @@ -import type { TaskPriority } from "@superset/db/enums"; -import type { SelectTask } from "@superset/db/schema"; -import { Badge } from "@superset/ui/badge"; -import { Button } from "@superset/ui/button"; -import { Card, CardContent, CardHeader, CardTitle } from "@superset/ui/card"; -import { - Dialog, - DialogContent, - DialogFooter, - DialogHeader, - DialogTitle, -} from "@superset/ui/dialog"; -import { Input } from "@superset/ui/input"; -import { Label } from "@superset/ui/label"; import { ScrollArea } from "@superset/ui/scroll-area"; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@superset/ui/select"; -import { toast } from "@superset/ui/sonner"; -import { Textarea } from "@superset/ui/textarea"; -import { useLiveQuery } from "@tanstack/react-db"; -import { useState } from "react"; -import { - HiCalendar, - HiCheckCircle, - HiLink, - HiPencil, - HiUser, -} from "react-icons/hi2"; -import { useCollections } from "renderer/contexts/CollectionsProvider"; +import { HiCheckCircle } from "react-icons/hi2"; +import { TasksTableView } from "./components/TasksTableView"; +import { useTasksTable } from "./hooks/useTasksTable"; -interface TaskEditDialogProps { - task: SelectTask; - open: boolean; - onOpenChange: (open: boolean) => void; -} - -function TaskEditDialog({ task, open, onOpenChange }: TaskEditDialogProps) { - const collections = useCollections(); - const [title, setTitle] = useState(task.title); - const [description, setDescription] = useState(task.description || ""); - const [priority, setPriority] = useState(task.priority); - const [isSaving, setIsSaving] = useState(false); - - const handleSave = async () => { - setIsSaving(true); - try { - await collections.tasks.update(task.id, (draft: SelectTask) => { - draft.title = title; - draft.description = description || null; - draft.priority = priority as - | "urgent" - | "high" - | "medium" - | "low" - | "none"; - }); - toast.success("Task updated"); - onOpenChange(false); - } catch (error) { - console.error("[TaskEditDialog] Update failed:", error); - toast.error( - `Failed to update task: ${error instanceof Error ? error.message : String(error)}`, - ); - } finally { - setIsSaving(false); - } - }; - - return ( - - - - - {task.externalKey && ( - - {task.externalKey} - - )} - Edit Task - - -
-
- - setTitle(e.target.value)} - /> -
-
- -