Existing ASP.NET API with vanilla JS SPA, WindowWatcher, Chrome extension, and MCP server. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
6.8 KiB
TaskTracker Web UI Redesign
Date: 2026-02-26 Status: Approved
Overview
Ground-up redesign of the TaskTracker web UI. Replace the current vanilla JS SPA in wwwroot/ with a React-based Kanban board application in a separate TaskTracker.Web project.
Tech Stack
- Framework: React 19, TypeScript
- Build: Vite
- Styling: Tailwind CSS
- Drag-and-drop: @dnd-kit/core + @dnd-kit/sortable
- Data fetching: @tanstack/react-query
- Routing: react-router-dom
- Charts: Recharts
- HTTP: Axios
- Icons: lucide-react
- Font: Inter
Dev server on port 5173, proxies /api to localhost:5200.
Project Structure
TaskTracker.Web/
├── index.html
├── package.json
├── vite.config.ts
├── tailwind.config.ts
├── tsconfig.json
├── src/
│ ├── main.tsx
│ ├── App.tsx
│ ├── api/
│ │ ├── client.ts # Axios wrapper → localhost:5200
│ │ ├── tasks.ts # useTasksQuery, useStartTask, etc.
│ │ ├── context.ts # useContextSummary, useRecentEvents
│ │ └── mappings.ts # useMappings, useCreateMapping
│ ├── components/
│ │ ├── Layout.tsx # Sidebar + top bar + content area
│ │ ├── KanbanBoard.tsx
│ │ ├── KanbanColumn.tsx
│ │ ├── TaskCard.tsx
│ │ ├── TaskModal.tsx
│ │ ├── SearchBar.tsx
│ │ └── ...
│ ├── pages/
│ │ ├── Board.tsx # Kanban board (main view)
│ │ ├── Analytics.tsx # Context tracking visualizations
│ │ ├── Mappings.tsx # App-to-category mapping management
│ │ └── Settings.tsx # (future)
│ ├── types/ # TypeScript types matching API DTOs
│ └── lib/ # Utilities, constants, theme tokens
└── public/
Pages & Features
Kanban Board (main page)
Four columns: Pending, Active, Paused, Completed.
Drag-and-drop behavior:
- Pending → Active: calls
PUT /tasks/{id}/start(auto-pauses any active task) - Active → Paused: calls
PUT /tasks/{id}/pause - Paused → Active: calls
PUT /tasks/{id}/resume - Any → Completed: calls
PUT /tasks/{id}/complete - Dragging to Pending from other columns is blocked
- Optimistic updates via TanStack Query; rolls back on API error
Task card displays:
- Title
- Category badge (color-coded)
- Elapsed time (live-updating for active task)
- Progress bar (actual vs estimated time, if estimate set)
- Subtask count indicator (e.g., "2/4 subtasks done")
- Active task gets a pulsing cyan accent border
"+ Add Task" button in Pending column opens quick-create form.
Card click opens the Task Detail Panel.
Filter bar below board header:
- Category filter chips
- Date range picker
- "Has subtasks" toggle
- Filters are additive (AND), shown as dismissible chips
Task Detail Panel
Slide-over panel from the right (~400px), board visible behind (dimmed).
Sections:
- Header: Title (inline editable), status, category dropdown
- Description: Inline editable text area
- Time: Elapsed display, estimate input field, progress bar (actual/estimated)
- Subtasks: Checklist of child tasks. Check to complete, "+" to add new subtask (creates child task via API)
- Notes: Chronological list with type badges (Pause, Resume, General). "+" for inline add
- Actions: Context-aware buttons (Start/Pause/Resume/Complete/Abandon)
Close with Escape or click outside.
Analytics Page
Three visualization sections, filterable by time range and task.
Filters (top bar):
- Time range: Today, Last 7 days, Last 30 days, Custom
- Task filter: All Tasks or specific task
Timeline:
- Horizontal swim lane showing app usage blocks, color-coded by category
- Task lifecycle markers (started/paused/resumed/completed) as annotations
- Hover shows app name, window title, duration
Category Breakdown:
- Donut chart + horizontal bar list with time and percentage per category
- Colors match category badges
Activity Feed:
- Reverse-chronological log of context events
- Each row: colored dot, timestamp, app name, window title/URL
- Task lifecycle events interleaved
- Paginated with "Load more"
Mappings Page
CRUD table for app-to-category rules.
- Columns: Pattern, Match Type, Category (color badge), Friendly Name, Edit/Delete actions
- "+ Add Rule" opens inline form row at top
- Inline editing on existing rows
Search
Global search bar in top bar, always visible.
- Client-side search over task titles and descriptions
- Results as dropdown below search bar
- Keyboard navigable (arrows, Enter, Escape)
New Features (require API changes)
- Time estimates: New field on WorkTask entity for estimated duration. Progress bar = elapsed / estimated.
- Subtask progress rollup: Parent task cards show child completion count (may be client-side calculation from existing data).
Visual Design
Palette:
- Background:
#0f1117(deep charcoal) - Surface/cards:
#1a1d27 - Accent primary:
#6366f1(electric indigo) - Accent secondary:
#06b6d4(vivid cyan) - Success:
#10b981(emerald) - Warning:
#f59e0b(amber) - Danger:
#f43f5e(rose) - Per-category saturated colors: dev=indigo, research=cyan, comms=violet, devops=orange
Typography:
- Font: Inter
- Body: 13px / Medium (500)
- Labels: 11px
- Headings: 18px / Semibold (600)
Visual details:
- Subtle gradient on sidebar
- Colored left border on task cards (category color)
- Active task: soft glowing cyan border animation
- Column headers: subtle colored underline per status
- Smooth transitions on drag, hover, panel open/close
- Colored-tint shadows for depth
Layout:
- Sidebar: ~60px collapsed, ~200px expanded, icon + label nav
- Top bar: search, minimal
- Board: full remaining width, columns flex evenly
- Detail panel: ~400px, slides from right, overlays board
API Endpoints Used
| Endpoint | Used By |
|---|---|
GET /api/tasks |
Board, Search |
GET /api/tasks/active |
Board (active indicator) |
GET /api/tasks/{id} |
Detail panel |
POST /api/tasks |
New task, new subtask |
PUT /api/tasks/{id}/start |
Drag to Active |
PUT /api/tasks/{id}/pause |
Drag to Paused |
PUT /api/tasks/{id}/resume |
Drag to Active from Paused |
PUT /api/tasks/{id}/complete |
Drag to Completed, subtask checkbox |
DELETE /api/tasks/{id} |
Abandon button |
GET /api/tasks/{taskId}/notes |
Detail panel notes |
POST /api/tasks/{taskId}/notes |
Add note |
GET /api/context/summary |
Analytics category breakdown |
GET /api/context/recent |
Analytics timeline + feed |
GET /api/mappings |
Mappings page, category colors |
POST /api/mappings |
Add mapping |
PUT /api/mappings/{id} |
Edit mapping |
DELETE /api/mappings/{id} |
Delete mapping |