Skip to content

refactor(knowledge-graph): designer review — bugs + filter unification + table/gaps rework + drawer redesign - #34035

Open
chirag-madlani wants to merge 57 commits into
mainfrom
knowledge-graph-designer-review-a-bugs
Open

chirag-madlani wants to merge 57 commits into
mainfrom
knowledge-graph-designer-review-a-bugs

Conversation

@chirag-madlani

@chirag-madlani chirag-madlani commented Sep 25, 2026 •

Copy link
Copy Markdown
Collaborator

Umbrella PR for #33931 — all four designer-review scopes land as one merge.

Fix: #33931

Sections

  • A · Bugs
    • A1 — literal Unknown → muted -- and renamed MappingCoverage state (unknown → not-explored) for clearer intent
    • A2 / A3 — Gaps footer badge + chip row both report unmapped only, consistently
    • A4 — top-level family filter chips scope the Relationships details table
  • B · Filter unification
    • B1 — Entity Type dropdown pulled out of the Filters tray, inline next to the search bar
    • B2 — Relationship Type dropdown pulled out of the Filters tray, inline next to the search bar
    • B3 — Entity Type dropdown grouped by Explore's mental model (Databases → Table/Schema/Column/StoredProcedure, Dashboards → Dashboard/Chart/DataModel, …, Owners → User/Team) with section headers only — selection stays per-type
    • B4 — Filters tray button + popover retained, now housing just the family pills + Clear
  • C · Table + Gaps rework
    • C1 — Rebuilt Gaps subtabs: drop all / mapped chips, keep unmapped + add not-explored
    • C2 — Suggested-fix cell renders per-row actions (Map term for unmapped, Explore for not-explored)
    • C3-C7 — UI polish from the designer notes (coverage-mode dropdown removed, label-count typography aligned)
  • D · Details drawer redesign (states 1a + 1b)
    • D1a — Mini relationship drawer: predicate chain + System name: row + View in list footer
    • D1b — Mini entity drawer: identity card (FULL PATH / USERNAME / FQN) + per-type gap CTAs (Unmapped · Glossary term + Map term, Owner assigned) + trimmed relationships preview + Preview / Open asset page footer
    • Per-variant sections for Table, User, Team, Tag, Classification, Database, Database Schema
    • 1c (full detail drawer) intentionally skipped — "Open asset page" already navigates to the existing entity details page
  • R · Reviewer follow-ups (R1-R9 + designer re-review)
    • R1-R8 — toolbar polish, zoom control symmetry, family popover glyphs, Relationship-Type select-all, Gaps single-table + sticky header, resizable details pane
    • R9 — inspector drawer per Inspector Drawer (2).html: triple as subject → predicate → object, bordered-row + plain-icon + pill combo, System name: row pulled OUT of the gray statement card (edge, bundle AND group-node inspectors), Tabs chip row shrunk to match the drawer density, bundle-edge aggregate pill (mock 2f)
    • Drawer width — stage is now 2fr | 1fr so the drawer takes 1/3 of the canvas and member rows read one-per-line

Recording

PR walkthrough on local dev (branch tip 440e294f241): fullscreen KG canvas →
single-edge inspector (Contains) → bundle-edge inspector (Has column,
mock 2f aggregate pill + member rows) → group-node inspector (Tasks /
Mentioned in, System name: mentionedIn row below the statement card),
all inside the 1/3 drawer.

kg-inspector-drawer.mp4

Tests

  • yarn test --testPathPattern='discovery/knowledge-graph' --watchAll=false — 21 suites / 412 tests pass on branch tip
  • yarn lint:playwright — 0 errors on branch tip
  • KnowledgeGraph.spec.ts runs in the nightly Playwright RDF (Knowledge Graph + Ontology) lane (skipped in PR CI); updated one stale inspector.toContainText assertion for the post-R9 bundle-subtitle copy (Grouped · N relationships)

Type of change

  • Improvement

Summary by Gitar

  • Backend changes:
    • Reworked extension persistence in EntityRepository to store and remove custom properties per entity
    • Replaced role-sync admin handling in UserUtil with a promotion-only policy
    • Simplified AgentSparqlService wiring and projection-not-ready error handling
    • Made EntityCsv documentation loading fail with a clear IllegalStateException
  • Landing page:
    • Added new MyData widgets (KPI, Total Data Assets, Feed, Domains, Data Products) with unit tests
    • Switched the customize-home widget filter from a denylist to a widget-registry allowlist
  • Knowledge graph:
    • Replaced the Entity Type and Relationship Type dropdowns with grouped TreeSelect pickers in the toolbar
    • Rendered bundle edges in the inspector as member-family pills
    • Removed the Filters tray, family filter and coverage-mode state in favor of the inline toolbar
  • Auth and alerts:
    • Encrypted OAuth2 secrets on webhook destinations and simplified app-mode boot resolution
    • Skipped role sync when the token has no roles claim instead of treating it as empty
    • Added PasswordWidget to mask stored credential secrets in JSON schema forms
    • Added a try-again-button to the test connection timeout state
  • Data contract and bulk:
    • Migrated the Data Contract tab from Ant Design to core components
    • Derived bulk glossary term operation status from passed row counts

This will update automatically on new commits.

@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

✅ PR checks passed

The linked issue has a description and all required Shipping project fields set. Thanks!

@github-actions github-actions Bot added safe to test Add this label to run secure Github workflows on PRs UI UI specific issues labels Sep 25, 2026
@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Jest test Coverage

UI tests summary

Lines Statements Branches Functions
Coverage: 77%
77.65% (126083/162364) 64.26% (79737/124067) 65.5% (26579/40578)

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

…ner-review-a-bugs

Catch up with origin/main (currently 8fa2b76); previous
merge in 9296d30 brought in an outdated main tip and dropped files that had
been added on main since (benchmark trend scripts, ADRs, pii model provisioning,
it/bench suite, etc.). This merge resolves conflicts by:

- Taking main's version for every non-KG file the two branches both touched
  (locale files, playwright specs, token-reference, My Data widgets, …)
- Keeping my branch's KG work intact (none of the KG files conflicted)
- Deep-merging en-us.json so main's new keys land AND my new kg-* keys are
  preserved (kg-bundle-subtitle keeps the post-R9 'Grouped · N relationships'
  copy), then running yarn i18n to propagate my keys into every other locale.

No KG behaviour changes; this is a pure branch-rebaselining commit.
… merge dropped

Follow-up to the previous main-merge: hard-reset every non-KG, non-locale file to
origin/main's version so the PR diff only contains the knowledge-graph work.
Deleted 71 landing-page/MyData widget files that an earlier main-merge brought
in but that main has since removed. Restored 185 main-added files that this
branch had been missing (benchmark trend scripts, ADRs, ingestion/pii/model_provisioning,
openmetadata-integration-tests/it/bench suite, ...), and reset 504 other
non-KG files to main.

KG files, en-us.json (with my new kg-* keys) and the propagated locale files
are untouched.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

…ntity + translate kg-coverage-scope

Addresses gitar-bot code-review feedback on PR #34035:

1. Bundle member rows under 'MEMBERS' were rendered with a trailing chevron
   but no onPress, so they looked clickable and were keyboard-focusable yet
   did nothing. Each row now opens the member entity's page in a new tab
   (via getGraphNodeHref), and rows without a resolvable href render disabled
   so the chevron doesn't lie about navigation.

2. The 2026-10-14 copy change to message.kg-coverage-scope landed in en-us
   only; the other 19 locales still described the removed 'Unknown' state,
   so non-English users saw a hint that didn't match the table. Translated
   the new wording in each locale.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

…mn test

The 'Show on canvas → Highlight mapping gaps / Not mapped' control was removed
with the R7 Gaps-tab rework (commit 874596c), but the 300-column spec still
clicked it and times out. The Gaps tab is self-sufficient now — it filters the
details table to unmapped rows and no longer offers a highlight-on-canvas
secondary control. Replace that block with a sanity assertion that Gaps rows
are present, then close the drawer.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

…F spec

Both failures were on-branch regressions, not flakes:

- 'narrow layouts, 200 percent zoom, dark mode and reduced motion keep controls
  usable' (line 873): dark mode is now gated on AI app mode (theme-provider line
  88 — classic mode is light-only, main's App-Mode refactor). The test only
  preseeded localStorage['ui-theme'] = 'dark' and never set the session hint,
  so the provider resolved to classic + light and the html class never flipped
  to dark-mode. Preseed sessionStorage['omAppMode'] = {mode: 'ai'} alongside the
  theme hint so the first mount lands in AI + dark.
- '300 columns stay discoverable...' (line 1340): the R9 drawer redesign
  renamed the footer CTA 'Open entity page' → 'Open asset page' (label key is
  now kg-open-asset-page). The getByRole-name selector still asked for the
  old copy. The href shape is unchanged.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Follow-up to b1bed5f. Preseeding AI-mode fixed the dark-mode class
check but broke the geometry poll below: AI mode adds top-nav chrome
that doesn't fit the 1000px-tall viewport + 2x zoom budget, so the
canvas overflowed and the test failed at the next assertion instead
of the one it was meant to cover.

Classic mode is now light-only by design (theme-provider:88 forces
'light' when !useIsAiMode()), so the html.dark-mode class never
flips in this test's context. Keep the colorScheme/ui-theme preseed
(it still exercises the theme-provider wiring and catches
reduced-motion / canvas-tint regressions) and drop the class
assertion — the test name now describes what it still asserts
(narrow layouts + 200 percent zoom + reduced motion + controls
usable).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

…ner-review-a-bugs

Catch up with origin/main (currently 0d87b56). Locale
conflicts (all 20 locale files) resolved with the same strategy as the previous
main-sync: --theirs for all non-en-us, deep-merge for en-us so main's new keys
land AND my kg-* keys are preserved (kg-bundle-subtitle keeps 'Grouped · N
relationships', kg-coverage-scope keeps the new 'Assets missing a glossary
term...' copy). yarn i18n propagated my new keys into every other locale, then
retranslated the kg-coverage-scope message in all 19 non-English locales so
they don't ship English under non-English keys.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actions

Copy link
Copy Markdown
Contributor

🔄 Playwright impact map auto-refreshed

This PR touched specs or UI source that changed the source→spec routing map. I regenerated .github/playwright/impact-map.generated.json and pushed the diff to this branch.

- source entries: 921 → 922
- 1 added, 0 removed, 13 changed spec-list

New source→spec entries:
  openmetadata-ui/src/main/resources/ui/src/components/observability/data-quality/ThresholdPreview/ThresholdPreview.tsx

Entries whose spec list changed:
  openmetadata-ui/src/main/resources/ui/playwright/constant/config.ts
  openmetadata-ui/src/main/resources/ui/playwright/e2e/Utils/appMode.ts
  openmetadata-ui/src/main/resources/ui/playwright/e2e/fixtures/pages.ts
  openmetadata-ui/src/main/resources/ui/playwright/support/entity/TableClass.ts
  openmetadata-ui/src/main/resources/ui/playwright/utils/codeEditor.ts
  openmetadata-ui/src/main/resources/ui/playwright/utils/common.ts
  openmetadata-ui/src/main/resources/ui/playwright/utils/dataQuality.ts
  openmetadata-ui/src/main/resources/ui/playwright/utils/testCases.ts
  openmetadata-ui/src/main/resources/ui/src/components/DataQuality/AddDataQualityTest/components/TestCaseFormBody.tsx
  openmetadata-ui/src/main/resources/ui/src/components/DataQuality/IncidentManager/RunDetailsCard/RunDetailsCard.tsx
  … and 3 more

What is this file? It is the auto-generated half of Playwright's PR planner. It routes "if source X changes, run specs Y" by walking spec imports and cross-referencing getByTestId strings. Hand-authored routing in impact-map.json always wins on conflict.

What if I want to regenerate locally instead? Run this before pushing your next change to skip the bot commit:

python3 .github/scripts/generate_playwright_impact_map.py
git add .github/playwright/impact-map.generated.json
git commit --amend --no-edit  # or a separate commit

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

… viewports don't overflow

The 'narrow layouts, 200 percent zoom, dark mode and reduced motion keep
controls usable' test (KnowledgeGraph.spec.ts:873) failed at the geometry
poll on line 929: canvas.bottom was greater than container.bottom in a
1000x1000 viewport at 2x zoom (effective 500x500 CSS px).

Root cause: .knowledge-graph-body carries a 320px min-height so the KG tab
looks right when embedded in the entity page. In fullscreen the viewport
IS the floor, so that min-height just forces the body (and the canvas
inside it) past the container bottom when the effective height is below
320px. Override it to 0 inside .full-screen-knowledge-graph so the body
tracks its grid cell instead.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

… kg-details-open

Address gitar-bot code-review feedback on ef80001.

My previous fix only reset .knowledge-graph-body { min-height: 0 } inside
.full-screen-knowledge-graph (specificity (0,2,0)). The pre-existing rule
.knowledge-graph-container.kg-details-open .knowledge-graph-body sits at
(0,3,0) and keeps a 160px floor when the drawer is open, so in fullscreen +
drawer-open + narrow viewport the floor returned and the canvas could still
overflow the container.

Also match .knowledge-graph-container.kg-details-open .knowledge-graph-body
inside the fullscreen scope — the nested parent prefix lifts us to
(0,4,0), which wins over the embedded details-open rule and keeps the
canvas inside its container at any drawer state.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@gitar-bot

gitar-bot Bot commented Oct 15, 2026

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

🟡 Medium risk · Unifying Knowledge Graph filters and rebuilding its gaps table and inspector changes asset and relationship visibility, potentially hiding relevant metadata from users.

Knowledge graph designer-review refactor moves Entity Type and Relationship Type into inline TreeSelect pickers, rebuilds the Gaps table with per-row actions, and redesigns the details drawer. Review found no open issues: the Unknown chip and removed coverage props are resolved, fullscreen overflow and kg-details-open min-height are fixed, bundle member rows now open the member entity, and kg-coverage-scope is translated across locales.

✅ 13 closed
✅ Bug: Existing test still expects 'label.kg-unknown' in the grid

📄 openmetadata-ui/src/main/resources/ui/src/components/discovery/knowledge-graph/KnowledgeGraphDetails.tsx:168
The test 'pages and searches all loaded columns without declaring uninspected columns unmapped' calls within(grid).getByText('label.kg-unknown'). After this change the coverage cell shows NO_DATA_PLACEHOLDER (--). The only remaining label.kg-unknown is on the filter chips, and those render outside the Table/grid. So getByText will throw and the test fails, which contradicts the 399/399 claim. The fix is to update the assertion to expect the placeholder.

✅ Edge Case: 'Unknown' chip no longer matches visible cells or search

📄 openmetadata-ui/src/main/resources/ui/src/components/discovery/knowledge-graph/KnowledgeGraphDetails.tsx:168 📄 openmetadata-ui/src/main/resources/ui/src/components/discovery/knowledge-graph/KnowledgeGraphDetails.tsx:179-185 📄 openmetadata-ui/src/main/resources/ui/src/components/discovery/knowledge-graph/KnowledgeGraphDetails.tsx:193-196
filterRows still builds the coverage chip label from t('label.kg-' + status), so the chip reads 'Unknown (N)'. The rows it filters now show --, which recreates the label/row mismatch this PR set out to remove. Search also runs on cell.text, so typing 'unknown' no longer matches these rows, even though the chip still names them that way. The fix is to relabel the chip to fit the new absence wording (e.g. a 'Not inspected' key), or to match search against the coverage label as well.

✅ Bug: Test props still pass removed coverageMode/onCoverageMode props

📄 openmetadata-ui/src/main/resources/ui/src/components/discovery/knowledge-graph/KnowledgeGraphDetails.test.tsx:42-43 📄 openmetadata-ui/src/main/resources/ui/src/components/discovery/knowledge-graph/KnowledgeGraphDetails.tsx:63-66
This commit removes coverageMode and onCoverageMode from DetailsProps, but the shared props fixture in the test still sets both. That fixture is typed as ComponentProps<typeof KnowledgeGraphDetails>, so the object literal now has excess properties and raises TS2353. The project runs Jest through ts-jest (jest.config.js), which reports type errors by default, so the whole KnowledgeGraphDetails.test.tsx suite can fail to compile instead of running. To fix it, delete those two keys from the fixture.

✅ Bug: Entity description shown as "Team:"/"Source:", or hidden for DB/schema

📄 openmetadata-ui/src/main/resources/ui/src/components/discovery/knowledge-graph/KnowledgeGraphOverlays.tsx:161-171 📄 openmetadata-ui/src/main/resources/ui/src/components/discovery/knowledge-graph/KnowledgeGraphOverlays.tsx:275-277 📄 openmetadata-ui/src/main/resources/ui/src/components/discovery/knowledge-graph/KnowledgeGraphOverlays.tsx:364-366
GraphNode.description holds the entity's free-text description. The graph payload has no team or source field. IdentitySection still shows that description for User/Team nodes as Team: <description> and for Tag/Classification nodes as Source: <description>, so users see wrong metadata. These types are in COVERAGE_SIGNAL_SKIP, so bodyDescription is null for them. The description therefore only appears under the wrong label. Database and DatabaseSchema nodes are in the skip set too but have no meta key, so their descriptions no longer appear anywhere in the drawer. To fix this, stop deriving bodyDescription from coverage support and always show the description in the body. Add the Team:/Source: row only once the graph carries real team/source data.

✅ Edge Case: Fullscreen overflow:hidden clips the drawer/footer on short viewports

📄 openmetadata-ui/src/main/resources/ui/src/components/discovery/knowledge-graph/KnowledgeGraph.style.less:360 📄 openmetadata-ui/src/main/resources/ui/src/components/discovery/knowledge-graph/KnowledgeGraph.style.less:364-365 📄 openmetadata-ui/src/main/resources/ui/src/components/discovery/knowledge-graph/KnowledgeGraph.style.less:138-149
The fullscreen wrapper changed from overflow: auto to overflow: hidden, and the container now uses flex: 1 1 0; min-height: 0. The inner grids still use minmax(min-content, 1fr) rows, though. The stage has a floor of --om-space-40 * 8, or * 4 with the drawer open, and .kg-details has min-height: --om-space-40 * 5.5. Add the toolbar and footer, and on a short viewport (a small laptop or a zoomed browser) the content's min-content height is taller than the window. The bottom of the drawer and footer then gets cut off, and there is no scroll left to reach it. Before this change the user could still scroll there. To fix this, keep a scroll fallback (overflow: auto on the wrapper), or change the row tracks to minmax(0, 1fr) so the stage shrinks before anything overflows.

...and 8 more closed from earlier reviews

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

@github-actions

Copy link
Copy Markdown
Contributor

🚦 Removed from the merge queue — merge_conflict (2026-10-15T19:17:28Z)

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

Conflicts with the latest main — rebase, then re-queue.

This branch was successfully deployed

1 active deployment
test — 00db569e Deployed Oct 15, 2026 by chirag-madlani via RDF Playwright execution #32721
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge conflict Conflicts with the latest main; removed from the merge queue 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.

Knowledge Graph: designer review — filter unification, table + gaps rework, drawer redesign

4 participants