Skip to content

feat(ui): Glossary Terms table on TableV2 — adaptable search, column resize, drag reorder, sticky header#29728

Open
siddhant1 wants to merge 3 commits into
mainfrom
glossary-table-v2
Open

feat(ui): Glossary Terms table on TableV2 — adaptable search, column resize, drag reorder, sticky header#29728
siddhant1 wants to merge 3 commits into
mainfrom
glossary-table-v2

Conversation

@siddhant1

@siddhant1 siddhant1 commented Jul 3, 2026

Copy link
Copy Markdown
Member

What

Completes the migration of the Glossary Terms table to the React Aria TableV2/TableCard stack and restores the behaviors that were lost during the migration.

Changes

  • Adaptable search bar — the toolbar search input now grows/shrinks to fill available width, while Status / Bulk Edit / Expand-All stay fixed-size and always visible (no more clipped buttons on narrow viewports).
  • Column resize indicator — the ColumnResizer handle was invisible under Tailwind v4 (deprecated bg-[--var] arbitrary-value syntax silently dropped). Switched to the valid bg-border-secondary / bg-border-brand utilities: a subtle divider at idle, brand-blue while dragging.
  • Row drag-and-drop reorder / re-parent — React Aria's Row strips native HTML5 drag props (filterDOMProps), so the old onRow drag handlers never reached the DOM. Reimplemented with useDragAndDrop (dragAndDropHooks), reusing the existing move-confirmation modal + PATCH flow. Load-more placeholder rows are excluded as drag sources/targets.
  • Sticky header — the table now owns its own vertical scroll (scroll.y) so the sticky <thead> engages; the outer container no longer scrolls; and infinite scroll is re-pointed at the internal scroll region.

Files

  • GlossaryTermTab.component.tsx — search layout, RAC drag-and-drop, internal-scroll + sticky-header wiring, infinite-scroll rework.
  • common/Table/TableV2.tsx — column resize indicator token fix.

Testing

Manual verification in the Glossary → Terms tab:

  • Resize the viewport → search adapts, buttons stay visible.
  • Drag a column edge → visible resize handle; drag a row onto another → re-parent modal → nests; drop on empty area → moves to top level.
  • Scroll the term list → header stays pinned; infinite scroll still loads more (regular + search); short lists auto-fill.

Note: the scroll.y offset (calc(100vh - 350px)) may need minor tuning per layout.

🤖 Generated with Claude Code


Summary by Gitar

  • Drag-and-drop mechanics:
    • Added useDragAndDrop from react-aria-components to handle row re-parenting and promotion, replacing deprecated HTML5 handlers.
    • Added getDropOperation logic to manage valid drop targets and prevent interaction with load-more rows.
  • Component architecture:
    • Moved table layout to TableCard.Root and updated GlossaryTermTab to use internal scroll.y for consistent sticky header behavior.
  • Refactoring:
    • Removed useInView infinite scroll observer in favor of the table's internal scroll management.
    • Added glossaryTermByFqn lookup memo for efficient drag-and-drop target identification.
  • Bug fixes:
    • Fixed missing permissions.EditAll dependency in extraTableFilters memo to ensure accurate bulk-edit button visibility.

This will update automatically on new commits.

Greptile Summary

This PR completes the Glossary Terms table migration to the TableV2/TableCard stack, restoring three behaviors that were lost in the migration: column resize visibility (Tailwind v4 token fix), row drag-and-drop re-parenting (reimplemented with React Aria's useDragAndDrop), and sticky header (via scroll.y on the table itself).

  • Adaptable search bar: the search input now uses flex-1 and groups Status / Bulk Edit / Expand-All in a fixed flex-shrink container, preventing button clipping on narrow viewports.
  • Drag-and-drop rewrite: replaces the old onRow/onHeaderRow HTML5 handler approach (which React Aria's filterDOMProps silently stripped) with useDragAndDrop; a draggedGlossaryTermRef captures the source term on onDragStart and is consumed in onItemDrop / onRootDrop, reusing the existing move-confirmation modal and PATCH flow.
  • Infinite scroll rework: drops useInView in favour of a MutationObserver that triggers auto-fill when content doesn't fill the viewport, plus a scroll event listener on the table's internal scroll container for page-through loading.

Confidence Score: 4/5

Safe to merge with the understanding that between-row drops are silently discarded (no reorder) and a parent term can be dragged onto its own descendant, showing a valid drop indicator before failing at the API layer.

The drag-and-drop reimplementation is largely correct, but getDropOperation returns 'move' for 'between'-type targets even though there is no onBetweenDrop handler — drops landing between rows are silently ignored, which is confusing to users expecting reorder behaviour. Additionally, there is no ancestor-descendant cycle guard: dragging a parent over one of its children shows a valid drop indicator, opens the confirmation modal, and only fails at the API level with an error toast. Neither issue corrupts data, but both produce misleading UI feedback on a core interaction path.

GlossaryTermTab.component.tsx — specifically the getDropOperation callback and the drag-and-drop wiring; the TableV2.tsx and glossaryV1.less changes are straightforward and low risk.

Important Files Changed

Filename Overview
openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTermTab/GlossaryTermTab.component.tsx Main feature file: migrates to TableV2 with sticky header, replaces HTML5 DnD with React Aria useDragAndDrop, reworks infinite scroll to use scroll event + MutationObserver, and lays out the search bar adaptably. The drag-and-drop implementation is mostly correct, but a few edge cases (between-row drops silently discarded, no ancestor-cycle guard) remain.
openmetadata-ui/src/main/resources/ui/src/components/common/Table/TableV2.tsx One-line fix: replaces the deprecated Tailwind v4 bg-[--color-border-secondary] arbitrary-value syntax with the valid bg-border-secondary / bg-border-brand token classes, restoring the column resize handle visibility.
openmetadata-ui/src/main/resources/ui/src/components/Glossary/glossaryV1.less CSS cleanup: removes the manual sticky-header hack (now handled by scroll.y), updates nested-row hover selectors to match the new TableV2 DOM (tbody > tr > td instead of .ant-table-tbody), and adds overflow-x: visible on the table to support column resizing.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant User
    participant TableV2 as TableV2 (React Aria)
    participant useDragAndDrop
    participant GlossaryTermTab
    participant API

    User->>TableV2: starts dragging row (TermA)
    TableV2->>useDragAndDrop: onDragStart(keys)
    useDragAndDrop->>GlossaryTermTab: "sets draggedGlossaryTermRef.current = TermA"

    User->>TableV2: hovers over target row (TermB)
    TableV2->>useDragAndDrop: getDropOperation(target, types)
    useDragAndDrop->>GlossaryTermTab: looks up target in glossaryTermByFqn
    GlossaryTermTab-->>useDragAndDrop: returns move or cancel

    User->>TableV2: drops on TermB
    TableV2->>useDragAndDrop: onItemDrop(event)
    useDragAndDrop->>GlossaryTermTab: reads draggedGlossaryTermRef, calls handleMoveRow(TermA, TermB)
    GlossaryTermTab->>GlossaryTermTab: opens confirmation modal

    User->>GlossaryTermTab: confirms move
    GlossaryTermTab->>API: patchGlossaryTerm(TermA.id, jsonPatch)
    API-->>GlossaryTermTab: success or error
    GlossaryTermTab->>GlossaryTermTab: refreshGlossaryTerms() or showErrorToast()

    User->>TableV2: drops on empty area (root)
    TableV2->>useDragAndDrop: onRootDrop()
    useDragAndDrop->>GlossaryTermTab: reads draggedGlossaryTermRef, calls handleMoveRow(TermA, undefined)
    GlossaryTermTab->>API: patchGlossaryTerm(TermA.id, remove-parent patch)
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant User
    participant TableV2 as TableV2 (React Aria)
    participant useDragAndDrop
    participant GlossaryTermTab
    participant API

    User->>TableV2: starts dragging row (TermA)
    TableV2->>useDragAndDrop: onDragStart(keys)
    useDragAndDrop->>GlossaryTermTab: "sets draggedGlossaryTermRef.current = TermA"

    User->>TableV2: hovers over target row (TermB)
    TableV2->>useDragAndDrop: getDropOperation(target, types)
    useDragAndDrop->>GlossaryTermTab: looks up target in glossaryTermByFqn
    GlossaryTermTab-->>useDragAndDrop: returns move or cancel

    User->>TableV2: drops on TermB
    TableV2->>useDragAndDrop: onItemDrop(event)
    useDragAndDrop->>GlossaryTermTab: reads draggedGlossaryTermRef, calls handleMoveRow(TermA, TermB)
    GlossaryTermTab->>GlossaryTermTab: opens confirmation modal

    User->>GlossaryTermTab: confirms move
    GlossaryTermTab->>API: patchGlossaryTerm(TermA.id, jsonPatch)
    API-->>GlossaryTermTab: success or error
    GlossaryTermTab->>GlossaryTermTab: refreshGlossaryTerms() or showErrorToast()

    User->>TableV2: drops on empty area (root)
    TableV2->>useDragAndDrop: onRootDrop()
    useDragAndDrop->>GlossaryTermTab: reads draggedGlossaryTermRef, calls handleMoveRow(TermA, undefined)
    GlossaryTermTab->>API: patchGlossaryTerm(TermA.id, remove-parent patch)
Loading

Reviews (4): Last reviewed commit: "fix(ui): address review — restrict term ..." | Re-trigger Greptile

@siddhant1 siddhant1 requested a review from a team as a code owner July 3, 2026 09:35
Copilot AI review requested due to automatic review settings July 3, 2026 09:35
@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

❌ PR checklist incomplete

This PR cannot be merged until the following are addressed on its linked issue:

  • No GitHub issue is linked. Link an issue in the Development section of the PR (or add Fixes #12345 to the description). For a same-org cross-repo issue, add Fixes open-metadata/<repo>#123 to the description.

The fields live on the linked issue in the Shipping project (open the issue → right sidebar → Projects). After you set them, re-run this check (or push a commit) — issue/project changes do not re-trigger it automatically.

Maintainers can bypass this check by adding the skip-pr-checks label.

@github-actions

github-actions Bot commented Jul 3, 2026

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!

@siddhant1 siddhant1 added UI UI specific issues safe to test Add this label to run secure Github workflows on PRs labels Jul 3, 2026
Comment on lines +1478 to +1492
const { dragAndDropHooks } = useDragAndDrop({
getItems: (keys) => {
const key = Array.from(keys)[0];
const record = key ? glossaryTermByFqn.get(String(key)) : undefined;

if (!record || record.isLoadMoreButton) {
return [];
}

return [{ [GLOSSARY_TERM_DRAG_TYPE]: record.fullyQualifiedName ?? '' }];
},
acceptedDragTypes: [GLOSSARY_TERM_DRAG_TYPE],
onDragStart: (event) => {
const key = Array.from(event.keys)[0];
draggedGlossaryTermRef.current = key

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Edge Case: Row drag reorder is not gated by edit permission

The new useDragAndDrop wiring is always enabled and passed to both the populated and empty tables regardless of permissions.EditAll/permissions.Create. The toolbar Bulk Edit button is permission-gated (getBulkEditButton(permissions.EditAll, ...)), but any user who can view the terms can now drag a row to re-parent/reorder it. This triggers the confirmation modal and a patchGlossaryTerm PATCH which will fail server-side for unauthorized users, surfacing an error toast instead of preventing the action. Consider only providing dragAndDropHooks when the user has the required permission (e.g. permissions.EditAll/permissions.Create), or making getDropOperation/getItems return cancel/[] when unauthorized so the drag affordance is disabled entirely.

Disable drag source when the user lacks edit permission (also guard getDropOperation).:

getItems: (keys) => {
  if (!permissions.EditAll) {
    return [];
  }
  const key = Array.from(keys)[0];
  const record = key ? glossaryTermByFqn.get(String(key)) : undefined;
  if (!record || record.isLoadMoreButton) {
    return [];
  }
  return [{ [GLOSSARY_TERM_DRAG_TYPE]: record.fullyQualifiedName ?? '' }];
},
  • Apply fix

Check the box to apply the fix or reply for a change | Was this helpful? React with 👍 / 👎


const GLOSSARY_TERM_DRAG_TYPE = 'application/x-om-glossary-term';

const GLOSSARY_TABLE_SCROLL = { y: 'calc(100vh - 350px)' };

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Quality: Sticky-header scroll offset is a hardcoded magic value

GLOSSARY_TABLE_SCROLL = { y: 'calc(100vh - 350px)' } hardcodes a viewport-relative offset that assumes a fixed amount of chrome (350px) above the table. In embedded/modal layouts or when the header height changes, the table's internal scroll region will be mis-sized (too tall, causing double scrollbars, or too short). The PR description itself flags this as needing per-layout tuning. Consider deriving the height from the actual container via a ref/ResizeObserver (a containerWidth observer already exists in this component) rather than a constant, or documenting the assumption clearly.

Document/derive the scroll height dynamically to avoid layout-specific breakage.:

// Prefer computing from the measured container instead of a fixed 350px:
// const scrollY = containerHeight ? containerHeight - toolbarHeight : 'calc(100vh - 350px)';
const GLOSSARY_TABLE_SCROLL = { y: 'calc(100vh - 350px)' };
  • Apply fix

Check the box to apply the fix or reply for a change | Was this helpful? React with 👍 / 👎

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.

Pull request overview

Migrates the Glossary Terms table UI to the React Aria TableV2/TableCard stack and restores key UX behaviors (adaptive search layout, column resizing affordance, drag-and-drop re-parenting, sticky header + internal scroll for infinite loading).

Changes:

  • Updates GlossaryTermTab to render TableV2 inside TableCard, add internal scroll.y, and implement RAC drag-and-drop via useDragAndDrop.
  • Adjusts glossary table styling for nested-row shading and RAC sticky-header scrolling behavior.
  • Fixes ColumnResizer handle styling by replacing deprecated Tailwind arbitrary CSS var syntax with theme utility classes.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

File Description
openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTermTab/GlossaryTermTab.component.tsx Switch to TableV2/TableCard, implement RAC drag-and-drop hooks, and rework table scroll/infinite-load wiring.
openmetadata-ui/src/main/resources/ui/src/components/Glossary/glossaryV1.less Update nested-row background styling for the new table DOM and adjust overflow behavior for sticky header scroll container.
openmetadata-ui/src/main/resources/ui/src/components/common/Table/TableV2.tsx Fix resizer indicator styling using valid Tailwind theme tokens.

Comment on lines +1479 to +1488
getItems: (keys) => {
const key = Array.from(keys)[0];
const record = key ? glossaryTermByFqn.get(String(key)) : undefined;

if (!record || record.isLoadMoreButton) {
return [];
}

return [{ [GLOSSARY_TERM_DRAG_TYPE]: record.fullyQualifiedName ?? '' }];
},
Comment on lines 497 to 499
// Monitor for DOM changes to detect when the table becomes scrollable
useEffect(() => {
const observer = new MutationObserver(() => {

const GLOSSARY_TERM_DRAG_TYPE = 'application/x-om-glossary-term';

const GLOSSARY_TABLE_SCROLL = { y: 'calc(100vh - 350px)' };

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.

P2 Hardcoded viewport-offset magic number

calc(100vh - 350px) assumes exactly 350 px of chrome above the table (nav bars, breadcrumbs, tab headers). The PR description acknowledges this "may need minor tuning per layout," but storing it as a module-level constant makes it invisible and easy to miss when layout changes. Consider deriving the offset from tableContainerRef at runtime (similar to the existing containerWidth measurement) so the table height stays correct regardless of the page's header height.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Comment on lines +1461 to +1476
const glossaryTermByFqn = useMemo(() => {
const termByFqn = new Map<string, ModifiedGlossaryTerm>();
const walk = (terms: ModifiedGlossaryTerm[]) => {
terms.forEach((term) => {
if (term.fullyQualifiedName) {
termByFqn.set(term.fullyQualifiedName, term);
}
if (term.children?.length) {
walk(term.children as ModifiedGlossaryTerm[]);
}
});
};
walk(filteredGlossaryTerms);

return termByFqn;
}, [filteredGlossaryTerms]);

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.

P1 glossaryTermByFqn corrupted by load-more placeholders, breaking drag-and-drop on paginated parents

processTermsWithLoadMore appends a load-more placeholder to a parent term's children via spread ({ ...term, isLoadMoreButton: true, key: ... }). The placeholder inherits the parent's fullyQualifiedName. When walk descends into that parent's children, it hits the placeholder and overwrites the parent's entry in the map:

termByFqn.set("Glossary.TermA", loadMoreButton) ← clobbers the real term

From that point, for any parent with hasMoreChildren: true and childrenPagingAfter set:

  • getItems returns [] (placeholder's isLoadMoreButton check), so the row cannot be dragged
  • getDropOperation returns 'cancel', so nothing can be dropped onto it

Fix: skip load-more placeholders in the walk by adding an !term.isLoadMoreButton guard before inserting into the map.

…resize, drag reorder, sticky header

Finish migrating the Glossary Terms table to the React Aria TableV2/TableCard stack and restore the behaviors lost in the migration:

- Adaptable search bar: the toolbar search grows/shrinks to fill space while Status/Bulk Edit/Expand-All stay fixed and visible.
- Column resize indicator: fix the ColumnResizer handle, which was invisible under Tailwind v4 (deprecated bg-[--var] arbitrary syntax -> valid bg-border-* utilities).
- Row drag-and-drop reorder/re-parent: replace the stripped native HTML5 onRow drag props with React Aria useDragAndDrop (dragAndDropHooks), reusing the existing move-confirmation flow; load-more rows excluded as sources/targets.
- Sticky header: give the table its own vertical scroll (scroll.y) so the sticky <thead> engages, make the outer container non-scrolling, and re-point infinite scroll at the internal scroll region.
- glossaryV1.less: RAC-compatible nested-row shading and the sticky-header enabling rule (neutralize the table's overflow-x).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 3, 2026 10:57
@siddhant1 siddhant1 force-pushed the glossary-table-v2 branch from 900c293 to c86e6be Compare July 3, 2026 10:57

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.

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

Comment on lines +188 to 192

table {
overflow-x: visible;
}
}
Copilot AI review requested due to automatic review settings July 3, 2026 11:03

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.

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated no new comments.

Comments suppressed due to low confidence (1)

openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTermTab/GlossaryTermTab.component.tsx:1256

  • extraTableFilters is memoized with useMemo, but its dependency array is missing several values used inside the memo (e.g., t, permissions.EditAll, handleEditGlossary, handleSearchChange). This can cause stale UI (e.g., bulk edit button visibility not updating with permissions, search input handler changes not reflected, and i18n text not updating on language change) and may violate the repo’s hook-deps lint rules.
  }, [
    isAllExpanded,
    isExpandingAll,
    isStatusDropdownVisible,
    statusDropdownMenu,

…and fix scroll-observer deps

- getDropOperation: only accept item drops with dropPosition 'on' (whole-row re-parent). Previously before/after positions returned 'move', so React Aria offered between-row insertion targets that no handler serviced — the indicator showed and the drop was silently discarded.
- MutationObserver infinite-scroll effect: add missing searchTerm and fetchAllTerms deps so its callback no longer reads a stale search mode / fetch closure (matches the sibling scroll-listener effect).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@gitar-bot

gitar-bot Bot commented Jul 3, 2026

Copy link
Copy Markdown
Code Review 👍 Approved with suggestions 1 resolved / 3 findings

Migrates the Glossary Terms table to the TableV2 stack with improved drag-and-drop, sticky headers, and responsive search layout. Please address the missing drag-and-drop permission gating and consider replacing the magic scroll offset with a more robust layout-relative value.

💡 Edge Case: Row drag reorder is not gated by edit permission

📄 openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTermTab/GlossaryTermTab.component.tsx:1478-1492

The new useDragAndDrop wiring is always enabled and passed to both the populated and empty tables regardless of permissions.EditAll/permissions.Create. The toolbar Bulk Edit button is permission-gated (getBulkEditButton(permissions.EditAll, ...)), but any user who can view the terms can now drag a row to re-parent/reorder it. This triggers the confirmation modal and a patchGlossaryTerm PATCH which will fail server-side for unauthorized users, surfacing an error toast instead of preventing the action. Consider only providing dragAndDropHooks when the user has the required permission (e.g. permissions.EditAll/permissions.Create), or making getDropOperation/getItems return cancel/[] when unauthorized so the drag affordance is disabled entirely.

Disable drag source when the user lacks edit permission (also guard getDropOperation).
getItems: (keys) => {
  if (!permissions.EditAll) {
    return [];
  }
  const key = Array.from(keys)[0];
  const record = key ? glossaryTermByFqn.get(String(key)) : undefined;
  if (!record || record.isLoadMoreButton) {
    return [];
  }
  return [{ [GLOSSARY_TERM_DRAG_TYPE]: record.fullyQualifiedName ?? '' }];
},
💡 Quality: Sticky-header scroll offset is a hardcoded magic value

📄 openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTermTab/GlossaryTermTab.component.tsx:127 📄 openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTermTab/GlossaryTermTab.component.tsx:1618 📄 openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTermTab/GlossaryTermTab.component.tsx:1656

GLOSSARY_TABLE_SCROLL = { y: 'calc(100vh - 350px)' } hardcodes a viewport-relative offset that assumes a fixed amount of chrome (350px) above the table. In embedded/modal layouts or when the header height changes, the table's internal scroll region will be mis-sized (too tall, causing double scrollbars, or too short). The PR description itself flags this as needing per-layout tuning. Consider deriving the height from the actual container via a ref/ResizeObserver (a containerWidth observer already exists in this component) rather than a constant, or documenting the assumption clearly.

Document/derive the scroll height dynamically to avoid layout-specific breakage.
// Prefer computing from the measured container instead of a fixed 350px:
// const scrollY = containerHeight ? containerHeight - toolbarHeight : 'calc(100vh - 350px)';
const GLOSSARY_TABLE_SCROLL = { y: 'calc(100vh - 350px)' };
✅ 1 resolved
Bug: Infinite-scroll relies on fragile nested DOM selector

📄 openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTermTab/GlossaryTermTab.component.tsx:466-480 📄 openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTermTab/GlossaryTermTab.component.tsx:521-523
findScrollContainer now resolves the scroll region via document.querySelector('.glossary-terms-scroll-container .glossary-terms-table table')?.parentElement. This couples infinite scroll and sticky-header detection to the exact internal DOM structure of TableV2/React-Aria (the <table>'s parent being the scroll.y element). If the core Table component wraps the <table> in an additional element (or renders it inside ResizableTableContainer), parentElement will be the wrong node and the scroll listener will attach to a non-scrolling element, silently breaking infinite scroll. The MutationObserver effect (line 521) also observes .glossary-terms-scroll-container but reads searchTerm from a stale closure since searchTerm is not in its dependency array. Prefer keying off a stable, component-owned attribute (e.g. a data attribute the table sets on its scroll region) rather than parentElement, and add searchTerm to the observer effect deps.

🤖 Prompt for agents
Code Review: Migrates the Glossary Terms table to the TableV2 stack with improved drag-and-drop, sticky headers, and responsive search layout. Please address the missing drag-and-drop permission gating and consider replacing the magic scroll offset with a more robust layout-relative value.

1. 💡 Edge Case: Row drag reorder is not gated by edit permission
   Files: openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTermTab/GlossaryTermTab.component.tsx:1478-1492

   The new `useDragAndDrop` wiring is always enabled and passed to both the populated and empty tables regardless of `permissions.EditAll`/`permissions.Create`. The toolbar Bulk Edit button is permission-gated (`getBulkEditButton(permissions.EditAll, ...)`), but any user who can view the terms can now drag a row to re-parent/reorder it. This triggers the confirmation modal and a `patchGlossaryTerm` PATCH which will fail server-side for unauthorized users, surfacing an error toast instead of preventing the action. Consider only providing `dragAndDropHooks` when the user has the required permission (e.g. `permissions.EditAll`/`permissions.Create`), or making `getDropOperation`/`getItems` return `cancel`/`[]` when unauthorized so the drag affordance is disabled entirely.

   Fix (Disable drag source when the user lacks edit permission (also guard getDropOperation).):
   getItems: (keys) => {
     if (!permissions.EditAll) {
       return [];
     }
     const key = Array.from(keys)[0];
     const record = key ? glossaryTermByFqn.get(String(key)) : undefined;
     if (!record || record.isLoadMoreButton) {
       return [];
     }
     return [{ [GLOSSARY_TERM_DRAG_TYPE]: record.fullyQualifiedName ?? '' }];
   },

2. 💡 Quality: Sticky-header scroll offset is a hardcoded magic value
   Files: openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTermTab/GlossaryTermTab.component.tsx:127, openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTermTab/GlossaryTermTab.component.tsx:1618, openmetadata-ui/src/main/resources/ui/src/components/Glossary/GlossaryTermTab/GlossaryTermTab.component.tsx:1656

   `GLOSSARY_TABLE_SCROLL = { y: 'calc(100vh - 350px)' }` hardcodes a viewport-relative offset that assumes a fixed amount of chrome (350px) above the table. In embedded/modal layouts or when the header height changes, the table's internal scroll region will be mis-sized (too tall, causing double scrollbars, or too short). The PR description itself flags this as needing per-layout tuning. Consider deriving the height from the actual container via a ref/ResizeObserver (a `containerWidth` observer already exists in this component) rather than a constant, or documenting the assumption clearly.

   Fix (Document/derive the scroll height dynamically to avoid layout-specific breakage.):
   // Prefer computing from the measured container instead of a fixed 350px:
   // const scrollY = containerHeight ? containerHeight - toolbarHeight : 'calc(100vh - 350px)';
   const GLOSSARY_TABLE_SCROLL = { y: 'calc(100vh - 350px)' };

Options

Display: compact → Showing less information.

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

Compact
gitar display:verbose         

Was this helpful? React with 👍 / 👎 | Gitar

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

🔴 Playwright Results — 77 failure(s), 18 flaky

✅ 4377 passed · ❌ 77 failed · 🟡 18 flaky · ⏭️ 69 skipped

Shard Passed Failed Flaky Skipped
🔴 Shard 1 436 5 2 16
🔴 Shard 2 740 34 5 39
🔴 Shard 3 794 15 0 7
🟡 Shard 4 809 0 2 5
🔴 Shard 5 854 2 1 0
🔴 Shard 6 744 21 8 2

Genuine Failures (failed on all attempts)

Features/EntityRenameConsolidation.spec.ts › GlossaryTerm - rename then update description should work (shard 1)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m549413bb%Leopard806244b6�[27m"�[39m
Received string:    �[31m"PW �[7m% e29732f8 Sad74ce26fd�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    19 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % e29732f8 Sad74ce26fd</span>�[22m
�[2m       - unexpected value "PW % e29732f8 Sad74ce26fd"�[22m

Features/Glossary/GlossaryPagination.spec.ts › should check for glossary term search (shard 1)
Error: �[2mexpect(�[22m�[31mreceived�[39m�[2m).�[22mtoBe�[2m(�[22m�[32mexpected�[39m�[2m) // Object.is equality�[22m

Expected: �[32m1�[39m
Received: �[31m0�[39m
Features/Glossary/GlossaryPagination.spec.ts › should check for nested glossary term search (shard 1)
Error: �[2mexpect(�[22m�[31mreceived�[39m�[2m).�[22mtoBe�[2m(�[22m�[32mexpected�[39m�[2m) // Object.is equality�[22m

Expected: �[32m5�[39m
Received: �[31m0�[39m
Features/MultipleRename.spec.ts › GlossaryTerm - should handle multiple consecutive renames (shard 1)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m21300fee%Pandaee595c26�[27m"�[39m
Received string:    �[31m"PW �[7m% 4ff8596e Zany36ee3c5a�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    19 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % 4ff8596e Zany36ee3c5a</span>�[22m
�[2m       - unexpected value "PW % 4ff8596e Zany36ee3c5a"�[22m

Flow/Tour.spec.ts › Tour should work from help section (shard 1)
Error: �[2mexpect(�[22m�[31mreceived�[39m�[2m).�[22mtoBe�[2m(�[22m�[32mexpected�[39m�[2m) // Object.is equality�[22m

Expected: �[32m"1�[7m5�[27m"�[39m
Received: �[31m"1�[7m4�[27m"�[39m

Call Log:
- Timeout 10000ms exceeded while waiting on the predicate
Features/ContextCenterPermission.spec.ts › user with view-only permission cannot see restore or delete actions on an archived document (shard 2)
Error: Document 469335de-e4ba-48bb-8e01-9e2923096ba7 did not appear in archive API within 60000ms
Features/Glossary/GlossaryAdvancedOperations.spec.ts › should clear all synonyms from term (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m66c2e709%Tiger982040�[27m97"�[39m
Received string:    �[31m"PW �[7m% 7f893289 Quick60a42�[27m97�[7mb�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    19 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % 7f893289 Quick60a4297b</span>�[22m
�[2m       - unexpected value "PW % 7f893289 Quick60a4297b"�[22m

Features/Glossary/GlossaryAdvancedOperations.spec.ts › should edit reference name (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m967d3f96%Shark4e9180b�[27m2"�[39m
Received string:    �[31m"PW �[7m% 58833dd7 Witty9c86957�[27m2"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    19 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % 58833dd7 Witty9c869572</span>�[22m
�[2m       - unexpected value "PW % 58833dd7 Witty9c869572"�[22m

Features/Glossary/GlossaryAdvancedOperations.spec.ts › should edit reference URL (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m8736f9b6%Hawk28f95006�[27m"�[39m
Received string:    �[31m"PW �[7m% eb25c648 Bold041c7aaf�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    19 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % eb25c648 Bold041c7aaf</span>�[22m
�[2m       - unexpected value "PW % eb25c648 Bold041c7aaf"�[22m

Features/Glossary/GlossaryAdvancedOperations.spec.ts › should remove individual reference from term (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7me08d426c%Tiger0f90b7d3�[27m"�[39m
Received string:    �[31m"PW �[7m% c173f214 Dark07d22cdd�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    19 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % c173f214 Dark07d22cdd</span>�[22m
�[2m       - unexpected value "PW % c173f214 Dark07d22cdd"�[22m

Features/Glossary/GlossaryAdvancedOperations.spec.ts › should remove related term (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m1694e263%Wolfa141ce52�[27m"�[39m
Received string:    �[31m"PW �[7m% 9d778df4 Silly905ef9a9�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    19 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % 9d778df4 Silly905ef9a9</span>�[22m
�[2m       - unexpected value "PW % 9d778df4 Silly905ef9a9"�[22m

Features/Glossary/GlossaryAdvancedOperations.spec.ts › should remove owner from term (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m802eb224%Owl8e7f0ad9�[27m"�[39m
Received string:    �[31m"PW �[7m% 7f315814 Noble2a8978cd�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    19 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % 7f315814 Noble2a8978cd</span>�[22m
�[2m       - unexpected value "PW % 7f315814 Noble2a8978cd"�[22m

Features/Glossary/GlossaryAdvancedOperations.spec.ts › should remove reviewer from term (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7mdacc5c02%Eaglea3fd455�[27m7"�[39m
Received string:    �[31m"PW �[7m% 4ea1680c Gentlefb91c6e�[27m7"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    18 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % 4ea1680c Gentlefb91c6e7</span>�[22m
�[2m       - unexpected value "PW % 4ea1680c Gentlefb91c6e7"�[22m

Features/Glossary/GlossaryAdvancedOperations.spec.ts › should remove tags from term (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m588a2977%Deer151e88e0�[27m"�[39m
Received string:    �[31m"PW �[7m% 0ac59540 Zany70d8d0eb�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    19 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % 0ac59540 Zany70d8d0eb</span>�[22m
�[2m       - unexpected value "PW % 0ac59540 Zany70d8d0eb"�[22m

Features/Glossary/GlossaryAdvancedOperations.spec.ts › should update term display name via manage menu (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7mb1d68882%Hawk53197f19�[27m"�[39m
Received string:    �[31m"PW �[7m% 70b7d04b Clever144c4b07�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    19 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % 70b7d04b Clever144c4b07</span>�[22m
�[2m       - unexpected value "PW % 70b7d04b Clever144c4b07"�[22m

Features/Glossary/GlossaryAssets.spec.ts › should add topic asset to glossary term (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m5c2afaf3%Pantherbacf63eb�[27m"�[39m
Received string:    �[31m"PW �[7m% 077c4faa Happy92c1a1c8�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    19 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % 077c4faa Happy92c1a1c8</span>�[22m
�[2m       - unexpected value "PW % 077c4faa Happy92c1a1c8"�[22m

Features/Glossary/GlossaryAssets.spec.ts › should add pipeline asset to glossary term (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m664af48f%Wolf4452a538�[27m"�[39m
Received string:    �[31m"PW �[7m% 5202bef1 Lazy53d70a47�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    19 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % 5202bef1 Lazy53d70a47</span>�[22m
�[2m       - unexpected value "PW % 5202bef1 Lazy53d70a47"�[22m

Features/Glossary/GlossaryAssets.spec.ts › should open summary panel when clicking asset card (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m06c074cb%Hawk14462�[27m3e�[7me�[27m"�[39m
Received string:    �[31m"PW �[7m% 11ba07d8 Merryc98f5�[27m3e�[7m6�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    19 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % 11ba07d8 Merryc98f53e6</span>�[22m
�[2m       - unexpected value "PW % 11ba07d8 Merryc98f53e6"�[22m

Features/Glossary/GlossaryAssets.spec.ts › should search within assets tab (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m1012d0e9%Rabbit07c5ee0b�[27m"�[39m
Received string:    �[31m"PW �[7m% 8e5f6cb8 Clevera81aeaf8�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    19 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % 8e5f6cb8 Clevera81aeaf8</span>�[22m
�[2m       - unexpected value "PW % 8e5f6cb8 Clevera81aeaf8"�[22m

Features/Glossary/GlossaryAssets.spec.ts › should remove asset from glossary term (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m42abb309%Zebraf7081d8�[27mb"�[39m
Received string:    �[31m"PW �[7m% c987fb70 Silly38c6a0f�[27mb"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    19 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % c987fb70 Silly38c6a0fb</span>�[22m
�[2m       - unexpected value "PW % c987fb70 Silly38c6a0fb"�[22m

Features/Glossary/GlossaryAssets.spec.ts › should bulk select and remove multiple assets (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m6c0e6635%Tiger6625d75a�[27m"�[39m
Received string:    �[31m"PW �[7m% 39602aff Dark073e46fd�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    19 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % 39602aff Dark073e46fd</span>�[22m
�[2m       - unexpected value "PW % 39602aff Dark073e46fd"�[22m

Features/Glossary/GlossaryAssets.spec.ts › should filter assets by entity type (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m3efb75a5%Owl98afee0d�[27m"�[39m
Received string:    �[31m"PW �[7m% 95b875ab Happy133e6dc5�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    18 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % 95b875ab Happy133e6dc5</span>�[22m
�[2m       - unexpected value "PW % 95b875ab Happy133e6dc5"�[22m

Features/Glossary/GlossaryAssets.spec.ts › should add asset via Add Assets dropdown button (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m8f6494fb%Zebra08fa6e30�[27m"�[39m
Received string:    �[31m"PW �[7m% 9e8b370f Quickd1a4c13c�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    18 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % 9e8b370f Quickd1a4c13c</span>�[22m
�[2m       - unexpected value "PW % 9e8b370f Quickd1a4c13c"�[22m

Features/Glossary/GlossaryAssets.spec.ts › should paginate through assets (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m1a5877e0%Giraffe5eabd939�[27m"�[39m
Received string:    �[31m"PW �[7m% d8182a28 Bright666f2a66�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    19 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % d8182a28 Bright666f2a66</span>�[22m
�[2m       - unexpected value "PW % d8182a28 Bright666f2a66"�[22m

Features/Glossary/GlossaryHierarchy.spec.ts › should move nested term to root level of same glossary (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m664b5054%Falcon19224c0c�[27m"�[39m
Received string:    �[31m"PW �[7m% ea0428b2 Noble557d5269�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    19 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % ea0428b2 Noble557d5269</span>�[22m
�[2m       - unexpected value "PW % ea0428b2 Noble557d5269"�[22m

Features/Glossary/GlossaryHierarchy.spec.ts › should move term to root of different glossary (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7md1aec25b%Zebra36ee667�[27m9"�[39m
Received string:    �[31m"PW �[7m% d5f1d563 Calm2482a00�[27m9"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    19 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % d5f1d563 Calm2482a009</span>�[22m
�[2m       - unexpected value "PW % d5f1d563 Calm2482a009"�[22m

Features/Glossary/GlossaryHierarchy.spec.ts › should cancel move operation (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m57f1527f%Sharkcd95281�[27m5"�[39m
Received string:    �[31m"PW �[7m% b719694c Merrye18f5f7�[27m5"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    18 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % b719694c Merrye18f5f75</span>�[22m
�[2m       - unexpected value "PW % b719694c Merrye18f5f75"�[22m

Features/Glossary/GlossaryMiscOperations.spec.ts › should delete term and remove tag from assets (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m86152568%Pandabb9b3245�[27m"�[39m
Received string:    �[31m"PW �[7m% e14f68cb Happy44454fe2�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    18 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % e14f68cb Happy44454fe2</span>�[22m
�[2m       - unexpected value "PW % e14f68cb Happy44454fe2"�[22m

Features/Glossary/GlossaryMiscOperations.spec.ts › should delete parent term and remove both parent and child tags from assets (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7me97dd0dd%Koalada9dc51�[27m8"�[39m
Received string:    �[31m"PW �[7m% bfc9672c Noble6e44d7b�[27m8"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    18 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % bfc9672c Noble6e44d7b8</span>�[22m
�[2m       - unexpected value "PW % bfc9672c Noble6e44d7b8"�[22m

Features/Glossary/GlossaryNavigation.spec.ts › should navigate between tabs on glossary term page (shard 2)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoContainText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed

Locator: locator('[data-testid="entity-header-display-name"]')
Expected substring: �[32m"PW �[7m14248c30%Panther2d1ea309�[27m"�[39m
Received string:    �[31m"PW �[7m% e3a59795 Clever2741b210�[27m"�[39m
Timeout: 15000ms

Call log:
�[2m  - Expect "toContainText" with timeout 15000ms�[22m
�[2m  - waiting for locator('[data-testid="entity-header-display-name"]')�[22m
�[2m    18 × locator resolved to <span data-testid="entity-header-display-name" class="ant-typography ant-typography-ellipsis ant-typography-single-line ant-typography-ellipsis-single-line entity-header-name m-b-0 d-block display-xs font-semibold">PW % e3a59795 Clever2741b210</span>�[22m
�[2m       - unexpected value "PW % e3a59795 Clever2741b210"�[22m

... and 47 more failures

🟡 18 flaky test(s) (passed on retry)
  • Features/NavigationBlocker.spec.ts › should not show navigation blocker after saving changes (shard 1, 1 retry)
  • Pages/Lineage/LineageRightPanel.spec.ts › Verify custom properties tab IS visible for supported type: metric (shard 1, 1 retry)
  • Features/BulkEditEntity.spec.ts › Glossary (shard 2, 1 retry)
  • Features/BulkImport.spec.ts › Database service (shard 2, 1 retry)
  • Features/BulkImport.spec.ts › Database (shard 2, 1 retry)
  • Features/BulkImport.spec.ts › Table (shard 2, 1 retry)
  • Features/Container.spec.ts › expand / collapse should not appear after updating nested fields for container (shard 2, 1 retry)
  • Features/UserProfileOnlineStatus.spec.ts › Should show "Active recently" for users active within last hour (shard 4, 1 retry)
  • Pages/DataContracts.spec.ts › Create Data Contract and validate for Topic (shard 4, 1 retry)
  • Pages/EntityDataSteward.spec.ts › Team as Owner Add, Update and Remove (shard 5, 1 retry)
  • Pages/ExplorePageRightPanel.spec.ts › Should allow Data Steward to view all tabs for searchIndex (shard 6, 1 retry)
  • Pages/GlossaryImportExport.spec.ts › Import partial success - some terms pass, some fail (shard 6, 1 retry)
  • Pages/InputOutputPorts.spec.ts › Output port drawer only shows data product assets (shard 6, 1 retry)
  • Pages/Lineage/LineageFilters.spec.ts › Verify lineage schema filter selection (shard 6, 1 retry)
  • Pages/Lineage/LineageRightPanel.spec.ts › Verify custom properties tab is NOT visible for pipelineService in platform lineage (shard 6, 1 retry)
  • Pages/Lineage/LineageRightPanel.spec.ts › Verify custom properties tab is NOT visible for apiService in platform lineage (shard 6, 1 retry)
  • Pages/ServiceEntity.spec.ts › User as Owner Add, Update and Remove (shard 6, 1 retry)
  • Pages/TestSuite.spec.ts › Logical TestSuite (shard 6, 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

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.

2 participants