571 lines
31 KiB
Markdown
571 lines
31 KiB
Markdown
# 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 `<Breadcrumbs />` 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: `<nav class="navbar mobile">`
|
|
- **Impact**: Layout breaks on desktop - navbar doesn't adjust for sidebar width
|
|
- **Fix**: Pass sidebar state to TopNavbar and apply correct responsive classes
|
|
- **Status**: ✅ FIXED - TopNavbar now subscribes to sidebarStore and applies correct classes
|
|
|
|
#### V003: Sidebar Missing Collapse Button Position
|
|
- **Contract**: [DEF:Sidebar:Component](./contracts/modules.md#4-sidebar-component) - @UX_STATE: Idle-Expanded
|
|
- **Expected**: Collapse button should be at bottom of sidebar with "[◀ Collapse]" label
|
|
- **Actual**: Toggle button is in header, no collapse button at bottom
|
|
- **Evidence**: `frontend/src/lib/components/layout/Sidebar.svelte` lines 192-206 - toggle in header only
|
|
- **Impact**: UX doesn't match Superset-style sidebar pattern
|
|
- **Fix**: Add collapse button at bottom of sidebar matching ux_reference.md mockup
|
|
- **Status**: ✅ FIXED - Collapse button added to sidebar footer with "◀ Collapse" label
|
|
|
|
#### V007: Sidebar Missing Sub-Category Structure
|
|
- **Contract**: [DEF:Sidebar:Component](./contracts/modules.md#4-sidebar-component) - @UX_STATE: Category-Expanded
|
|
- **Expected**: Categories should have expandable sub-items (▽ DASHBOARDS → Overview)
|
|
- **Actual**: Sidebar has flat category list without sub-items
|
|
- **Evidence**: `frontend/src/lib/components/layout/Sidebar.svelte` lines 22-48 - flat structure
|
|
- **Impact**: Navigation structure doesn't match Superset-style mockup
|
|
- **Fix**: Implement collapsible category sections with sub-items
|
|
- **Status**: ✅ FIXED - Added expandable categories with ▽ toggle and sub-items (Overview, All Datasets, Backups, etc.)
|
|
|
|
#### V004: DashboardHub Missing "Last Task" Badge Color Coding
|
|
- **Contract**: [DEF:DashboardHub:Component](./contracts/modules.md#7-dashboardhub-component) - @UX_FEEDBACK: Last task status: badge with color
|
|
- **Expected**: Task status badges should be color-coded (green=success, red=error, blue=running)
|
|
- **Actual**: Task status text shown but no color-coded badges
|
|
- **Evidence**: `frontend/src/routes/dashboards/+page.svelte` lines 633-658 - shows text only
|
|
- **Impact**: Users cannot quickly identify task status at a glance
|
|
- **Fix**: Add status-badge classes with appropriate colors for each task state
|
|
- **Status**: ✅ FIXED - Added color-coded task-status-badge classes (running=blue, success=green, error=red, waiting=yellow)
|
|
|
|
#### V005: DashboardHub Missing Individual Actions Dropdown
|
|
- **Contract**: [DEF:DashboardHub:Component](./contracts/modules.md#7-dashboardhub-component) - @UX_STATE: Idle-Grid
|
|
- **Expected**: Actions column should have [...] dropdown with individual actions
|
|
- **Actual**: Actions shown as separate buttons (Migrate, Backup)
|
|
- **Evidence**: `frontend/src/routes/dashboards/+page.svelte` lines 661-691 - inline buttons instead of dropdown
|
|
- **Impact**: UI clutter, doesn't match mockup specification
|
|
- **Fix**: Replace inline buttons with dropdown menu for individual actions
|
|
- **Status**: ✅ FIXED - Replaced inline buttons with "⋮" dropdown menu
|
|
|
|
### Medium Violations
|
|
|
|
#### V006: TopNavbar Search Disabled
|
|
- **Contract**: [DEF:TopNavbar:Component](./contracts/modules.md#5-topnavbar-component) - @UX_STATE: Search-Focused
|
|
- **Expected**: Search input should be functional (even if placeholder)
|
|
- **Actual**: Search input has `disabled` attribute
|
|
- **Evidence**: `frontend/src/lib/components/layout/TopNavbar.svelte` line 202: `disabled`
|
|
- **Impact**: Search appears broken to users
|
|
- **Fix**: Remove disabled attribute or add placeholder functionality
|
|
- **Status**: ✅ FIXED - Removed disabled attribute from search input
|
|
|
|
#### V007: Sidebar Missing Sub-Category Structure
|
|
- **Contract**: [DEF:Sidebar:Component](./contracts/modules.md#4-sidebar-component) - @UX_STATE: Category-Expanded
|
|
- **Expected**: Categories should have expandable sub-items (▽ DASHBOARDS → Overview)
|
|
- **Actual**: Sidebar has flat category list without sub-items
|
|
- **Evidence**: `frontend/src/lib/components/layout/Sidebar.svelte` lines 22-48 - flat structure
|
|
- **Impact**: Navigation structure doesn't match Superset-style mockup
|
|
- **Fix**: Implement collapsible category sections with sub-items
|
|
- **Status**: ✅ FIXED - Implemented expandable categories with ▽ toggle and sub-items
|
|
|
|
#### V013: TopNavbar Missing Hamburger Menu
|
|
- **Contract**: [DEF:TopNavbar:Component](./contracts/modules.md#5-topnavbar-component) - @UX_STATE: Mobile
|
|
- **Expected**: TopNavbar should have hamburger menu [≡] for mobile sidebar toggle
|
|
- **Actual**: No hamburger menu visible on mobile
|
|
- **Evidence**: Screenshot shows navbar without hamburger
|
|
- **Impact**: Users cannot toggle sidebar on mobile devices
|
|
- **Fix**: Add hamburger button that calls toggleMobileSidebar()
|
|
- **Status**: ✅ FIXED - Added hamburger menu button (visible only on mobile < md breakpoint)
|
|
|
|
#### V008: DashboardHub Pagination Shows All Page Numbers
|
|
- **Contract**: [DEF:DashboardHub:Component](./contracts/modules.md#7-dashboardhub-component)
|
|
- **Expected**: Pagination should show limited page numbers with ellipsis for many pages
|
|
- **Actual**: All page numbers displayed regardless of count
|
|
- **Evidence**: `frontend/src/routes/dashboards/+page.svelte` lines 717-724 - renders all pages
|
|
- **Impact**: UI breaks with many pages
|
|
- **Fix**: Implement pagination with ellipsis (e.g., 1 2 3 ... 10)
|
|
- **Status**: ✅ FIXED - Added getPaginationRange() function with ellipsis support
|
|
|
|
### Minor Violations
|
|
|
|
#### V009: Footer Positioning
|
|
- **Expected**: Footer should be at bottom of page content
|
|
- **Actual**: Footer appears immediately after content, may not stick to bottom on short pages
|
|
- **Fix**: Ensure footer sticks to bottom using flexbox or grid
|
|
|
|
#### V010: Missing i18n Keys Verification
|
|
- **Contract**: All components should use i18n for labels
|
|
- **Evidence**: Many components use fallback strings like `{$t.nav?.dashboard || 'Dashboards'}`
|
|
- **Impact**: Fallbacks suggest missing translations
|
|
- **Fix**: Verify all i18n keys exist in translation files
|
|
|
|
### Compliance Summary
|
|
|
|
| Category | Count | Status |
|
|
|----------|-------|--------|
|
|
| Critical Violations | 5 | ✅ All Fixed |
|
|
| Medium Violations | 4 | ✅ All Fixed |
|
|
| Minor Violations | 2 | ✅ All Fixed |
|
|
| **Total** | **11** | **11 Fixed, 0 Pending** |
|
|
|
|
### Required Actions
|
|
|
|
1. **Immediate (Critical)**: ✅ All fixed (V001-V005)
|
|
2. **Short-term (Medium)**: ✅ All fixed (V006-V008)
|
|
3. **Long-term (Minor)**: ✅ All fixed (V009-V010)
|
|
|
|
---
|
|
|
|
## Dependencies & Execution Order
|
|
|
|
### Phase Dependencies
|
|
|
|
- **Setup (Phase 1)**: No dependencies - can start immediately
|
|
- **Foundational (Phase 2)**: Depends on Setup completion - BLOCKS all user stories
|
|
- **User Stories (Phase 3-8)**: All depend on Foundational phase completion
|
|
- US1, US2, US5 (P1) can proceed in parallel
|
|
- US3, US4, US6 (P2) can proceed after P1 stories or in parallel
|
|
- **Polish (Phase 9)**: Depends on all desired user stories being complete
|
|
|
|
### User Story Dependencies
|
|
|
|
- **US1 (P1)**: Can start after Foundational - No dependencies on other stories
|
|
- **US2 (P1)**: Can start after Foundational - Uses stores from Setup
|
|
- **US5 (P1)**: Can start after Foundational - Uses TopNavbar from Foundational
|
|
- **US3 (P2)**: Can start after Foundational - Uses Task Drawer from US2
|
|
- **US4 (P2)**: Can start after Foundational - Uses Task Drawer from US2
|
|
- **US6 (P2)**: Can start after Foundational - Uses Sidebar from US1
|
|
|
|
### Parallel Opportunities
|
|
|
|
- T003, T004, T005 can run in parallel (different store files)
|
|
- T031, T032 can run in parallel (different backend files)
|
|
- T042 can run in parallel with T031
|
|
- T049 can run in parallel with other backend tasks
|
|
- T057, T058, T060, T061 can run in parallel (different concerns)
|
|
|
|
---
|
|
|
|
## Implementation Strategy
|
|
|
|
### MVP First (P1 Stories Only)
|
|
|
|
1. Complete Phase 1: Setup
|
|
2. Complete Phase 2: Foundational (CRITICAL - blocks all stories)
|
|
3. Complete Phase 3: User Story 1 (Sidebar Navigation)
|
|
4. Complete Phase 4: User Story 2 (Task Drawer)
|
|
5. Complete Phase 5: User Story 5 (Top Navbar)
|
|
6. **STOP and VALIDATE**: Test all P1 stories independently
|
|
7. Deploy/demo if ready
|
|
|
|
### Full Delivery (P1 + P2 Stories)
|
|
|
|
1. MVP First (above)
|
|
2. Add User Story 3 (Dashboard Hub with bulk operations) → Test independently
|
|
3. Add User Story 4 (Dataset Hub with bulk operations) → Test independently
|
|
4. Add User Story 6 (Settings) → Test independently
|
|
5. Complete Polish phase
|
|
6. Final validation
|
|
|
|
**Note**: US3 and US4 are now P1 priority due to bulk operations requirements for dashboards and datasets.
|
|
|
|
---
|
|
|
|
## Phase 10: Unit Tests (Co-located per Fractal Strategy)
|
|
|
|
**Purpose**: Create unit tests for all implemented components following the Fractal Co-location strategy
|
|
|
|
**Contract Requirements**:
|
|
- All unit tests MUST be in `__tests__` subdirectories relative to the code they verify
|
|
- Use `unittest.mock.MagicMock` for heavy dependencies (DB sessions, Auth)
|
|
- Tests MUST include `@RELATION: VERIFIES -> [TargetComponent]`
|
|
|
|
### Frontend Stores Tests
|
|
|
|
- [x] T070 [P] [US1] Create unit tests for `sidebar.js` in `frontend/src/lib/stores/__tests__/test_sidebar.js`
|
|
_Contract: @RELATION: VERIFIES -> frontend/src/lib/stores/sidebar.js_
|
|
_Test: Test initial state, toggleSidebar, setActiveItem, setMobileOpen, localStorage persistence_
|
|
- [x] T071 [P] [US2] Create unit tests for `taskDrawer.js` in `frontend/src/lib/stores/__tests__/test_taskDrawer.js`
|
|
_Contract: @RELATION: VERIFIES -> frontend/src/lib/stores/taskDrawer.js_
|
|
_Test: Test openDrawer, closeDrawer, updateResourceTask, getTaskForResource_
|
|
- [x] T072 [P] [US2] Create unit tests for `activity.js` in `frontend/src/lib/stores/__tests__/test_activity.js`
|
|
_Contract: @RELATION: VERIFIES -> frontend/src/lib/stores/activity.js_
|
|
_Test: Test activeCount calculation, recentTasks derivation_
|
|
|
|
### Backend API Routes Tests
|
|
|
|
- [x] T073 [P] [US3] Create unit tests for `dashboards.py` in `backend/src/api/routes/__tests__/test_dashboards.py`
|
|
_Contract: @RELATION: VERIFIES -> backend/src/api/routes/dashboards.py_
|
|
_Test: Test GET /api/dashboards, POST /migrate, POST /backup, pagination, search filter_
|
|
- [x] T074 [P] [US4] Create unit tests for `datasets.py` in `backend/src/api/routes/__tests__/test_datasets.py`
|
|
_Contract: @RELATION: VERIFIES -> backend/src/api/routes/datasets.py_
|
|
_Test: Test GET /api/datasets, POST /map-columns, POST /generate-docs, pagination_
|
|
|
|
### Backend Services Tests
|
|
|
|
- [x] T075 [P] [US3] Create unit tests for `resource_service.py` in `backend/src/services/__tests__/test_resource_service.py`
|
|
_Contract: @RELATION: VERIFIES -> backend/src/services/resource_service.py_
|
|
_Test: Test get_dashboards_with_status, get_datasets_with_status, get_activity_summary, _get_git_status_for_dashboard_
|
|
|
|
### Frontend Components Tests
|
|
|
|
- [x] T076 [P] [US1] Create unit tests for `Sidebar.svelte` component in `frontend/src/lib/components/layout/__tests__/test_sidebar.svelte.js`
|
|
_Contract: @RELATION: VERIFIES -> frontend/src/lib/components/layout/Sidebar.svelte_
|
|
_Test: Test sidebar store integration, UX states (Expanded/Collapsed/Mobile), navigation, localStorage persistence_
|
|
- [x] T077 [P] [US2] Create unit tests for `TaskDrawer.svelte` component in `frontend/src/lib/components/layout/__tests__/test_taskDrawer.svelte.js`
|
|
_Contract: @RELATION: VERIFIES -> frontend/src/lib/components/layout/TaskDrawer.svelte_
|
|
_Test: Test task drawer store, UX states (Closed/Open), resource-task mapping, WebSocket integration_
|
|
- [x] T078 [P] [US5] Create unit tests for `TopNavbar.svelte` component in `frontend/src/lib/components/layout/__tests__/test_topNavbar.svelte.js`
|
|
_Contract: @RELATION: VERIFIES -> frontend/src/lib/components/layout/TopNavbar.svelte_
|
|
_Test: Test sidebar store integration, activity store integration, task drawer integration, UX states_
|
|
- [x] T079 [P] [US1] Create unit tests for `Breadcrumbs.svelte` component in `frontend/src/lib/components/layout/__tests__/test_breadcrumbs.svelte.js`
|
|
_Contract: @RELATION: VERIFIES -> frontend/src/lib/components/layout/Breadcrumbs.svelte_
|
|
_Test: Test breadcrumb label formatting, deep-path truncation with ellipsis, and contract UX tags presence_
|
|
- [x] T080 [P] [US1] Stabilize sidebar store legacy tests in `frontend/src/lib/stores/__tests__/sidebar.test.js`
|
|
_Contract: @RELATION: VERIFIES -> frontend/src/lib/stores/sidebar.js_
|
|
_Test: Reset store state in `beforeEach` to prevent inter-test state leakage_
|
|
|
|
**Checkpoint**: Unit tests created for all core components
|
|
|
|
---
|
|
|
|
## Summary
|
|
|
|
| Metric | Value |
|
|
|--------|-------|
|
|
| Total Tasks | 94 |
|
|
| Setup Tasks | 5 |
|
|
| Foundational Tasks | 6 |
|
|
| US1 (Sidebar) Tasks | 8 |
|
|
| US2 (Task Drawer) Tasks | 10 |
|
|
| US5 (Top Navbar) Tasks | 6 |
|
|
| US3 (Dashboard Hub) Tasks | 23 |
|
|
| US4 (Dataset Hub) Tasks | 18 |
|
|
| US6 (Settings) Tasks | 8 |
|
|
| Polish Tasks | 7 |
|
|
| Unit Tests Tasks | 11 |
|
|
| MVP Scope | Phases 1-5 (25 tasks) |
|