feat(ui): wire Export/Import job cards to tenant-scoped counts (#554) - #565
Merged
Conversation
…snapshot DashboardSnapshot gains export_jobs (running/queued) and import_jobs_active as Options; None means unavailable, never a fabricated zero. StorageDashboardProvider receives the optional bulk-export / bulk-submit job stores from build_app and fills them; read errors log a warning and yield None. Existing exhaustive DashboardSnapshot literals in the UI crate get the two new fields as None.
The Export card shows the tenant's running/queued bulk-export counts and links to /ui/bulk-export; a new Import card shows active bulk-submit jobs and links to /ui/bulk-import. Both render an explicit unavailable state when the snapshot carries None. Adds the stat-grid--5 modifier (5 cols, 3 at <=1100px, existing 2-col rule at <=900px), en/es/de keys, and an HTTP test. Uptime stays a placeholder (#540).
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
smunini
added a commit
that referenced
this pull request
Aug 19, 2026
Conflicts were the dashboard data path (#565 job cards + #537 bulk export landing on main while this branch reworked the chart) and the UI's CSS/class vocabulary refactor. Resolution: - DashboardSnapshot carries both sides: `available`/`TypeCount` (#555) and `export_jobs`/`import_jobs_active` (#565). The provider keeps this branch's `distinct_types` (derived from `available`) instead of main's second `count_all_types` read, and gains main's job-store counts. - Rest dashboard tests updated for the three-argument `snapshot(window, tenant, types)` signature. - app.css: main's new rules folded into this branch's `@layer` structure. - Main's new templates moved onto the renamed vocabulary this branch introduced (`.button` -> `.btn`, `.page-title` -> `.page-head__title`). - Bulk-export status chips renamed `.chip*` -> `.status-chip*`: `.chip` is already the filter affordance on the search/registry pages, and the duplicate definition both collided visually and tripped the new design-system guard. The dead duplicate `.notice` block from #537 is dropped (the registry-viewer `.notice` won the cascade anyway). - Dashboard e2e expects five stat cards (main's job cards) and keeps this branch's `waitForSeries()`. Claude-Session: https://claude.ai/code/session_019E74WX1whW1NaT1SjUqXJG
angela-helios
added a commit
that referenced
this pull request
Aug 19, 2026
Main brought Bulk Export (#538), the dashboard job cards (#565), and the menu close behaviors (#566). The vocabulary work carries over both export pages, which predate #543: canonical title/button classes, the job-status chips move onto the .tag status-pill family (main's new .chip block collided with the facet-chip component — exactly the duplicate this branch exists to kill), the typegrid joins the pages layer, the job-card additions join the components layer, and both export routes join the shared guard list. Also makes the design-system guard read app.css and the shipped scripts over HTTP from the server under test instead of the source tree: the CI runner drives a packaged binary with no checkout alongside it (the ENOENT on every merge-ref run), and in HFS_E2E_BASE_URL mode the running server is the only truth worth checking anyway.
angela-helios
added a commit
that referenced
this pull request
Aug 19, 2026
…ashboard-chart Combines the multi-series chart with main's #565 job cards: the snapshot carries both the picker's available types and the job counts, the metrics render real export/import figures inside the rewritten build_dashboard, and the stat-card spec expects five cards with the chart's series wait.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #554.
What
<a class="card stat stat--link">): Export → /ui/bulk-export, Import → /ui/bulk-import.stat-grid--5modifier (5 cols on desktop, 3 ≤1100px, existing 2-col rule ≤900px).How
BulkExportStorage::count_exports_by_status(tenant, status)(SQLite + Postgres, additive).count_active_exportsis untouched — it still backs the concurrency cap.DashboardSnapshotgainsexport_jobs: Option<ExportJobCounts { running, queued }>andimport_jobs_active: Option<u64>;Nonemeans unavailable.StorageDashboardProvider::with_job_stores(..)receives the optional bulk-export / bulk-submit job stores already built inbuild_appand fills the two fields. running =in-progress, queued =accepted. A read error logs a warning and yieldsNone; no store wired yieldsNonesilently.DashboardMetricscarriesOptions, template + CSS + i18n (en/es/de) + HTTP test; e2e page object and spec cover both cards (stat-card count 4 → 5).Decisions (as requested by the issue)
/metrics; nothing per-tenant is added to/metrics.in-progress/accepted); the card copy is unchanged.Coordination
/ui/bulk-export(Export card link) — merge this after feat(ui): Bulk Export workspace — scoped kick-off, filters, active exports #538. If feat(ui): Bulk Export workspace — scoped kick-off, filters, active exports #538 changes the route name, the href incrates/ui/templates/pages/index.htmland the e2e assertion are the only two places to touch.max-width: 1081pxbreakpoint;app.csshas no such rule — the existing 900px rule plus a new 1100px rule for the 5-col grid are used instead.Testing
cargo fmt --all -- --check, workspacecargo clippy --all-targets --all-features -D warnings(CI allow-list),cargo test -p helios-persistence bulk_export(SQLite unit + Postgres via testcontainers),cargo test -p helios-observability -p helios-rest -p helios-ui,cargo build -p helios-hfs --features ui.hfson SQLite →/uishows Export "0 / running (0 queued)" and Import "0 / active".--list); the full browser run relies on CI (ui-tests.yml) — Chromium could not be downloaded on the dev box.