Skip to content

AI-mode service page: version history, follow, announcements, delete lands on the list - #35318

Merged
harsh-vador merged 29 commits into
mainfrom
feat/ai-mode-service-header-actions
Oct 16, 2026
Merged

harsh-vador merged 29 commits into
mainfrom
feat/ai-mode-service-header-actions

Conversation

@harsh-vador

@harsh-vador harsh-vador commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Describe your changes:

Fixes 7316
Follow-up to #35314 (design review of the AI-mode service details page, #35270). It covers the header items design settled on 2026-10-13. Based on main (#35286 and #35314 have merged). Delete lands on the service list for the permanent delete #35310 added on a soft-deleted service too.

Before After
Version history none current version in the header (↻ 0.2); pressing it opens the version view with the Versions History timeline, as Context Center articles do
Follow none follow / unfollow star in the header, database services only, as classic
Announcements only through Settings → Announcements the service's active announcements under the header on every tab; clicking one opens the drawer
After delete navigate(-1), so wherever the user came from the service category's tab on the Connections listing

How

  • Version history, as Context Center articles. Design pointed at the article's version history:
    • The header shows the current version. Pressing it opens the version route /service/<category>/<fqn>/versions/<version>, which shows that version beside the Versions History timeline (EntityVersionTimeLine).
    • Picking a version moves to it, and closing returns to /connections/<category>/<fqn>.
    • AI mode already serves this route inside the Connections layout (connections.module.tsx), so the header only navigates there; no new panel.
    • The article's version button is now common/HeaderVersionButton, used by both headers. Its version-btn test id is unchanged.
  • Follow. Reuses classic's StatItem + FollowStarIcon with the same entity-follow-button test id.
    • Shown for a live database service only. That matches classic, and the followers endpoint (addServiceFollower) exists for database services alone.
    • The page keeps the followers list the server returns.
  • Announcements. useActiveAnnouncements loads the active ones (only the latest request may write). AnnouncementsWidgetV3Body, the banner domain details uses, renders them above every tab's content. Closing the announcement drawer reloads them.
    • Collate's Summary tab shows no announcements of its own, so they are not duplicated there.
  • Delete. getServiceListPath (beside the category breadcrumb, which now shares its lookup) gives /connections?category=<category>, or /connections for a category the listing does not tab. Per @pmbrull, the redirect happens after the delete is accepted, soft or hard.
Screen.Recording.2026-10-13.at.2.53.50.PM.mov

Postgres run - https://github.com/open-metadata/OpenMetadata/actions/runs/38683500178

Type of change:

  • Improvement

High-level design:

N/A — small change.

Tests:

Use cases covered

  • The header's version opens the service's version view with its Versions History, and closing it returns to the page
  • A database service can be followed and unfollowed; other service types and a deleted service offer no Follow
  • An active announcement shows under the header on the data-assets tab and on Connection; clicking it opens the drawer, and closing reloads them
  • Deleting the service lands on its category's listing

Unit tests

  • New:
    • HeaderVersionButton.test.tsx (1)
    • ServiceFollowButton.test.tsx (3): follow, unfollow, failure keeps followers
    • useActiveAnnouncements.test.ts (5): load, waits for the entity, refetch, stale response ignored, error
  • ConnectionServiceDetailsPage.test.tsx (+7): version button opens the version route, follow gating and follower round trip, delete redirect, banner on every tab, drawer open/close reload
  • connectionsBreadcrumb.utils.test.ts (+2)
  • 381/381 pass across the page folder, Context Center, HeaderVersionButton and pages/ServiceDetailsPage.

Backend integration tests

  • Not applicable (no backend API changes).

Ingestion integration tests

  • Not applicable (no ingestion changes).

Playwright (UI) tests

  • playwright/e2e/Features/AIMode/ConnectionServiceDetails.spec.ts: +4 tests (version history; follow then unfollow; announcement on every tab; delete lands on the list). The database service gets a second version and an active announcement in beforeAll.
  • Spec: 17/17 passed (37.9s). Also checked by hand that closing Versions History returns to /connections/.... Not run against the base branch as a control.
  • Timing baseline: four entries added. Impact map regenerated (+2 entries for the new files).

Manual testing performed

Ran this branch against a local server in the light and dark themes; screenshots below.

UI screen recording / screenshots:

Checklist:

🤖 Generated with Claude Code

harsh-vador and others added 10 commits October 12, 2026 21:18
…ct views in AI mode

The AI-mode service details page had only one asset tab per service, so a
dashboard service's data models and a drive service's files and
spreadsheets could not be reached, and the service's data products were
neither shown nor editable (their right-panel container is hidden here).

- Dashboard services get a Data Model tab (classic's DataModelTable), and
  drive services Files and Spreadsheets tabs, between the data-assets tab
  and Connection. Tab keys are classic's EntityTabs values, so classic deep
  links land on them. Content mounts only for a tab the category offers,
  so a deep link to a tab the service lacks never fetches.
- FilesTable / SpreadsheetsTable leave the plain list and its paging to
  the caller; useServiceDriveAssets owns that once for both: the table's
  fields, top level only, the Deleted switch, the URL cursor, deferring to
  the table's own search, and only the latest request writes the rows.
- Metadata Details shows the service's data products with
  DataProductsContainer, gated like classic: EditAll on a live service,
  the entity rules for multiple / domain-required, none for metadata
  services.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Swap DataProductsContainer, a right-panel card, for DataProductsSection,
the section family Metadata Details already uses for glossary terms and
tags, so it sits flush with them and applies the entity rules itself.
It saves the service through the entity patch API; the page only mirrors
the result into its own copy, so nothing is patched twice.

The Playwright test now assigns a data product from the section, checks
the service PATCH, and that it persists across a reload.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…abs-parity

# Conflicts:
#	.github/playwright/timing-baseline.json
… warnings

- Mark the fire-and-forget fetches in effects with `void` (Sonar S9383):
  useServiceDriveAssets' list fetch and the page's own list fetch. Both
  catch their own errors.
- The service and permission fetch effect now declares its dependencies,
  so moving to another service without a remount loads that service
  instead of keeping the old one.
- Theme-adapting `utility-` palette classes instead of static grays.
- Memoise DataAssetsTab's tag list so its callbacks keep their identity.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…gn review

- Tab labels count their assets: the data-assets tab and each secondary tab
  (data models, files, spreadsheets), fetched with limit=0 so a count shows
  before its tab's list loads, and following the Deleted switch.
- Metadata Details opens expanded.
- The asset table drops the outer card (ServiceMainTabContent `wrapInCard`,
  default true so classic is unchanged) and takes the metadata card's rounded
  corners and border token; the panel's grey backdrop no longer shows under it.
- A long service name ends in an ellipsis with the full name in a tooltip, and
  the Deleted badge moves to the page header's badge slot.
- Secondary-tab definitions move to connectionServiceChildren.utils as a Map,
  so a URL category such as `constructor` resolves to no tabs.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…on the AI-mode service page

- Version history: the header shows the current version as a pill that opens
  a version-history slideout, as on Context Center. The slideout and pill are
  extracted from Context Center's persona drawer into
  common/VersionHistorySlideout, and the persona drawer now renders through it
  (restore stays persona-specific). Service versions use classic's change
  summary (getSummary).
- Follow: database services only and not when deleted, as classic; reuses
  classic's StatItem + FollowStarIcon (`entity-follow-button`).
- Announcements: the service's active announcements show under the header on
  every tab (AnnouncementsWidgetV3Body, as on domain details), open the
  announcement drawer, and reload when it closes.
- Delete: lands on the service category's tab on the Connections listing
  instead of navigate(-1).
- formatEntityVersion moves to EntityVersionUtilsPure (was persona-only).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@harsh-vador harsh-vador self-assigned this Oct 13, 2026
@github-actions github-actions Bot added the UI UI specific issues label Oct 13, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Hi there 👋 Thanks for your contribution!

The OpenMetadata team will review the PR shortly! Once it has been labeled as safe to test, the CI workflows
will start executing and we'll be able to make sure everything is working as expected.

Let us know if you need any help!

harsh-vador and others added 3 commits October 13, 2026 13:51
… route moves on

The page refetches the service and its permission when the route moves to
another service without remounting. A slower answer for the previous service
could land after the new one's, so edits would patch, and permissions gate,
the wrong service. Each fetch now lets only its latest request write, as the
page's list fetch already does.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Hi there 👋 Thanks for your contribution!

The OpenMetadata team will review the PR shortly! Once it has been labeled as safe to test, the CI workflows
will start executing and we'll be able to make sure everything is working as expected.

Let us know if you need any help!

harsh-vador and others added 4 commits October 13, 2026 14:15
… articles do

Design's reference is the Context Center article: the header shows the current
version (↻ 0.3) and pressing it opens the entity's version route, which shows
that version beside the "Versions History" timeline; picking a version moves
to it and closing returns to the page. AI mode already serves the service
version route (`/service/<category>/<fqn>/versions/<version>`) inside the
Connections layout, so the header now navigates there.

The article's version button becomes common/HeaderVersionButton, used by both
headers. The slideout extracted from the persona AI-context drawer, and the
persona refactor onto it, are reverted: nothing else uses them now.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…test

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Hi there 👋 Thanks for your contribution!

The OpenMetadata team will review the PR shortly! Once it has been labeled as safe to test, the CI workflows
will start executing and we'll be able to make sure everything is working as expected.

Let us know if you need any help!

harsh-vador and others added 3 commits October 13, 2026 14:22
…and Tags

The tab's overrides zeroed all of DataProductsSection's padding, but that
section spaces its title from its content with padding-bottom (Glossary Terms
and Tags use margin), so the chip sat right under the title. Keep the 12px
under the title and drop only the side and trailing padding.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Hi there 👋 Thanks for your contribution!

The OpenMetadata team will review the PR shortly! Once it has been labeled as safe to test, the CI workflows
will start executing and we'll be able to make sure everything is working as expected.

Let us know if you need any help!

harsh-vador and others added 3 commits October 13, 2026 14:41
…mode, as classic

Metadata and security services have no child assets, so AI mode showed an empty
"Databases" tab for them. Classic offers no such tab; neither does AI mode now.
The page opens on the next tab (Connection for those who may edit it), a deep
link to the tab falls back the same way, and no list request is made.

DataAssetsTab's metadata-service guard on data products is gone with it: a
metadata service never reaches that tab now.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ice-page-design-pass

# Conflicts:
#	.github/playwright/timing-baseline.json
#	openmetadata-ui/src/main/resources/ui/src/components/integration/ConnectionServiceDetailsPage/ConnectionServiceDetailsPage.tsx
…e-service-header-actions

# Conflicts:
#	.github/playwright/timing-baseline.json
#	openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/AIMode/ConnectionServiceDetails.spec.ts
#	openmetadata-ui/src/main/resources/ui/src/components/integration/ConnectionServiceDetailsPage/ConnectionServiceDetailsPage.tsx
@github-actions

Copy link
Copy Markdown
Contributor

✅ Playwright Results — workflow succeeded

Validated commit 01c66b1b704a8ca22c064ed79851972c78894415 in Playwright run 38683500178, attempt 1.

✅ 4872 passed · ❌ 0 failed · 🟡 6 flaky · ⏭️ 1 skipped · 🧰 0 lifecycle flaky

Performance

Blocking targets: ✅ met · Optimization targets: 🟡 in progress

Shard-job maxima below are not the full workflow wall time; the linked run includes build, fixture, planning, and reporting.

🕒 Full workflow signal wall (to summary) 39m 2s

⏱️ Max setup 4m 38s · max shard execution 21m 7s · max shard-job elapsed before upload 24m 22s · reporting 19s

🌐 228.38 requests/attempt · 2.15 app boots/UI scenario · 39.15% common-shard skew

Optimization targets still in progress:

  • Common shard skew was 39.15% (convergence target: at most 15%).
  • Browser traffic was 228.38 requests per attempt (convergence target: fewer than 200).
  • Application boot ratio was 2.15 per UI scenario (11211 boots / 5226 scenarios; convergence target: at most 1).
Shard Passed Failed Flaky Skipped Lifecycle failed Lifecycle flaky
✅ Shard advanced-search-01 130 0 0 0 0 0
🟡 Shard chromium-01 153 0 1 0 0 0
✅ Shard chromium-02 207 0 0 0 0 0
🟡 Shard chromium-03 128 0 1 0 0 0
✅ Shard chromium-04 206 0 0 0 0 0
✅ Shard chromium-05 154 0 0 0 0 0
🟡 Shard chromium-06 147 0 1 0 0 0
✅ Shard chromium-07 146 0 0 0 0 0
🟡 Shard chromium-08 159 0 2 0 0 0
✅ Shard chromium-09 196 0 0 0 0 0
✅ Shard chromium-10 174 0 0 0 0 0
✅ Shard chromium-11 193 0 0 0 0 0
✅ Shard chromium-12 212 0 0 1 0 0
✅ Shard chromium-13 181 0 0 0 0 0
✅ Shard chromium-14 195 0 0 0 0 0
✅ Shard chromium-15 160 0 0 0 0 0
✅ Shard chromium-16 190 0 0 0 0 0
✅ Shard chromium-17 197 0 0 0 0 0
✅ Shard chromium-18 207 0 0 0 0 0
✅ Shard chromium-19 147 0 0 0 0 0
🟡 Shard chromium-20 204 0 1 0 0 0
✅ Shard chromium-21 161 0 0 0 0 0
✅ Shard chromium-22 185 0 0 0 0 0
✅ Shard chromium-23 215 0 0 0 0 0
✅ Shard chromium-24 177 0 0 0 0 0
✅ Shard data-asset-rules-01 66 0 0 0 0 0
✅ Shard global-state-01 68 0 0 0 0 0
✅ Shard import-export-01 57 0 0 0 0 0
✅ Shard import-export-02 95 0 0 0 0 0
✅ Shard ingestion-01 39 0 0 0 0 0
✅ Shard ingestion-02 53 0 0 0 0 0
✅ Shard reindex-01 41 0 0 0 0 0
✅ Shard search-rbac-01 29 0 0 0 0 0
🟡 6 flaky test(s) (passed on retry)
  • Pages/Domains.spec.ts › Verify clicking All Domains sets active domain to default value (shard chromium-01, 1 retry)
  • Features/TagsSuggestion.spec.ts › should decline requested tags for an api endpoint request schema field (shard chromium-03, 1 retry)
  • VersionPages/EntityVersionPages.spec.ts › Table (shard chromium-06, 1 retry)
  • Features/SSOConfiguration.spec.ts › should render authReassignRoles as a searchable dropdown and support role selection, removal, and search filtering (shard chromium-08, 1 retry)
  • Pages/Glossary.spec.ts › Request description task for Glossary Term (shard chromium-08, 1 retry)
  • Features/Glossary/GlossaryTermRelationsGraph.spec.ts › viewing a child term: parent appears as a 1-hop neighbour via parentOf edge (shard chromium-20, 1 retry)

📦 Download artifacts

How to debug locally
# Download playwright-test-results-<shard> artifact and unzip
npx playwright show-trace path/to/trace.zip    # view trace

…igations

Tooltip wraps a focusable child itself, so the version button goes straight
in. The version and post-delete navigations are fire-and-forget; mark them
void so the unhandled promise is explicit.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@harsh-vador
harsh-vador added this pull request to the merge queue Oct 15, 2026
…header-actions

# Conflicts:
#	.github/playwright/timing-baseline.json
@harsh-vador
harsh-vador removed this pull request from the merge queue due to a manual request Oct 15, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🚦 Removed from the merge queue — manual (2026-10-15T23:02:05Z)

The entry left the queue before it was built, so no checks ran against it.

@harsh-vador
harsh-vador enabled auto-merge October 15, 2026 23:02
@gitar-bot

gitar-bot Bot commented Oct 15, 2026

Copy link
Copy Markdown
Code Review ✅ Approved 1 closed / 1 findings

🟡 Medium risk · Adding service follow controls, announcement banners, version navigation, and delete routing changes UI workflows and could leave follow or announcement state out of sync.

Adds a header version button (common/HeaderVersionButton) that opens the service's version history, along with follow/unfollow for database services, active announcements shown on every tab, and a delete redirect to the service category's Connections listing. The shared HeaderVersionButton now imports its icon from assets/ as resolved. No issues found.

✅ 1 closed
✅ Quality: New shared HeaderVersionButton imports its icon from assets/

📄 openmetadata-ui/src/main/resources/ui/src/components/common/HeaderVersionButton/HeaderVersionButton.component.tsx:19 📄 openmetadata-ui/src/main/resources/ui/src/components/common/HeaderVersionButton/HeaderVersionButton.component.tsx:40
HeaderVersionButton is a new shared component, but it still imports ic-version.svg directly from assets/svg. The repo rule says icons go through the design-system layer and must not be imported from assets/ paths. Because both the article header and the service header now render this button, the asset import ends up in a new common component instead of being dropped. Use the core icon set instead, for example ClockRewind from @openmetadata/ui-core-components/icons, which PersonaAIContext already uses for its version badge.

Verification

Rules No rules evaluated

Functional validation Not enabled

Set up

Auto-approval Not enabled

Set up

For more verification details, comment gitar display:verbose.

Options

Display: compact → Showing compact verification results.

Comment with these commands to change the behavior for this request:

Compact
gitar display:verbose         

Was this helpful? React with 👍 / 👎 | Powered by Gitar — free for open source

@sonarqubecloud

Copy link
Copy Markdown

@harsh-vador
harsh-vador added this pull request to the merge queue Oct 15, 2026
Merged via the queue into main with commit 33a14f0 Oct 16, 2026
76 of 77 checks passed
@harsh-vador
harsh-vador deleted the feat/ai-mode-service-header-actions branch October 16, 2026 07:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

safe to test Add this label to run secure Github workflows on PRs UI UI specific issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants