Skip to content

fix(ui): Render every glossary term badge through GlossaryTag - #33304

Merged
anuj-kumary merged 4 commits into
mainfrom
issue-6044
Sep 15, 2026
Merged

anuj-kumary merged 4 commits into
mainfrom
issue-6044

Conversation

@anuj-kumary

@anuj-kumary anuj-kumary commented Sep 15, 2026

Copy link
Copy Markdown
Member

Describe your changes:

Glossary terms were drawn three different ways depending on the surface: the GlossaryTag atom, a hand-rolled div chip in GlossaryTermsSection, and a raw BadgeWithIcon in RelatedTerms. Sizes ranged 20-26px, icons came from three different sources, and the two non-atom renderers hardcoded a blue fill that ignored the term's configured colour entirely

Screenshot 2026-09-13 at 7 58 07 PM Screenshot 2026-09-13 at 7 58 48 PM Screenshot 2026-09-13 at 7 59 27 PM Screenshot 2026-09-13 at 8 00 33 PM Screenshot 2026-09-13 at 8 02 58 PM Screenshot 2026-09-13 at 8 08 12 PM Screenshot 2026-09-13 at 8 10 41 PM Screenshot 2026-09-13 at 8 21 03 PM

Type of change:

  • Bug fix
  • Improvement
  • New feature
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation

High-level design:

N/A — small change.

Tests:

Use cases covered

Unit tests

Backend integration tests

Ingestion integration tests

Playwright (UI) tests

Manual testing performed

UI screen recording / screenshots:

Not applicable.

Checklist:

  • I have read the CONTRIBUTING document.
  • My PR title is Fixes <issue-number>: <short explanation>
  • My PR is linked to a GitHub issue via Fixes #<issue-number> above.
  • I have commented on my code, particularly in hard-to-understand areas.
  • For JSON Schema changes: I updated the migration scripts or explained why it is not needed.
  • For UI changes: I attached a screen recording and/or screenshots above.
  • I have added tests (unit / integration / Playwright as applicable) and listed them above.

@anuj-kumary anuj-kumary self-assigned this Sep 15, 2026
@anuj-kumary anuj-kumary added safe to test Add this label to run secure Github workflows on PRs skip-pr-checks Bypass PR metadata validation check labels Sep 15, 2026
@github-actions github-actions Bot added the UI UI specific issues label Sep 15, 2026
Rohit0301
Rohit0301 previously approved these changes Sep 15, 2026
@github-actions

github-actions Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

Jest test Coverage

UI tests summary

Lines Statements Branches Functions
Coverage: 72%
72.85% (102472/140658) 57.59% (62008/107669) 58.83% (20358/34601)

@github-actions

Copy link
Copy Markdown
Contributor

🔴 Playwright Results — workflow failed

Validated commit 1b67a6ad248cfe42955ddada421780c4a8bddff4 in Playwright run 34944643710, attempt 1.

✅ 4502 passed · ❌ 2 failed · 🟡 5 flaky · ⏭️ 1 skipped · 🧰 0 lifecycle flaky

Action needed: test(s) failed on every attempt against this PR’s validated commit — see Genuine Failures below. These are test failures, not CI budget or infrastructure issues.

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) 41m 46s

⏱️ Max setup 4m 57s · max shard execution 24m 7s · max shard-job elapsed before upload 27m 56s · reporting 21s

🌐 219.11 requests/attempt · 2.24 app boots/UI scenario · 50.59% common-shard skew

Optimization targets still in progress:

  • Common shard skew was 50.59% (convergence target: at most 15%).
  • Browser traffic was 219.11 requests per attempt (convergence target: fewer than 200).
  • Application boot ratio was 2.24 per UI scenario (10637 boots / 4758 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 163 0 0 0 0 0
🔴 Shard chromium-02 152 1 0 0 0 0
✅ Shard chromium-03 172 0 0 0 0 0
✅ Shard chromium-04 154 0 0 0 0 0
✅ Shard chromium-05 179 0 0 0 0 0
🔴 Shard chromium-06 176 1 1 0 0 0
✅ Shard chromium-07 253 0 0 0 0 0
🟡 Shard chromium-08 175 0 2 0 0 0
✅ Shard chromium-09 171 0 0 0 0 0
✅ Shard chromium-10 176 0 0 0 0 0
✅ Shard chromium-11 186 0 0 0 0 0
✅ Shard chromium-12 156 0 0 0 0 0
✅ Shard chromium-13 204 0 0 0 0 0
✅ Shard chromium-14 199 0 0 1 0 0
🟡 Shard chromium-15 178 0 1 0 0 0
✅ Shard chromium-16 173 0 0 0 0 0
✅ Shard chromium-17 202 0 0 0 0 0
✅ Shard chromium-18 195 0 0 0 0 0
✅ Shard chromium-19 158 0 0 0 0 0
✅ Shard chromium-20 181 0 0 0 0 0
✅ Shard chromium-21 176 0 0 0 0 0
✅ Shard chromium-22 166 0 0 0 0 0
✅ Shard data-asset-rules-01 65 0 0 0 0 0
✅ Shard domain-isolation-01 16 0 0 0 0 0
✅ Shard global-state-01 34 0 0 0 0 0
✅ Shard import-export-01 80 0 0 0 0 0
✅ Shard import-export-02 70 0 0 0 0 0
🟡 Shard ingestion-01 45 0 1 0 0 0
✅ Shard ingestion-02 48 0 0 0 0 0
✅ Shard reindex-01 28 0 0 0 0 0
✅ Shard search-01 12 0 0 0 0 0
✅ Shard search-rbac-01 29 0 0 0 0 0

Genuine Failures (failed on all attempts)

Pages/ExploreTree.spec.tsVerify Tags navigation via Governance tree and breadcrumb renders page correctly (shard chromium-02)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoHaveText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed  Locator: locator('thead > tr > th') Timeout: 15000ms �[32m- Expected  - 0�[39m �[31m+ Received  + 1�[39m  �[2m  Array [�[22m �[2m    "Enabled",�[22m �[2m    "Tag",�[22m �[2m    "Display Name",�[22m �[31m+   "Usage",�[39m �[2m    "Description",�[22m �[2m    "Actions",�[22m �[2m  ]�[22m  Call log: �[2m  - Expect "toHaveText" with timeout 15000ms�[22m �[2m  - waiting for locator('thead > tr > th')�[22m �[2m    19 × locator resolved to 6 elements�[22m 
Pages/Tags.spec.tsClassification Page (shard chromium-06)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoHaveText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed  Locator: locator('thead > tr > th') Timeout: 15000ms �[32m- Expected  - 0�[39m �[31m+ Received  + 1�[39m  �[2m  Array [�[22m �[2m    "Enabled",�[22m �[2m    "Tag",�[22m �[2m    "Display Name",�[22m �[31m+   "Usage",�[39m �[2m    "Description",�[22m �[2m    "Actions",�[22m �[2m  ]�[22m  Call log: �[2m  - Expect "toHaveText" with timeout 15000ms�[22m �[2m  - waiting for locator('thead > tr > th')�[22m �[2m    19 × locator resolved to 6 elements�[22m 
🟡 5 flaky test(s) (passed on retry)
  • Pages/Lineage/DataAssetLineage.spec.tsverify create lineage for entity - Mlmodel (shard chromium-06, 1 retry)
  • Features/AIMode/CustomPropertiesPanel.spec.tsedits a custom property display name and description (shard chromium-08, 1 retry)
  • Pages/ServiceListing.spec.tsshould render the service listing page (shard chromium-08, 1 retry)
  • Flow/CustomizeWidgets.spec.tsKPI Widget (shard chromium-15, 1 retry)
  • Features/TestSuitePipelineRedeploy.spec.tsRe-deploy all test-suite ingestion pipelines (shard ingestion-01, 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

@github-actions

github-actions Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

⚠️ UI Checkstyle passed — lint findings in changed files

🔍 ESLint findings in this PR's files — 0 error(s), 39 warning(s)

Errors block the build. Warnings do not yet — they are rules whose backlog is still
being worked down, listed so this PR does not add to it. See docs/ui-code-quality-gate.md.

0 error(s), 39 warning(s) across 8 changed file(s).

Count Rule
21 react-hooks/exhaustive-deps
7 openmetadata-imports/no-circular-imports
6 openmetadata-imports/no-internal-barrel-imports
3 openmetadata-imports/no-rest-ui-imports
1 openmetadata-ui-patterns/no-raw-title-attribute
1 openmetadata-imports/no-api-calls-in-iteration
All findings
Location Rule Message
🟡 src/components/KnowledgeCenter/KnowledgeCard/KnowledgeCard.tsx:61:1 openmetadata-imports/no-internal-barrel-imports Import the internal module directly instead of its index barrel so unrelated siblings do not enter the bundle graph.
🟡 src/components/KnowledgeCenter/KnowledgeCard/KnowledgeCard.tsx:238:9 react-hooks/exhaustive-deps The 'handleToggleDelete' function makes the dependencies of useCallback Hook (at line 256) change on every render. Move it inside the useCallback callback. Alte
🟡 src/components/Tag/TagsViewer/TagsViewer.tsx:32:1 openmetadata-imports/no-circular-imports This runtime import participates in a circular dependency. Extract the shared type/constant/utility or invert the dependency.
🟡 src/components/Tag/TagsViewer/TagsViewer.tsx:33:1 openmetadata-imports/no-circular-imports This runtime import participates in a circular dependency. Extract the shared type/constant/utility or invert the dependency.
🟡 src/components/Tag/TagsViewer/TagsViewer.tsx:34:1 openmetadata-imports/no-circular-imports This runtime import participates in a circular dependency. Extract the shared type/constant/utility or invert the dependency.
🟡 src/components/common/AsyncSelectList/AsyncSelectList.tsx:37:1 openmetadata-imports/no-circular-imports This runtime import participates in a circular dependency. Extract the shared type/constant/utility or invert the dependency.
🟡 src/components/common/AsyncSelectList/AsyncSelectList.tsx:116:5 react-hooks/exhaustive-deps React Hook useCallback has a missing dependency: 'getFilteredOptions'. Either include it or remove the dependency array.
🟡 src/components/common/AsyncSelectList/AsyncSelectList.tsx:291:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'loadOptions'. Either include it or remove the dependency array.
🟡 src/components/common/FieldCard/FieldCard.tsx:23:1 openmetadata-imports/no-internal-barrel-imports Import the internal module directly instead of its index barrel so unrelated siblings do not enter the bundle graph.
🟡 src/components/common/GlossaryTermsSection/GlossaryTermsSection.tsx:128:5 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'cancelEditing' and 'glossaryTerms'. Either include them or remove the dependency array.
🟡 src/components/common/GlossaryTermsSection/GlossaryTermsSection.tsx:140:9 react-hooks/exhaustive-deps The 'handlePopoverOpenChange' function makes the dependencies of useMemo Hook (at line 190) change on every render. Move it inside the useMemo callback. Alterna
🟡 src/components/common/GlossaryTermsSection/GlossaryTermsSection.tsx:147:9 react-hooks/exhaustive-deps The 'handleCancel' function makes the dependencies of useMemo Hook (at line 190) change on every render. Move it inside the useMemo callback. Alternatively, wra
🟡 src/components/common/TagSuggestion/TagSuggestion.tsx:36:1 openmetadata-imports/no-circular-imports This runtime import participates in a circular dependency. Extract the shared type/constant/utility or invert the dependency.
🟡 src/components/common/TagSuggestion/TagSuggestion.tsx:37:1 openmetadata-imports/no-circular-imports This runtime import participates in a circular dependency. Extract the shared type/constant/utility or invert the dependency.
🟡 src/components/common/TagSuggestion/TagSuggestion.tsx:38:1 openmetadata-imports/no-circular-imports This runtime import participates in a circular dependency. Extract the shared type/constant/utility or invert the dependency.
🟡 src/components/common/TagSuggestion/TagSuggestion.tsx:39:1 openmetadata-imports/no-internal-barrel-imports Import the internal module directly instead of its index barrel so unrelated siblings do not enter the bundle graph.
🟡 src/components/common/TagSuggestion/TagSuggestion.tsx:160:6 react-hooks/exhaustive-deps React Hook useEffect has missing dependencies: 'fetchOptions' and 'initialOptions'. Either include them or remove the dependency array. If 'setOptions' needs th
🟡 src/components/common/TagSuggestion/TagSuggestion.tsx:171:5 react-hooks/exhaustive-deps React Hook useCallback has a missing dependency: 'fetchOptions'. Either include it or remove the dependency array.
🟡 src/components/common/TagSuggestion/TagSuggestion.tsx:205:5 react-hooks/exhaustive-deps React Hook useCallback has a missing dependency: 'fetchOptions'. Either include it or remove the dependency array.
🟡 src/pages/ColumnBulkOperations/ColumnGrid/ColumnGrid.component.tsx:56:1 openmetadata-imports/no-internal-barrel-imports Import the internal module directly instead of its index barrel so unrelated siblings do not enter the bundle graph.
🟡 src/pages/ColumnBulkOperations/ColumnGrid/ColumnGrid.component.tsx:58:1 openmetadata-imports/no-internal-barrel-imports Import the internal module directly instead of its index barrel so unrelated siblings do not enter the bundle graph.
🟡 src/pages/ColumnBulkOperations/ColumnGrid/ColumnGrid.component.tsx:241:13 openmetadata-ui-patterns/no-raw-title-attribute Use from @openmetadata/ui-core-components instead of raw title="" attributes for consistent tooltip behavior.
🟡 src/pages/ColumnBulkOperations/ColumnGrid/ColumnGrid.component.tsx:1105:5 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'buildMultiOccurrenceRows', 'buildSingleOccurrenceRows', 'buildVariationRows', and 'getUniquePaths'. Either inc
🟡 src/pages/ColumnBulkOperations/ColumnGrid/ColumnGrid.component.tsx:1293:5 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'renderCoverageDescriptionCell' and 't'. Either include them or remove the dependency array.
🟡 src/pages/ColumnBulkOperations/ColumnGrid/ColumnGrid.component.tsx:1561:5 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'renderGroupColumnNameCell', 'renderOccurrenceColumnNameCell', and 'renderStructChildColumnNameCell'. Either in
🟡 src/pages/ColumnBulkOperations/ColumnGrid/ColumnGrid.component.tsx:1633:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 'columnGridListing'. Either include it or remove the dependency array.
🟡 src/pages/ColumnBulkOperations/ColumnGrid/ColumnGrid.component.tsx:1812:6 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'buildColumnUpdatesByKey' and 'columnGridListing'. Either include them or remove the dependency array.
🟡 src/pages/ColumnBulkOperations/ColumnGrid/ColumnGrid.component.tsx:1966:5 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'handleBulkUpdateCompleted' and 'handleBulkUpdateFailed'. Either include them or remove the dependency array.
🟡 src/pages/ColumnBulkOperations/ColumnGrid/ColumnGrid.component.tsx:2042:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'columnGridListing'. Either include it or remove the dependency array.
🟡 src/pages/ColumnBulkOperations/ColumnGrid/ColumnGrid.component.tsx:2164:5 react-hooks/exhaustive-deps React Hook useCallback has a missing dependency: 'columnGridListing'. Either include it or remove the dependency array.
🟡 src/pages/ColumnBulkOperations/ColumnGrid/ColumnGrid.component.tsx:2273:5 react-hooks/exhaustive-deps React Hook useCallback has a missing dependency: 'columnGridListing'. Either include it or remove the dependency array.
🟡 src/pages/ColumnBulkOperations/ColumnGrid/ColumnGrid.component.tsx:2385:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 'columnGridListing'. Either include it or remove the dependency array.
🟡 src/pages/ColumnBulkOperations/ColumnGrid/ColumnGrid.component.tsx:2418:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 'columnGridListing'. Either include it or remove the dependency array.
🟡 src/pages/ColumnBulkOperations/ColumnGrid/ColumnGrid.component.tsx:2532:6 react-hooks/exhaustive-deps React Hook useMemo has an unnecessary dependency: 'columnGridListing.allRows'. Either exclude it or remove the dependency array.
🟡 src/rest/glossaryAPI.ts:17:1 openmetadata-imports/no-rest-ui-imports REST clients must not import UI or state-layer modules. Move shared request/response types to the interface layer.
🟡 src/rest/glossaryAPI.ts:18:1 openmetadata-imports/no-rest-ui-imports REST clients must not import UI or state-layer modules. Move shared request/response types to the interface layer.
🟡 src/rest/glossaryAPI.ts:19:1 openmetadata-imports/no-rest-ui-imports REST clients must not import UI or state-layer modules. Move shared request/response types to the interface layer.
🟡 src/rest/glossaryAPI.ts:41:1 openmetadata-imports/no-internal-barrel-imports Import the internal module directly instead of its index barrel so unrelated siblings do not enter the bundle graph.
🟡 src/rest/glossaryAPI.ts:184:7 openmetadata-imports/no-api-calls-in-iteration Avoid issuing one API request per item. Fetch at the data owner, use a bulk endpoint, or use useQueries with an intentional concurrency policy.

Fix locally (fast - only checks files changed in this branch):

make ui-checkstyle-changed

@gitar-bot

gitar-bot Bot commented Sep 15, 2026

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

Standardizes glossary term badge rendering across the UI by routing all instances through the GlossaryTag component, eliminating inconsistent sizing (20–26px), icon sources, and hardcoded blue fills that ignored configured term colors. Related term styles silently capped at 100 terms has been resolved. No issues found.

✅ 1 resolved
Edge Case: Related term styles silently capped at 100 terms

📄 openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTerms/tabs/RelatedTerms.tsx:223
In RelatedTerms.tsx the style fetch only requests relatedTermIds.slice(0, TERM_STYLE_BATCH_SIZE) (100). When a glossary term has more than 100 related terms, everything past the first 100 renders with the default tag colour/icon even if the term has a configured style, with no indication why. This is cosmetic and the catch handler already falls back to defaults, so it is low severity, but consider chunking the ids into multiple getGlossaryTermsByIds calls (or documenting the cap at the constant) so colours stay consistent for large relation sets.

Review coverage

Rules No rules evaluated

Functional validation Not enabled · Set up

Auto-approval Not enabled · Set up

Options

Display: compact → Counting what did not apply, without listing it.

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

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 skip-pr-checks Bypass PR metadata validation check UI UI specific issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants