Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
942bb16
refactor(query-builder): reroute antd package imports to ui package
chirag-madlani Jul 8, 2026
4eef5da
feat(query-builder): add OMTextWidget and OMNumberWidget using core I…
chirag-madlani Jul 8, 2026
a634a18
feat(query-builder): add OMSelectWidget using core Select with async …
chirag-madlani Jul 8, 2026
f013d54
feat(query-builder): add OMMultiSelectWidget using core MultiSelect w…
chirag-madlani Jul 8, 2026
7b9b943
feat(query-builder): add OMBooleanWidget and OMDateWidget
chirag-madlani Jul 8, 2026
2a53e9d
feat(query-builder): add OMFieldSelect and OMConjs using core Select …
chirag-madlani Jul 8, 2026
4e94b3b
feat(query-builder): add QueryBuilderOMConfig assembling OMConfig fro…
chirag-madlani Jul 8, 2026
371d8cd
feat(query-builder): wire OMConfig into AdvancedSearchClassBase, migr…
chirag-madlani Jul 8, 2026
bee9b4a
style(query-builder): fix import ordering in AdvancedSearchClassBase …
chirag-madlani Jul 8, 2026
3b6ecb5
feat(query-builder): migrate QueryBuilderWidgetV1 outer shell to core…
chirag-madlani Jul 8, 2026
4e55e9b
refactor(query-builder): update test files from antd to ui package
chirag-madlani Jul 8, 2026
9ca0533
fix(query-builder): correct OMDateWidget fieldType detection, remove …
chirag-madlani Jul 8, 2026
7c92bd1
fix(query-builder): remove hardcoded size from OMConjs ButtonGroup, d…
chirag-madlani Jul 8, 2026
e3f91ab
fix(query-builder): update Playwright selectors from antd to react-ar…
chirag-madlani Jul 9, 2026
b1cf1cc
fix(query-builder): fix selectOption race condition — wait before bra…
chirag-madlani Jul 9, 2026
e6f211f
fix(query-builder): remove stale .ant-select suffixes from Playwright…
chirag-madlani Jul 9, 2026
c2e304a
fix(query-builder): replace antd date-picker selectors with native in…
chirag-madlani Jul 9, 2026
5f2ef62
fix(query-builder): replace Select.ComboBox with Autocomplete in OMFi…
chirag-madlani Jul 9, 2026
412901c
fix(query-builder): revert OMFieldSelect from Autocomplete back to Se…
chirag-madlani Jul 10, 2026
7e25cfa
Merge branch 'main' into migrate-querybuilder-antd-to-core
chirag-madlani Jul 10, 2026
ff7e486
fix(query-builder): fix strict mode violation in selectOption — add .…
chirag-madlani Jul 10, 2026
315279d
fix(query-builder): open Select.ComboBox via trigger button to show a…
chirag-madlani Jul 11, 2026
7f4cf7b
Merge branch 'main' into migrate-querybuilder-antd-to-core
chirag-madlani Jul 11, 2026
4e2b5ab
fix(query-builder): use combobox input click (not toggle button) to o…
chirag-madlani Jul 12, 2026
af2bf07
fix(query-builder): exclude Suggestions listbox when waiting for drop…
chirag-madlani Jul 13, 2026
ed906d5
fix(query-builder): wait for visible listbox and guard async widget r…
chirag-madlani Jul 13, 2026
2753a2e
Merge branch 'main' into migrate-querybuilder-antd-to-core
chirag-madlani Jul 13, 2026
78a5b44
Migrated asset selection drawer and modal (#29956)
Rohit0301 Jul 13, 2026
b04a39f
refactor(context-center): wrap header components with HeaderShell (#2…
Rohit0301 Jul 13, 2026
08d8334
fix(csv-import): preserve inherited domains across all importers with…
sonika-shah Jul 13, 2026
22b53fb
Fixes 29269: retry Bedrock 429 throttling with backoff (#29938)
mohityadav766 Jul 13, 2026
93be940
fix customize navigation duplicate indentifier (#29990)
anuj-kumary Jul 13, 2026
1c7ce46
Fixes #29439: Table schemaDefinition silently dropped on PUT (#29441)
hennekey Jul 13, 2026
c08e60a
fix(query-builder): conjunction toggle exposes radio role, not button
chirag-madlani Jul 14, 2026
6efd861
fix(query-builder): never pointer-click ComboBox inputs — chevron int…
chirag-madlani Jul 14, 2026
8da3178
Merge remote-tracking branch 'origin/main' into migrate-querybuilder-…
chirag-madlani Jul 14, 2026
3b9a035
fix(query-builder): repair ComboBox filtering, cascades and async sea…
chirag-madlani Jul 14, 2026
acd716f
fix(query-builder): replace remaining antd-era selectors in QB specs
chirag-madlani Jul 15, 2026
c4d5d75
Merge remote-tracking branch 'origin/main' into migrate-querybuilder-…
chirag-madlani Jul 15, 2026
daa1f9a
fix(query-builder): datetime widget formats + popup scoping in select…
chirag-madlani Jul 15, 2026
1077215
fix(query-builder): blur-close popups, focus option before Enter, No-…
chirag-madlani Jul 17, 2026
2601f5e
fix(query-builder): make select-family popovers non-modal — aria-hidd…
chirag-madlani Jul 17, 2026
d9f303a
Merge remote-tracking branch 'origin/main' into migrate-querybuilder-…
chirag-madlani Jul 17, 2026
b3daed4
fix(query-builder): explicit aria-label on add-condition buttons
chirag-madlani Jul 18, 2026
166c227
Merge remote-tracking branch 'origin/main' into migrate-querybuilder-…
chirag-madlani Jul 18, 2026
d024a3d
fix(ui-core): make remaining popovers non-modal — recurring aria-hidd…
chirag-madlani Jul 19, 2026
b55b31a
Merge remote-tracking branch 'origin/main' into migrate-querybuilder-…
chirag-madlani Jul 21, 2026
4e812b6
Merge remote-tracking branch 'origin/main' into migrate-querybuilder-…
chirag-madlani Jul 23, 2026
7dfcbd8
fix(querybuilder): fix async dropdown updates, ESLint ring errors, an…
anuj-kumary Jul 29, 2026
ef0b1e1
Merge upstream/main into migrate-querybuilder-antd-to-core
anuj-kumary Jul 30, 2026
94b2f22
fix(querybuilder): complete antd removal from AdvancedSearchUtils
anuj-kumary Jul 31, 2026
ec9dd2e
Merge branch 'main' into migrate-querybuilder-antd-to-core
anuj-kumary Jul 31, 2026
b4446f2
fix(test): update DataAssetPickerShell test for non-modal Popover
anuj-kumary Jul 31, 2026
fe62c87
fix(querybuilder): two real bugs from the antd→core migration
anuj-kumary Jul 31, 2026
d13bbe1
Merge branch 'main' into migrate-querybuilder-antd-to-core
anuj-kumary Jul 31, 2026
7a523ae
fix unit test
anuj-kumary Aug 1, 2026
3be2043
fix lint checks
anuj-kumary Aug 1, 2026
b421926
fix the style
anuj-kumary Aug 2, 2026
0e3ffeb
fix the checkstyle
anuj-kumary Aug 2, 2026
87169ad
Merge branch 'main' into migrate-querybuilder-antd-to-core
anuj-kumary Aug 2, 2026
1d5077d
Merge branch 'main' into migrate-querybuilder-antd-to-core
anuj-kumary Aug 3, 2026
5cf207f
Merge branch 'main' into migrate-querybuilder-antd-to-core
anuj-kumary Aug 3, 2026
691d334
fix(playwright): scope value combobox popup via aria-controls in fill…
anuj-kumary Aug 3, 2026
dacc68e
Merge branch 'main' into migrate-querybuilder-antd-to-core
anuj-kumary Aug 3, 2026
b520c7d
nit
anuj-kumary Aug 3, 2026
021d216
nit
anuj-kumary Aug 3, 2026
9c62010
nit
anuj-kumary Aug 4, 2026
ecda621
Merge branch 'main' into migrate-querybuilder-antd-to-core
anuj-kumary Aug 4, 2026
9cd439f
fix(query-builder): stop async value combobox showing the default cat…
anuj-kumary Aug 4, 2026
43e819b
fix(query-builder): keep the searched value option present by accumul…
anuj-kumary Aug 4, 2026
94ae8a0
fix(query-builder): fix waitForResponse pattern and retry-loop deboun…
anuj-kumary Aug 4, 2026
002159e
minor fixes
anuj-kumary Aug 4, 2026
a138051
nit
anuj-kumary Aug 4, 2026
8c81441
Resolve merge confclits
anuj-kumary Aug 4, 2026
bc1a4ce
fix lint checks
anuj-kumary Aug 4, 2026
f740d4d
fix playwright
anuj-kumary Aug 4, 2026
c54bd44
Resolved merge confclits
anuj-kumary Aug 4, 2026
94291e7
fix playwright
anuj-kumary Aug 5, 2026
83ad9b0
nit
anuj-kumary Aug 5, 2026
3b052ea
Merge branch 'main' into migrate-querybuilder-antd-to-core
anuj-kumary Aug 5, 2026
971d94e
Merge branch 'main' into migrate-querybuilder-antd-to-core
anuj-kumary Aug 6, 2026
352fea4
Merge branch 'main' into migrate-querybuilder-antd-to-core
anuj-kumary Aug 6, 2026
41819a5
Merge branch 'main' into migrate-querybuilder-antd-to-core
anuj-kumary Aug 6, 2026
5c42461
Merge branch 'main' into migrate-querybuilder-antd-to-core
anuj-kumary Aug 7, 2026
e4fe495
fix(e2e): wait for ES to index schemas before AdvancedSearch tests run
anuj-kumary Aug 7, 2026
a8df9b0
Merge branch 'main' into migrate-querybuilder-antd-to-core
anuj-kumary Aug 7, 2026
61001a3
fix(e2e): retry async search on every attempt in selectOption
anuj-kumary Jul 31, 2026
514fdf4
Revert "fix(e2e): retry async search on every attempt in selectOption"
anuj-kumary Aug 7, 2026
b62671b
Merge branch 'main' into migrate-querybuilder-antd-to-core
anuj-kumary Aug 7, 2026
4cbf663
Merge branch 'main' into migrate-querybuilder-antd-to-core
anuj-kumary Aug 8, 2026
3086bd9
nit
anuj-kumary Aug 8, 2026
2b48348
Merge branch 'main' into migrate-querybuilder-antd-to-core
anuj-kumary Aug 10, 2026
820b879
fix(e2e): remove redundant beforeAll ES indexing wait in AdvancedSearch
anuj-kumary Aug 10, 2026
cd07592
Merge branch 'main' into migrate-querybuilder-antd-to-core
anuj-kumary Aug 11, 2026
a038abb
fix(e2e): wait for ES to index charts before AdvancedSearch tests run
anuj-kumary Aug 11, 2026
f841131
Revert "fix(e2e): wait for ES to index charts before AdvancedSearch t…
anuj-kumary Aug 11, 2026
7e8b98f
Merge branch 'main' into migrate-querybuilder-antd-to-core
anuj-kumary Aug 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,10 @@ export const NavAccountCard = ({
<ChevronSelectorVertical className="tw:size-4 tw:shrink-0" />
</AriaButton>
<AriaPopover
// Non-modal: modal popovers apply aria-hidden to the rest of the
// page and leak it permanently on abrupt unmount — see
// base/select/popover.tsx.
isNonModal
className={({ isEntering, isExiting }) =>
cx(
'tw:origin-(--trigger-anchor-point) tw:will-change-transform',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ export const Popover = ({
}: PopoverProps) => {
return (
<AriaPopover
// Non-modal: modal popovers apply aria-hidden to the rest of the page
// and leak it permanently on abrupt unmount — see base/select/popover.tsx.
isNonModal
offset={offset}
{...popoverProps}
className={(state) =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,11 @@ const DropdownPopover = (props: DropdownPopoverProps) => {

return (
<AriaPopover
// Menus are non-modal (ARIA menu-button pattern). Modal popovers apply
// aria-hidden to the rest of the page and leak it permanently when the
// popover unmounts abruptly, leaving the app invisible to the
// accessibility tree — see the identical fix in base/select/popover.tsx.
isNonModal
placement={placement}
{...rest}
className={(state) =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,16 @@ export const ComboBox = ({

return (
<SelectContext.Provider value={selectContextValue}>
<AriaComboBox menuTrigger="focus" {...otherProps}>
{/* items must live on the ComboBox (not the inner ListBox) so React
Aria owns the collection. Using controlled `items` (not defaultItems)
ensures that callers who manage their own item list — e.g. async
loaders that call setItems() after a fetch — see updates reflected in
the dropdown. The previous `defaultItems` form only initialised the
internal collection once and silently ignored subsequent prop changes
(standard uncontrolled-state behaviour). With `items` being
controlled, callers that want client-side filtering must do it
themselves before passing items in. */}
<AriaComboBox items={items} menuTrigger="focus" {...otherProps}>
{(state) => (
<div className="tw:flex tw:flex-col tw:gap-1.5">
{otherProps.label && (
Expand All @@ -253,7 +262,6 @@ export const ComboBox = ({
triggerRef={triggerRef}>
<AriaListBox
className="tw:size-full tw:outline-hidden"
items={items}
renderEmptyState={() => (
<SelectEmptyState emptyState={emptyState} />
)}>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ import {
ComboBoxStateContext,
} from 'react-aria-components';
import type { ListData } from 'react-stately';
import { useListData } from 'react-stately';
import { SelectItem } from './select-item';

interface ComboBoxValueProps
Expand Down Expand Up @@ -280,6 +279,7 @@ export const MultiSelectBase = ({
onItemInserted,
shortcut,
placeholder = 'Search',
onInputChange: onInputChangeProp,
// Omit these props to avoid conflicts with the `Select` component
name: _name,
className: _className,
Expand All @@ -298,10 +298,15 @@ export const MultiSelectBase = ({
[contains, selectedKeys]
);

const accessibleList = useListData({
initialItems: items,
filter,
});
// Derive the visible options from the live `items` prop instead of
// useListData({ initialItems }) — that hook snapshots the items on mount,
// so async consumers that fetch options on input change never see their
// results reflected in the popup.
const [filterText, setFilterText] = useState('');
const filteredItems = useMemo(
() => (items ?? []).filter((item) => filter(item, filterText)),
[items, filter, filterText]
);

const onRemove = useCallback(
(keys: Set<Key>) => {
Expand All @@ -322,7 +327,7 @@ export const MultiSelectBase = ({
return;
}

const item = accessibleList.getItem(id);
const item = (items ?? []).find((currentItem) => currentItem.id === id);

if (!item) {
return;
Expand All @@ -333,14 +338,18 @@ export const MultiSelectBase = ({
onItemInserted?.(id);
}

accessibleList.setFilterText('');
setFilterText('');
};

const onInputChange = useCallback(
(value: string) => {
accessibleList.setFilterText(value);
setFilterText(value);
// Chain the consumer's handler — the internal one is applied after
// {...props} on AriaComboBox and would otherwise silently drop it
// (async search widgets rely on it to fetch matching options).
onInputChangeProp?.(value);
},
[accessibleList]
[onInputChangeProp]
);

const placeholderRef = useRef<HTMLDivElement>(null);
Expand Down Expand Up @@ -370,8 +379,8 @@ export const MultiSelectBase = ({
<ComboboxContext.Provider value={contextValues}>
<AriaComboBox
allowsEmptyCollection
inputValue={accessibleList.filterText}
items={accessibleList.items}
inputValue={filterText}
items={filteredItems}
menuTrigger="focus"
// This keeps the combobox popover open and the input value unchanged when an item is selected.
selectedKey={null}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ interface PopoverProps extends AriaPopoverProps, RefAttributes<HTMLElement> {
export const Popover = (props: PopoverProps) => {
return (
<AriaPopover
// Combobox/select popups must be non-modal: modal popovers apply
// aria-hidden to the rest of the page (ariaHideOutside), and when the
// popover unmounts abruptly (its owner re-renders away) that cleanup
// never runs — leaving the whole app invisible to the accessibility
// tree (and to role-based queries) while looking perfectly normal.
isNonModal
containerPadding={0}
offset={4}
placement="bottom"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@
topic1.create(apiContext),
topic2.create(apiContext),
]);

glossaryEntity = new Glossary(undefined, [
{
id: user.responseData.id,
Expand Down Expand Up @@ -453,23 +454,24 @@
const ruleLocator = page.locator('.rule').nth(0);
await selectOption(
page,
ruleLocator.locator('.rule--field .ant-select'),
ruleLocator.locator('.rule--field'),
'Status',
true
);
await selectOption(
page,
ruleLocator.locator('.rule--operator .ant-select'),
'=='
);
await selectOption(page, ruleLocator.locator('.rule--operator'), '==');
});

await test.step('Open Status value dropdown and verify all hard-coded options appear', async () => {
const ruleLocator = page.locator('.rule').nth(0);
await ruleLocator.locator('.widget--widget > .ant-select').click();
const triggerBtn = ruleLocator.locator(
'.widget--widget button[aria-haspopup="listbox"]'
);

await expect(triggerBtn).toBeVisible();
await triggerBtn.click();

const dropdown = page
.locator('.ant-select-dropdown')
.locator('[role="listbox"]')
.filter({ hasText: EntityStatus.Approved })
.last();

Expand All @@ -478,7 +480,7 @@
for (const status of ENTITY_STATUSES) {
await expect(
dropdown
.locator('.ant-select-item-option')
.getByRole('option')
.filter({ hasText: new RegExp(`^${status}$`, 'i') })
.first()
).toBeVisible();
Expand Down Expand Up @@ -1638,83 +1640,48 @@

await selectOption(
page,
ruleLocator.locator('.rule--field .ant-select'),
ruleLocator.locator('.rule--field'),
'Custom Properties',
true
);
await selectOption(
page,
ruleLocator.locator('.rule--field .ant-select'),
ruleLocator.locator('.rule--field'),
'Table',
true
);
await selectOption(
page,
ruleLocator.locator('.rule--field .ant-select'),
ruleLocator.locator('.rule--field'),
enumCPName,
true
);
await selectOption(
page,
ruleLocator.locator('.rule--operator .ant-select'),
ruleLocator.locator('.rule--operator'),
'Equals'
);

const valueSelector = ruleLocator.locator(
'.ant-select-selection-overflow'
const comboboxInput = ruleLocator.locator(
'.rule--widget input[role="combobox"]'
);

await expect(valueSelector).toBeVisible({ timeout: 15000 });
await valueSelector.click();
await expect(comboboxInput).toBeVisible({ timeout: 15000 });
// fill('') focuses the input (menuTrigger="focus" opens the popup)
// without pointer-clicking — the overlaid chevron button can intercept
// clicks at the input's center in narrow ComboBoxes.
await comboboxInput.fill('');

const dropdown = page.locator('.ant-select-dropdown:visible').last();
const dropdown = page.locator('[role="listbox"]:visible').last();

await expect(dropdown).toBeVisible();

return { ruleLocator, valueSelector, dropdown };
return { ruleLocator, comboboxInput, dropdown };
};

test('should append page-2 items and make them visible when Load more button is clicked', async ({
page,
}) => {
test.slow();

const { dropdown } = await openEnumValueDropdown(page);

// Page 1 items present; page-2 item not yet visible
await expect(
dropdown.locator(`[title="${FIRST_PAGE_VALUE}"]`)
).toBeVisible({ timeout: 10000 });
await expect(
dropdown.locator(`[title="${SECOND_PAGE_VALUE}"]`)
).not.toBeVisible();

// "Load more..." button visible at the bottom of the list
const loadMoreBtn = dropdown
.locator('a')
.filter({ hasText: /load more/i });

await expect(loadMoreBtn).toBeVisible();

// Click Load more → page-2 items append
await loadMoreBtn.click();

// Hover over the virtual list so mouse wheel events target it
const virtualListHolder = dropdown.locator('.rc-virtual-list-holder');

await expect(virtualListHolder).toBeVisible();
await virtualListHolder.hover();

// Wheel-scroll in small increments until the page-2 item comes into view
const secondPageItem = dropdown.locator(`[title="${SECOND_PAGE_VALUE}"]`);
let found = await secondPageItem.isVisible();

for (let i = 0; i < 20 && !found; i++) {
await page.mouse.wheel(0, 200);
found = await secondPageItem.isVisible();
}

await expect(secondPageItem).toBeVisible({ timeout: 5000 });
test.skip('should append page-2 items and make them visible when Load more button is clicked', () => {

Check warning on line 1682 in openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/AdvancedSearch.spec.ts

View workflow job for this annotation

GitHub Actions / checkstyle

Unexpected use of the `.skip()` annotation
// Load more and rc-virtual-list are Ant Design Select features not present
// in the new react-aria MultiSelect component.
});

test('should find page-2 items via search without clicking Load more', async ({
Expand All @@ -1726,22 +1693,22 @@

// Page 1 items load; page-2 item is not yet visible
await expect(
dropdown.locator(`[title="${FIRST_PAGE_VALUE}"]`)
dropdown.getByRole('option', { name: FIRST_PAGE_VALUE })
).toBeVisible({ timeout: 10000 });
await expect(
dropdown.locator(`[title="${SECOND_PAGE_VALUE}"]`)
dropdown.getByRole('option', { name: SECOND_PAGE_VALUE })
).not.toBeVisible();

// Type to search — asyncFetch filters the full values array, not just the loaded page
const searchInput = ruleLocator.locator(
'.rule--widget .ant-select-selection-search-input'
'.rule--widget input[role="combobox"]'
);

await searchInput.fill(SECOND_PAGE_VALUE);

// Item appears immediately without clicking Load more
await expect(
dropdown.locator(`[title="${SECOND_PAGE_VALUE}"]`)
dropdown.getByRole('option', { name: SECOND_PAGE_VALUE })
).toBeVisible({ timeout: 10000 });
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,27 +58,17 @@ test.describe('Advanced Search Suggestions', () => {

await selectOption(
page,
ruleLocator.locator('.rule--field .ant-select'),
ruleLocator.locator('.rule--field'),
field.label,
true
);

await selectOption(
page,
ruleLocator.locator('.rule--operator .ant-select'),
'=='
);
await selectOption(page, ruleLocator.locator('.rule--operator'), '==');

const dropdownInput = ruleLocator.locator(
'.widget--widget > .ant-select > .ant-select-selector input'
'.widget--widget input[role="combobox"]'
);

const aggregateRes1 = page.waitForResponse('/api/v1/search/aggregate?*');

await dropdownInput.click();

await aggregateRes1;

const searchText = toLower(
getFieldsSuggestionSearchText(field.label, testData.fieldSearchData)
);
Expand All @@ -95,7 +85,10 @@ test.describe('Advanced Search Suggestions', () => {

await test
.expect(
page.locator(`.ant-select-dropdown:visible [title="${searchText}"]`)
page
.locator('[role="listbox"]:visible [role="option"]')
.filter({ hasText: searchText })
.first()
)
.toBeVisible();
});
Expand Down
Loading
Loading