# Design Document: Resource-Centric UI & Unified Task Experience

## 1. Core Philosophy

The application moves from a **Task-Centric** model (where users navigate to "Migration Tool" or "Git Tool") to a **Resource-Centric** model. Users navigate to the object they want to manage (Dashboard, Dataset) and perform actions on it.

**Goals:**
1.  **Context preservation:** Users shouldn't lose their place in a list just to see a log.
2.  **Discoverability:** All actions available for a resource are grouped together.
3.  **Traceability:** Every action is explicitly linked to a Task ID with accessible logs.

---

## 2. Navigation Structure (Navbar)

**Old Menu:**
`[Home] [Migration] [Git Manager] [Mapper] [Settings] [Logout]`

**New Menu:**
`[Superset Manager]  [Dashboards]  [Datasets]  [Storage]  |  [Activity (0)] [Settings] [User]`

*   **Dashboards**: Main hub for all dashboard operations (Migrate, Backup, Git).
*   **Datasets**: Hub for dataset documentation and mapping.
*   **Storage**: File management (Backups, Repositories).
*   **Activity**: Global indicator of running tasks. Clicking it opens the Task Drawer.

---

## 3. Page Layouts

### 3.1. Dashboard Hub (`/dashboards`)

The central place for managing Superset Dashboards.

**Wireframe:**
```text
+-----------------------------------------------------------------------+
|  Select Source Env: [ Development (v) ]     [ Refresh ]               |
+-----------------------------------------------------------------------+
|  Search: [ Filter by title... ]                                       |
+-----------------------------------------------------------------------+
|  Title           | Slug        | Git Status    | Last Task | Actions  |
|------------------|-------------|---------------|-----------|----------|
|  Sales Report    | sales-2023  | 🌿 main (OK)  | (v) Done  | [ ... ]  |
|  HR Analytics    | hr-dash     | -             | ( ) Idle  | [ ... ]  |
|  Logs Monitor    | logs-v2     | 🌿 dev (Diff) | (@) Run.. | [ ... ]  |
+-----------------------------------------------------------------------+
```

**Interaction Details:**
1.  **Source Env Selector**: Loads dashboards via `superset_client.get_dashboards`.
2.  **Status Column ("Last Task")**:
    *   Shows the status of the *last known action* for this dashboard in the current session.
    *   **States**: `Idle`, `Running` (Spinner), `Waiting Input` (Orange Key), `Success` (Green Check), `Error` (Red X).
    *   **Click Action**: Clicking the icon/badge opens the **Task Drawer**.
3.  **Actions Menu ([ ... ])**:
    *   **Migrate**: Opens `DeploymentModal` (Simplified: just Target Env selector).
    *   **Backup**: Immediately triggers `BackupPlugin`.
    *   **Git Operations**:
        *   *Init Repo* (if Git Status is empty).
        *   *Commit/Push*, *History*, *Checkout* (if Git initialized).
    *   **Validate**: Triggers LLM Analysis.

### 3.2. Dataset Hub (`/datasets`)

The central place for managing physical datasets and semantic layers.

**Wireframe:**
```text
+-----------------------------------------------------------------------+
|  Select Source Env: [ Production (v) ]                                |
+-----------------------------------------------------------------------+
|  Table Name      | Schema      | Mapped Fields | Last Task | Actions  |
|------------------|-------------|---------------|-----------|----------|
|  fact_orders     | public      | 15 / 20       | (v) Done  | [ ... ]  |
|  dim_users       | auth        | 0 / 5         | ( ) Idle  | [ ... ]  |
+-----------------------------------------------------------------------+
```

**Actions Menu ([ ... ])**:
*   **Map Columns**: Opens the Mapping Modal (replaces `MapperPage`).
*   **Generate Docs**: Triggers `DocumentationPlugin`.

---

## 4. The Global Task Drawer

**Concept:** A slide-out panel that overlays the right side of the screen. It persists in the DOM layout (Global Layout) but is hidden until triggered.

**Trigger Points:**
1.  Clicking a **Status Badge** in any Grid row (Dashboard or Dataset).
2.  Clicking the **Activity** indicator in the Navbar.

**Layout:**
```text
+---------------------------------------------------------------+
|  Task: Migration "Sales Report"                   [X] Close   |
|  ID: 1234-5678-uuid                                           |
|  Status: WAITING_INPUT (Paused)                               |
+---------------------------------------------------------------+
|                                                               |
|  [Log Stream Area]                                            |
|  10:00:01 [INFO] Starting migration...                        |
|  10:00:02 [INFO] Exporting dashboard...                       |
|  10:00:05 [WARN] Target DB requires password!                 |
|                                                               |
+---------------------------------------------------------------+
|  INTERACTIVE AREA (Dynamic)                                   |
|                                                               |
|  Target Database: "Production DB"                             |
|  Enter Password: [ ********** ]                               |
|                                                               |
|  [ Cancel ] [ Resume Task ]                                   |
+---------------------------------------------------------------+
```

**Behavior:**
*   **Context Aware**: If I trigger a migration on "Sales Report", the Drawer automatically opens and subscribes to that task's ID.
*   **Multi-Tasking**: I can close the drawer (click [X]) to let the task run in the background. The "Activity" badge in the navbar increments.
*   **Input Handling**: Components like `PasswordPrompt` or `MissingMappingModal` are no longer center-screen modals blocking the whole UI. They are rendered *inside* the Interactive Area of the Drawer.

---

## 5. Technical Component Architecture

### 5.1. Stores (`stores/tasks.js`)
Needs a new reactive store structure to map Resources to Tasks.

```javascript
// Map resource UUIDs to their active/latest task UUIDs
export const resourceTaskMap = writable({
  "dashboard-uuid-1": { taskId: "task-uuid-A", status: "RUNNING" },
  "dataset-uuid-2":   { taskId: "task-uuid-B", status: "SUCCESS" }
});

// The currently focused task in the Drawer
export const activeDrawerTask = writable(null); // { taskId: "..." }
export const isDrawerOpen = writable(false);
```

### 5.2. Components
*   `DashboardHub.svelte`: Main page.
*   `DatasetHub.svelte`: Main page.
*   `GlobalTaskDrawer.svelte`: Lives in `+layout.svelte`. Connects to `activeDrawerTask`.
*   `ActionMenu.svelte`: Reusable dropdown for grids.