tasks ready
This commit is contained in:
66
specs/007-migration-dashboard-grid/research.md
Normal file
66
specs/007-migration-dashboard-grid/research.md
Normal file
@@ -0,0 +1,66 @@
|
||||
# Research: Migration Dashboard Grid
|
||||
|
||||
## 1. Superset API Capabilities
|
||||
|
||||
**Objective**: Verify how to fetch dashboard metadata (title, last modified, status).
|
||||
|
||||
- **Findings**:
|
||||
- The `SupersetClient.get_dashboards` method in `superset_tool/client.py` already exists.
|
||||
- It fetches the following columns by default: `["slug", "id", "changed_on_utc", "dashboard_title", "published"]`.
|
||||
- This covers all requirements:
|
||||
- Name -> `dashboard_title`
|
||||
- Last Modified -> `changed_on_utc`
|
||||
- Status -> `published`
|
||||
- Pagination is handled internally by `_fetch_all_pages`, so the client fetches *all* dashboards.
|
||||
|
||||
- **Decision**: Use the existing `SupersetClient.get_dashboards` method. No changes needed to the core client.
|
||||
|
||||
## 2. Frontend Grid Implementation
|
||||
|
||||
**Objective**: Choose a strategy for the grid component (filtering, sorting, pagination).
|
||||
|
||||
- **Options**:
|
||||
1. **Server-side pagination**: Fetch page by page. Good for huge datasets (>10k).
|
||||
2. **Client-side pagination**: Fetch all, filter/sort/paginate in browser. Good for typical datasets (<1k) and simplifies "Select All" logic.
|
||||
|
||||
- **Findings**:
|
||||
- Spec explicitly requests "Client-side (Fetch all, filter locally)".
|
||||
- Spec requires "Select All" to select *all filtered results*, which is trivial with client-side state but complex with server-side pagination (requires tracking exclusion list or query parameters).
|
||||
- Existing `MappingTable.svelte` is too simple (no sorting/pagination).
|
||||
|
||||
- **Decision**:
|
||||
- Implement a new `DashboardGrid.svelte` component.
|
||||
- **State Management**:
|
||||
- `dashboards`: Array of all fetched dashboards.
|
||||
- `filterText`: String for name filtering.
|
||||
- `sortColumn`: 'title' | 'changed_on' | 'published'.
|
||||
- `sortDirection`: 'asc' | 'desc'.
|
||||
- `currentPage`: Integer.
|
||||
- `pageSize`: Integer (default 20).
|
||||
- `selectedIds`: Set/Array of selected dashboard IDs.
|
||||
- **Logic**:
|
||||
- `filteredDashboards`: Derived store/value based on `dashboards` + `filterText`.
|
||||
- `sortedDashboards`: Derived from `filteredDashboards` + `sort` params.
|
||||
- `paginatedDashboards`: Slice of `sortedDashboards` for current page.
|
||||
- "Select All": Adds all IDs from `sortedDashboards` (not just `paginatedDashboards`) to `selectedIds`.
|
||||
|
||||
## 3. API Contract
|
||||
|
||||
**Objective**: Define the endpoint to serve dashboard data.
|
||||
|
||||
- **Current State**: Need to check if an endpoint exists that returns this data.
|
||||
- **Requirement**: `GET /api/migration/dashboards` (or similar).
|
||||
- **Response Structure**:
|
||||
```json
|
||||
[
|
||||
{
|
||||
"id": 123,
|
||||
"title": "Sales Dashboard",
|
||||
"changed_on": "2023-10-27T10:00:00Z",
|
||||
"published": true
|
||||
},
|
||||
...
|
||||
]
|
||||
```
|
||||
|
||||
- **Decision**: Create or update a route in `backend/src/api/routes/migration.py` (or `mappings.py` if more appropriate, but `migration` seems better for source selection).
|
||||
Reference in New Issue
Block a user