# Tasks: Superset-Style UX Redesign **Input**: Design documents from `/specs/019-superset-ux-redesign/` **Prerequisites**: plan.md ✅, spec.md ✅, research.md ✅, data-model.md ✅, contracts/ ✅ **Tests**: Not explicitly requested - implementation tasks only. **Organization**: Tasks are grouped by user story to enable independent implementation and testing of each story. ## Format: `[ID] [P?] [Story] Description` - **[P]**: Can run in parallel (different files, no dependencies) - **[Story]**: Which user story this task belongs to (e.g., US1, US2, US3) - Include exact file paths in descriptions - **Contract Reference**: Each task links to [contracts/modules.md](./contracts/modules.md) for Design-by-Contract specifications ## Path Conventions - **Web app**: `backend/src/`, `frontend/src/` ## Contract References All implementation tasks MUST follow the Design-by-Contract specifications: | Component | Contract | TIER | |-----------|----------|------| | `sidebar.js` | [DEF:SidebarStore:Store](./contracts/modules.md#1-sidebarstore) | STANDARD | | `taskDrawer.js` | [DEF:TaskDrawerStore:Store](./contracts/modules.md#2-taskdrawerstore) | CRITICAL | | `activity.js` | [DEF:ActivityStore:Store](./contracts/modules.md#3-activitystore) | STANDARD | | `Sidebar.svelte` | [DEF:Sidebar:Component](./contracts/modules.md#4-sidebar-component) | CRITICAL | | `TopNavbar.svelte` | [DEF:TopNavbar:Component](./contracts/modules.md#5-topnavbar-component) | CRITICAL | | `TaskDrawer.svelte` | [DEF:TaskDrawer:Component](./contracts/modules.md#6-taskdrawer-component) | CRITICAL | | `Breadcrumbs.svelte` | [DEF:Breadcrumbs:Component](./contracts/modules.md#9-breadcrumbs-component) | STANDARD | | `DashboardHub` | [DEF:DashboardHub:Component](./contracts/modules.md#7-dashboardhub-component) | CRITICAL | | `DatasetHub` | [DEF:DatasetHub:Component](./contracts/modules.md#8-datasethub-component) | CRITICAL | | `dashboards.py` | [DEF:DashboardsAPI:Module](./contracts/modules.md#10-dashboards-api) | CRITICAL | | `datasets.py` | [DEF:DatasetsAPI:Module](./contracts/modules.md#11-datasets-api) | CRITICAL | | `resource_service.py` | [DEF:ResourceService:Class](./contracts/modules.md#13-resourceservice) | STANDARD | --- ## Phase 1: Setup (Shared Infrastructure) **Purpose**: Create new directory structure and stores for layout state **Contract Requirements**: - All stores MUST implement `@PRE` and `@POST` conditions from [contracts/modules.md](./contracts/modules.md) - CRITICAL tier modules (TaskDrawerStore) require full UX state documentation - [x] T001 Create `frontend/src/lib/components/layout/` directory for shared layout components - [x] T002 Create `frontend/src/lib/components/hubs/` directory for resource hub pages - [x] T003 [P] Create `frontend/src/lib/stores/sidebar.js` with persistentStore pattern for sidebar state _Contract: [DEF:SidebarStore:Store](./contracts/modules.md#1-sidebarstore)_ - [x] T004 [P] Create `frontend/src/lib/stores/taskDrawer.js` with resourceTaskMap store _Contract: [DEF:TaskDrawerStore:Store](./contracts/modules.md#2-taskdrawerstore) - CRITICAL: Must implement all @UX_STATE transitions_ - [x] T005 [P] Create `frontend/src/lib/stores/activity.js` as derived store from taskDrawer _Contract: [DEF:ActivityStore:Store](./contracts/modules.md#3-activitystore)_ --- ## Phase 2: Foundational (Blocking Prerequisites) **Purpose**: Core layout components that MUST be complete before ANY user story can be implemented **⚠️ CRITICAL**: No user story work can begin until this phase is complete **Contract Requirements**: - All CRITICAL tier components MUST implement full `@UX_STATE` specifications - Components MUST follow `@PRE` conditions for props and `@POST` for event handling - [x] T006 Create `frontend/src/lib/components/layout/Sidebar.svelte` with categories: DASHBOARDS, DATASETS, STORAGE, ADMIN _Contract: [DEF:Sidebar:Component](./contracts/modules.md#4-sidebar-component) - CRITICAL: Implement all @UX_STATE transitions (Expanded/Collapsed/Mobile)_ - [x] T007 Create `frontend/src/lib/components/layout/TopNavbar.svelte` with Logo, Search placeholder, Activity indicator, User menu _Contract: [DEF:TopNavbar:Component](./contracts/modules.md#5-topnavbar-component) - CRITICAL: Activity badge must pulse on new tasks_ - [x] T008 Create `frontend/src/lib/components/layout/Breadcrumbs.svelte` for page hierarchy navigation _Contract: [DEF:Breadcrumbs:Component](./contracts/modules.md#9-breadcrumbs-component) - Handle truncation for >3 levels_ - [x] T009 Update `frontend/src/routes/+layout.svelte` to include Sidebar, TopNavbar, and main content area - [x] T010 Add i18n keys for navigation labels in `frontend/src/lib/i18n/translations/en.json` - [x] T011 Add i18n keys for navigation labels in `frontend/src/lib/i18n/translations/ru.json` **Checkpoint**: Foundation ready - user story implementation can now begin --- ## Phase 3: User Story 1 - Resource-Centric Navigation (Priority: P1) 🎯 MVP **Goal**: Users can navigate through a persistent left sidebar with resource categories **Independent Test**: Click "Dashboards" or "Datasets" in sidebar and verify correct hub loads ### Implementation for User Story 1 - [x] T012 [US1] Implement sidebar collapse/expand toggle with animation in `frontend/src/lib/components/layout/Sidebar.svelte` - [x] T013 [US1] Add mobile hamburger menu toggle in `frontend/src/lib/components/layout/TopNavbar.svelte` - [x] T014 [US1] Implement active item highlighting in sidebar using `sidebarStore` - [x] T015 [US1] Add localStorage persistence for sidebar state (collapsed/expanded) - [x] T016 [US1] Implement responsive sidebar (overlay mode on mobile < 768px) - [x] T017 [US1] Verify implementation matches ux_reference.md (Sidebar mockups) **Checkpoint**: Sidebar navigation fully functional and responsive --- ## Phase 4: User Story 2 - Global Task Drawer & Activity Monitoring (Priority: P1) 🎯 MVP **Goal**: Users can monitor running tasks without losing context via a slide-out drawer **Independent Test**: Trigger a Backup and verify Task Drawer opens with log stream ### Implementation for User Story 2 **Contract Requirements**: - TaskDrawer MUST implement all `@UX_STATE` transitions from [DEF:TaskDrawerStore:Store](./contracts/modules.md#2-taskdrawerstore) - MUST handle `@UX_RECOVERY` for WebSocket disconnections - [x] T018 [US2] Create `frontend/src/lib/components/layout/TaskDrawer.svelte` as slide-out panel from right _Contract: [DEF:TaskDrawer:Component](./contracts/modules.md#6-taskdrawer-component) - CRITICAL: Implement Closed → Open-Loading → Open-Streaming → Open-InputRequired states_ - [x] T019 [US2] Integrate existing `TaskLogViewer` component inside Task Drawer - [x] T020 [US2] Implement Activity indicator badge in TopNavbar showing `activeCount` from store - [x] T021 [US2] Connect Task Drawer to WebSocket for real-time log streaming _Contract: @RELATION: DEPENDS_ON -> WebSocket connection_ - [x] T022 [US2] Implement interactive area in drawer for `PasswordPrompt` and other inputs _Contract: @UX_STATE: Open-InputRequired_ - [x] T023 [US2] Add close button that allows task to continue running in background _Contract: @POST: Closing drawer does NOT cancel running task_ - [x] T024 [US2] Implement drawer open trigger from Activity indicator click - [x] T025 [US2] Verify implementation matches ux_reference.md (Task Drawer mockup) **Checkpoint**: Task Drawer fully functional with real-time logs --- ## Phase 5: User Story 5 - Unified Top Navigation Bar (Priority: P1) 🎯 MVP **Goal**: Consistent top navbar with Logo, Search, Activity, and User menu **Independent Test**: Navigate to any page and verify top bar shows all elements ### Implementation for User Story 5 - [x] T026 [US5] Implement Logo/Brand link in TopNavbar that returns to Home - [x] T027 [US5] Add Global Search placeholder (non-functional, for future) in TopNavbar - [x] T028 [US5] Implement User menu dropdown with Profile, Settings, Logout options - [x] T029 [US5] Connect User menu Logout to authentication logout flow - [x] T030 [US5] Verify implementation matches ux_reference.md (Top Navigation Bar mockup) **Checkpoint**: Top navbar complete with all elements --- ## Phase 6: User Story 3 - Dashboard Hub Management (Priority: P1) **Goal**: Central hub for dashboards with bulk selection, Git status, and action triggers **Independent Test**: Navigate to `/dashboards`, select environment, verify grid displays correctly with checkboxes, pagination, and search ### Backend for User Story 3 **Contract Requirements**: - All endpoints MUST follow `@PRE` and `@POST` conditions from [DEF:DashboardsAPI:Module](./contracts/modules.md#10-dashboards-api) - MUST use `ConfigManager` via dependency injection (Constitution Principle II) - [x] T031 [P] [US3] Create `backend/src/api/routes/dashboards.py` with GET /api/dashboards endpoint _Contract: [DEF:DashboardsAPI:Module](./contracts/modules.md#10-dashboards-api) - CRITICAL_ - [x] T032 [P] [US3] Create `backend/src/services/resource_service.py` for shared resource fetching logic _Contract: [DEF:ResourceService:Class](./contracts/modules.md#13-resourceservice)_ - [x] T033 [US3] Implement dashboard list fetching with Git status and last task status - [x] T034 [US3] Add pagination support to GET /api/dashboards endpoint (page, page_size parameters) _Contract: @POST: Response includes pagination metadata_ - [x] T035 [US3] Implement bulk migration endpoint POST /api/dashboards/migrate with target environment and dashboard IDs _Contract: @PRE: User has permission plugin:migration:execute_ - [x] T036 [US3] Implement bulk backup endpoint POST /api/dashboards/backup with optional cron schedule _Contract: @PRE: User has permission plugin:backup:execute_ - [x] T037 [US3] Add database mappings retrieval from MappingService for migration modal - [x] T064 [US3] Fix "API endpoint not found" for databases by correcting endpoint path in `frontend/src/lib/api.js` ### Frontend for User Story 3 **Contract Requirements**: - MUST implement all `@UX_STATE` transitions from [DEF:DashboardHub:Component](./contracts/modules.md#7-dashboardhub-component) - MUST preserve selection across pagination (`@INVARIANT: Selected dashboards persist across pagination`) - [x] T038 [US3] Create `frontend/src/routes/dashboards/+page.svelte` as Dashboard Hub _Contract: [DEF:DashboardHub:Component](./contracts/modules.md#7-dashboardhub-component) - CRITICAL_ - [x] T039 [US3] Implement environment selector dropdown at top of Dashboard Hub - [x] T040 [US3] Create dashboard grid with checkboxes, columns: Title, Slug, Git Status, Last Task, Actions _Contract: @UX_STATE: Idle-Grid, @UX_FEEDBACK: Git status color-coded icons_ - [x] T041 [US3] Implement "Select All" and "Select Visible" buttons in toolbar _Contract: @UX_STATE: Selecting_ - [x] T042 [US3] Add real-time search input that filters dashboard list _Contract: @POST: Search filters results in real-time (debounced 300ms)_ - [x] T043 [US3] Implement pagination controls with page numbers and "Rows per page" dropdown _Contract: @INVARIANT: Selection persists across pagination_ - [x] T044 [US3] Create floating bulk action panel at bottom: "[✓ N selected] [Migrate] [Backup]" _Contract: @UX_FEEDBACK: Floating panel slides up from bottom_ - [x] T045 [US3] Implement Bulk Migration modal with target environment, database mappings, and selected dashboards list _Contract: @UX_STATE: BulkAction-Modal_ - [x] T046 [US3] Implement Bulk Backup modal with one-time/scheduled options and cron expression - [x] T047 [US3] Implement individual Actions menu with Migrate, Backup, Git Operations options - [x] T048 [US3] Connect Actions menu to existing plugin triggers (Migration, Backup, Git) _Contract: @RELATION: DISPATCHES -> MigrationPlugin, BackupPlugin_ - [x] T049 [US3] Implement status badge click to open Task Drawer with correct task _Contract: @POST: Clicking status badge opens TaskDrawer with that task_ - [x] T050 [US3] Add empty state when no environments configured or no dashboards found _Contract: @UX_STATE: Empty-NoEnv, Empty-NoData_ - [x] T051 [US3] Verify implementation matches ux_reference.md (Dashboard Hub Grid mockup) **Checkpoint**: Dashboard Hub fully functional with bulk operations --- ## Phase 7: User Story 4 - Dataset Hub & Semantic Mapping (Priority: P1) **Goal**: Dedicated hub for datasets with bulk operations, mapping progress, and documentation generation **Independent Test**: Navigate to `/datasets`, select environment, verify grid displays correctly with checkboxes and bulk actions ### Backend for User Story 4 **Contract Requirements**: - All endpoints MUST follow `@PRE` and `@POST` conditions from [DEF:DatasetsAPI:Module](./contracts/modules.md#11-datasets-api) - MUST calculate `mapped_fields` as (mapped_columns / total_columns) * 100 - [x] T052 [P] [US4] Create `backend/src/api/routes/datasets.py` with GET /api/datasets endpoint _Contract: [DEF:DatasetsAPI:Module](./contracts/modules.md#11-datasets-api) - CRITICAL_ - [x] T053 [US4] Implement dataset list fetching with mapped fields count and SQL table extraction _Contract: @INVARIANT: Mapped % is calculated as (mapped_columns / total_columns) * 100_ - [x] T054 [US4] Add pagination support to GET /api/datasets endpoint (page, page_size parameters) - [x] T055 [US4] Implement bulk column mapping endpoint POST /api/datasets/map-columns with source selection _Contract: @PRE: User has permission plugin:mapper:execute_ - [x] T056 [US4] Implement bulk documentation generation endpoint POST /api/datasets/generate-docs _Contract: @PRE: User has permission plugin:llm_analysis:execute_ - [x] T057 [US4] Add dataset-to-dashboard relationship retrieval for linked dashboards display ### Frontend for User Story 4 **Contract Requirements**: - MUST implement all `@UX_STATE` transitions from [DEF:DatasetHub:Component](./contracts/modules.md#8-datasethub-component) - MUST display Mapped % with progress bar as specified in `@UX_FEEDBACK` - [x] T058 [US4] Create `frontend/src/routes/datasets/+page.svelte` as Dataset Hub _Contract: [DEF:DatasetHub:Component](./contracts/modules.md#8-datasethub-component) - CRITICAL_ - [x] T059 [US4] Implement dataset grid with checkboxes, columns: Name, Database, Schema, Tables, Columns, Mapped %, Updated By, Actions _Contract: @UX_FEEDBACK: Mapped % column shows progress bar + percentage text_ - [x] T060 [US4] Implement "Select All" and "Select Visible" buttons in toolbar _Contract: @UX_STATE: Selecting_ - [x] T061 [US4] Add real-time search input that filters dataset list by name, schema, or table names _Contract: @POST: Search filters by name, schema, and table names_ - [x] T062 [US4] Implement pagination controls with page numbers and "Rows per page" dropdown - [x] T063 [US4] Create floating bulk action panel at bottom: "[✓ N selected] [Map Columns] [Generate Docs] [Validate]" _Contract: @UX_STATE: Selecting, @UX_FEEDBACK: Floating panel slides up_ - [x] T064 [US4] Implement Column Mapping modal with PostgreSQL comments/XLSX source selection and preview _Contract: @POST: Map Columns modal shows source selection (PostgreSQL or XLSX) with validation_ - [x] T065 [US4] Implement Documentation Generation modal with LLM provider selection and options _Contract: @POST: Generate Docs modal shows LLM provider selection_ - [x] T066 [US4] Create dataset detail view showing SQL tables, column counts, mapping percentages, and linked dashboards _Contract: @UX_STATE: Detail-View, @POST: Clicking dataset name opens detail view_ - [x] T067 [US4] Add empty state when no datasets found _Contract: @UX_STATE: Empty-NoData_ - [x] T068 [US4] Verify implementation matches ux_reference.md (Dataset Hub Grid mockup) **Checkpoint**: Dataset Hub fully functional with bulk operations --- ## Phase 8: User Story 6 - Consolidated Settings Experience (Priority: P2) **Goal**: All settings consolidated into single section with categories **Independent Test**: Navigate to Settings and verify all categories listed ### Backend for User Story 6 - [x] T049 [P] [US6] Extend `backend/src/api/routes/settings.py` with GET /api/settings endpoint - [x] T050 [US6] Implement consolidated settings response with all categories ### Frontend for User Story 6 - [x] T051 [US6] Create `frontend/src/routes/settings/+page.svelte` as Settings page - [x] T052 [US6] Implement tabbed navigation: Environments, Connections, LLM, Logging, System - [x] T053 [US6] Reuse existing settings components within each tab - [x] T054 [US6] Implement role-based visibility (hide admin tabs for non-admin users) - [x] T055 [US6] Add user-preference settings (theme, language) accessible to all users - [x] T056 [US6] Verify implementation matches ux_reference.md (Settings Page mockup) **Checkpoint**: Settings page fully functional --- ## Phase 9: Polish & Cross-Cutting Concerns **Purpose**: Improvements that affect multiple user stories **Contract Requirements**: - Breadcrumbs MUST follow [DEF:Breadcrumbs:Component](./contracts/modules.md#9-breadcrumbs-component) specification - Error handling MUST implement `@UX_RECOVERY` patterns from component contracts - [x] T057 [P] Add breadcrumb navigation to all new pages _Contract: [DEF:Breadcrumbs:Component](./contracts/modules.md#9-breadcrumbs-component)_ - [x] T058 [P] Implement breadcrumb truncation for deep paths (>3 levels) _Contract: @POST: Deep paths (>3 levels) truncate middle segments_ - [x] T059 Remove old card-based dashboard grid if no longer needed - [x] T060 [P] Add skeleton loaders for resource hub grids _Contract: @UX_STATE: Loading -> Skeleton loaders in grid rows_ - [x] T061 [P] Add error banners for environment connection failures _Contract: @UX_RECOVERY: Failed environment connection shows error banner with retry_ - [x] T062 Run quickstart.md validation for all user stories - [x] T063 Final UX review against ux_reference.md --- ## UX Compliance Verification Report **Date**: 2026-02-15 **Verifier**: QA/Tester Mode **Status**: ✅ PASS - ALL VIOLATIONS RESOLVED ### Critical Violations #### V001: Missing Breadcrumbs in Layout - **Contract**: [DEF:Breadcrumbs:Component](./contracts/modules.md#9-breadcrumbs-component) - @UX_STATE: Idle - **Expected**: Breadcrumbs visible below TopNavbar on all pages - **Actual**: Breadcrumbs component exists but is NOT rendered in +layout.svelte - **Evidence**: `frontend/src/routes/+layout.svelte` imports Breadcrumbs but doesn't use it in template - **Impact**: Users cannot navigate page hierarchy as specified in UX reference - **Fix**: Add `` component between TopNavbar and page content slot - **Status**: ✅ FIXED - Breadcrumbs now rendered in layout #### V002: TopNavbar Missing Sidebar Responsive Classes - **Contract**: [DEF:TopNavbar:Component](./contracts/modules.md#5-topnavbar-component) - @INVARIANT: Height is fixed at 64px - **Expected**: TopNavbar should have `with-sidebar` or `with-collapsed-sidebar` class based on sidebar state - **Actual**: TopNavbar always uses `mobile` class regardless of screen size - **Evidence**: `frontend/src/lib/components/layout/TopNavbar.svelte` line 185: `