# Data Model: Bulk Import All Sources ## Entities ### BulkImportState Tracks the progress and outcome of a bulk import operation. | Field | Type | Description | |-------|------|-------------| | status | "idle" / "loading" / "complete" / "partial-failure" | Current phase of the import operation | | total | number | Total number of sources to fetch (excludes already-cached) | | completed | number | Number of sources successfully fetched and cached | | failed | number | Number of sources that failed to fetch | **State Transitions**: - `idle` → `loading`: User clicks "Load All" - `loading` → `complete`: All sources fetched successfully (failed === 0) - `loading` → `partial-failure`: Some sources failed (failed > 0) - `complete` / `partial-failure` → `idle`: User dismisses or starts a new import ### ToastNotification Lightweight notification data for the toast component. | Field | Type | Description | |-------|------|-------------| | message | string | Primary text to display (e.g., "Loading sources... 34/102") | | progress | number (0-1) or undefined | Optional progress bar value | | dismissible | boolean | Whether the toast shows a dismiss button | | autoDismissMs | number or undefined | Auto-dismiss delay in ms; undefined means persistent | ## Relationships - **BulkImportState** drives the content of both the side panel progress UI and the toast notification. - **ToastNotification** is derived from BulkImportState when the side panel is closed during an active import. - Both consume state from the `useBulkImport` hook. ## Existing Entities (unchanged) - **CachedSourceRecord** (bestiary-cache.ts): Stores normalized creature data per source in IndexedDB. No schema changes. - **BestiaryIndex** (domain): Read-only index with source codes and compact creature entries. No changes.