Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
c329d4c
Fixes #6884: migrate display and navigation components to core
shah-harshit Oct 12, 2026
4a0f71d
fix(ui): use core alert spacing in marketplace details
shah-harshit Oct 12, 2026
00f50c7
fix(ui): preserve collapsed navigation and notification interactions
shah-harshit Oct 12, 2026
765228f
test(playwright): cover pipeline execution tree view after Tree migra…
shah-harshit Oct 12, 2026
c302948
fix(ui): repair build after syncing main and drop accordion codemod l…
shah-harshit Oct 12, 2026
4208cb7
fix(ui): give collapsed sidebar groups and links the same core icon s…
shah-harshit Oct 12, 2026
da07044
refactor(ui): migrate selection and numeric fields to core
shah-harshit Oct 12, 2026
74b68c6
fix(ui): preserve tree picker keyboard navigation and labels
shah-harshit Oct 12, 2026
908a0ed
fix(ui): name learning resource rows for accessible tables
shah-harshit Oct 12, 2026
f1e6a4f
fix(ui): keep KPI sliders visible beside numeric targets
shah-harshit Oct 12, 2026
31366a1
fix(ui): retain async permission search results in combobox
shah-harshit Oct 12, 2026
dc5e156
test(ui): assert core ButtonGroup, NumberInput and Slider behaviour i…
shah-harshit Oct 12, 2026
c07af2f
test(ui): upload CSVs through the core file input in EntityImport tests
shah-harshit Oct 12, 2026
ca80ebd
refactor(ui): leave Affix, Empty, Image, Result and Spin to #35339
shah-harshit Oct 13, 2026
eff55f0
Merge main into the display, navigation and form migration
shah-harshit Oct 13, 2026
4d9de80
docs: keep main's generated API reference
shah-harshit Oct 13, 2026
ad834d8
fix(ui): keep core Accordion styling and name its toggles
shah-harshit Oct 13, 2026
dc5a9bc
chore(playwright): auto-refresh impact-map.generated.json
github-actions[bot] Oct 13, 2026
ae9fc82
fix(ui): clear UI checkstyle for core i18n, half-circle color and boo…
shah-harshit Oct 13, 2026
c04d9b0
fix(ui): restore navbar header box and align sidebar items
shah-harshit Oct 13, 2026
ac14317
fix(ui): restore form spacing, teams tree loading and slideout stacking
shah-harshit Oct 13, 2026
132d9f5
fix(ui): retry failed team loads, toast once, and tokenise the versio…
shah-harshit Oct 13, 2026
3c7ba3b
fix(ui): fit 3-digit sample values, restore rule placeholders, mark t…
shah-harshit Oct 13, 2026
a9a21d8
fix(ui): keep the profiler sample slider full width; refresh sidebar …
shah-harshit Oct 13, 2026
0a752fc
fix(ui): opt the column filter out of the table selection slot; align…
shah-harshit Oct 13, 2026
3a7045d
chore(playwright): auto-refresh impact-map.generated.json
github-actions[bot] Oct 13, 2026
98770fa
test(ui): point remaining E2E specs at the core sidebar, insights nav…
shah-harshit Oct 13, 2026
229b3dc
chore(playwright): auto-refresh impact-map.generated.json
github-actions[bot] Oct 13, 2026
06df2c6
chore(ui): drop unused team chip locator and fix hook dependency warn…
shah-harshit Oct 13, 2026
4ec01aa
fix(ui): let search settings accordion rows toggle across their width…
shah-harshit Oct 13, 2026
fc11545
fix(ui): restore the SAML drop zone copy and give profiler metric row…
shah-harshit Oct 13, 2026
18f2a9d
chore(playwright): auto-refresh impact-map.generated.json
github-actions[bot] Oct 13, 2026
22bd388
fix(ui): keep a matching tree node's subtree visible while searching …
shah-harshit Oct 13, 2026
68e4e14
fix(ui): name the TableV2 row expander and stop specs toggling an ope…
shah-harshit Oct 13, 2026
994c833
test(ui): drop on the target row's edge when reordering navigation an…
shah-harshit Oct 13, 2026
7006ba8
fix(ui): route collapsed sidebar links through the client router
shah-harshit Oct 13, 2026
52667e9
Merge remote-tracking branch 'origin/main' into shah-harshit/7300-ant…
shah-harshit Oct 14, 2026
ff2c035
fix(ui): unmount collapsed alert event, sample message and search fie…
shah-harshit Oct 14, 2026
7c4fd44
fix(ui): keep tag tooltip FQN bold when the description is HTML
shah-harshit Oct 14, 2026
653f573
fix(ui): flatten the left-panel frame card on every entity tab
shah-harshit Oct 14, 2026
7b97f28
fix(ui): let the Explore search fill the header row on wide screens
shah-harshit Oct 14, 2026
fed7981
fix(ui): use the shared core edit button on every header field
shah-harshit Oct 14, 2026
5e85388
fix(ui): keep the Explore search centred while it grows with the screen
shah-harshit Oct 14, 2026
82db947
chore(ui): sort WorkflowHeader imports for UI checkstyle
shah-harshit Oct 14, 2026
de2ec22
test(playwright): fix Data Insight, settings navigation and topic cop…
shah-harshit Oct 14, 2026
1b98e58
fix(ui): restore the header Tier tooltip and stop tooltips closing mi…
shah-harshit Oct 14, 2026
6a82daf
fix(ui): only ignore the pointer while a tooltip enters
shah-harshit Oct 14, 2026
e90a92a
feat(ui-core): pass the clicked preset to DateRangePicker onApply
shah-harshit Oct 14, 2026
2c424f1
fix(ui-core): keep the DateRangePicker preset key on mobile and drop …
shah-harshit Oct 14, 2026
9aefa72
Merge remote-tracking branch 'origin/main' into shah-harshit/7300-ant…
shah-harshit Oct 14, 2026
2685ec2
test(ui): drive merged numeric and metric pickers through their core …
shah-harshit Oct 14, 2026
fd4ed0a
test(ui): refresh roles, glossary and narrow metric-list visual basel…
shah-harshit Oct 14, 2026
5b2ffa0
test(ui): refresh the explore visual baseline for the core sidebar
shah-harshit Oct 14, 2026
8d9f3dd
test(ui): open the profiler metrics picker through its combobox
shah-harshit Oct 14, 2026
06a5d10
Merge branch 'main' into shah-harshit/7300-antd-display-components
shah-harshit Oct 14, 2026
5e0fb2d
Merge branch 'main' into shah-harshit/7300-antd-display-components
shah-harshit Oct 14, 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
53 changes: 24 additions & 29 deletions .github/playwright/impact-map.generated.json
Original file line number Diff line number Diff line change
Expand Up @@ -5165,6 +5165,7 @@
"openmetadata-ui/src/main/resources/ui/playwright/utils/userDetails.ts"
],
"specs": [
"playwright/e2e/Pages/Teams.spec.ts",
"playwright/e2e/Pages/UserDetails.spec.ts"
]
},
Expand Down Expand Up @@ -5660,6 +5661,16 @@
"playwright/e2e/Features/BlockEditorEmbedLink.spec.ts"
]
},
{
"sources": [
"openmetadata-ui/src/main/resources/ui/src/components/BlockEditor/Extensions/image/UploadFile/UploadFileTab.tsx"
],
"specs": [
"playwright/e2e/Features/BulkImport.spec.ts",
"playwright/e2e/Features/BulkImportWithDotInName.spec.ts",
"playwright/e2e/Features/MetricBulkImportExportEdit.spec.ts"
]
},
{
"sources": [
"openmetadata-ui/src/main/resources/ui/src/components/BulkEditEntity/BulkEditEntity.component.tsx"
Expand Down Expand Up @@ -5885,6 +5896,7 @@
"playwright/e2e/Features/ContextCenterDashboard.spec.ts",
"playwright/e2e/Features/ContextCenterDocument.spec.ts",
"playwright/e2e/Features/ContextCenterPermission.spec.ts",
"playwright/e2e/Features/SSOConfiguration.spec.ts",
"playwright/e2e/Pages/DataContracts.spec.ts",
"playwright/e2e/Pages/ODCSImportExport.spec.ts"
]
Expand Down Expand Up @@ -6147,6 +6159,7 @@
"playwright/e2e/Features/ContextCenterDocument.spec.ts",
"playwright/e2e/Features/ContextCenterPermission.spec.ts",
"playwright/e2e/Features/DataQuality/TestCaseImportExportBasic.spec.ts",
"playwright/e2e/Features/SSOConfiguration.spec.ts",
"playwright/e2e/Pages/DataContracts.spec.ts",
"playwright/e2e/Pages/ODCSImportExport.spec.ts",
"playwright/e2e/Pages/Users.spec.ts"
Expand Down Expand Up @@ -7798,6 +7811,7 @@
"playwright/e2e/Features/AppMode/AppModeResolver.spec.ts",
"playwright/e2e/Features/CustomizeNavigationNewItems.spec.ts",
"playwright/e2e/Features/DataQuality/IncidentManagerLocaleLayout.spec.ts",
"playwright/e2e/Features/NavigationBlocker.spec.ts",
"playwright/e2e/Features/RoleFixtureSessions.spec.ts",
"playwright/e2e/Features/SettingsNavigationPage.spec.ts",
"playwright/e2e/Pages/DataInsight.spec.ts"
Expand Down Expand Up @@ -8072,33 +8086,6 @@
"playwright/e2e/Pages/SearchSettings.spec.ts"
]
},
{
"sources": [
"openmetadata-ui/src/main/resources/ui/src/components/PaginationComponent/PaginationComponent.tsx"
],
"specs": [
"playwright/e2e/Features/AIMode/ConnectionServiceDetails.spec.ts",
"playwright/e2e/Features/Container.spec.ts",
"playwright/e2e/Features/Dashboards.spec.ts",
"playwright/e2e/Features/DataQuality/DataQuality.spec.ts",
"playwright/e2e/Features/DataQuality/DataQualityListAfterReindex.spec.ts",
"playwright/e2e/Features/DataQuality/IncidentManagerAfterReindex.spec.ts",
"playwright/e2e/Features/DataQuality/TableTestCasePagination.spec.ts",
"playwright/e2e/Features/DataQuality/TestDefinitionFilters.spec.ts",
"playwright/e2e/Features/DataQuality/TestDefinitionSortAndSearch.spec.ts",
"playwright/e2e/Features/DataQuality/TestLibrary.spec.ts",
"playwright/e2e/Features/Glossary/LargeGlossaryPerformance.spec.ts",
"playwright/e2e/Features/IncidentManagerPagination.spec.ts",
"playwright/e2e/Features/IngestionListNameSorting.spec.ts",
"playwright/e2e/Features/Pagination.spec.ts",
"playwright/e2e/Features/QueryEntity.spec.ts",
"playwright/e2e/Features/Table.spec.ts",
"playwright/e2e/Flow/UsersPagination.spec.ts",
"playwright/e2e/Pages/DataContracts.spec.ts",
"playwright/e2e/Pages/TestSuite.spec.ts",
"playwright/e2e/Search/ExploreSearchCounts.spec.ts"
]
},
{
"sources": [
"openmetadata-ui/src/main/resources/ui/src/components/Pipeline/Execution/Execution.component.tsx"
Expand Down Expand Up @@ -8730,8 +8717,13 @@
"openmetadata-ui/src/main/resources/ui/src/components/SettingsSso/SSOConfigurationForm/SSOConfigurationForm.tsx"
],
"specs": [
"playwright/e2e/Features/ContextCenterDashboard.spec.ts",
"playwright/e2e/Features/ContextCenterDocument.spec.ts",
"playwright/e2e/Features/ContextCenterPermission.spec.ts",
"playwright/e2e/Features/ProfileSsoSettings.spec.ts",
"playwright/e2e/Features/SSOConfiguration.spec.ts"
"playwright/e2e/Features/SSOConfiguration.spec.ts",
"playwright/e2e/Pages/DataContracts.spec.ts",
"playwright/e2e/Pages/ODCSImportExport.spec.ts"
]
},
{
Expand Down Expand Up @@ -8816,7 +8808,9 @@
],
"specs": [
"playwright/e2e/Features/BulkImport.spec.ts",
"playwright/e2e/Features/BulkImportWithDotInName.spec.ts"
"playwright/e2e/Features/BulkImportWithDotInName.spec.ts",
"playwright/e2e/Features/ClassificationImportExport.spec.ts",
"playwright/e2e/Features/MetricBulkImportExportEdit.spec.ts"
]
},
{
Expand Down Expand Up @@ -9834,6 +9828,7 @@
],
"specs": [
"playwright/e2e/Features/TeamsDragAndDrop.spec.ts",
"playwright/e2e/Pages/Entity.spec.ts",
"playwright/e2e/Pages/ServiceListing.spec.ts"
]
},
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* Copyright 2025 Collate.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import { fireEvent, render, screen } from '@testing-library/react';
import { describe, expect, it } from 'vitest';
import {
Accordion,
AccordionHeader,
AccordionItem,
AccordionPanel,
} from './accordion';

describe('AccordionPanel', () => {
it('keeps validation fields mounted while collapsed', () => {
render(
<Accordion>
<AccordionItem id="advanced">
<AccordionHeader>Advanced</AccordionHeader>
<AccordionPanel>
<input aria-label="Token validity" defaultValue="3600" />
</AccordionPanel>
</AccordionItem>
</Accordion>
);

expect(screen.getByLabelText('Token validity')).toBeInTheDocument();
fireEvent.click(screen.getByRole('button', { name: 'Advanced' }));
fireEvent.change(screen.getByLabelText('Token validity'), {
target: { value: '7200' },
});
fireEvent.click(screen.getByRole('button', { name: 'Advanced' }));
fireEvent.click(screen.getByRole('button', { name: 'Advanced' }));
expect(screen.getByLabelText('Token validity')).toHaveValue('7200');
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
* Copyright 2026 Collate.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { fireEvent, render, screen } from '@testing-library/react';
import { RouterProvider } from 'react-aria-components';
import { describe, expect, it, vi } from 'vitest';
import { NavItemButton } from './nav-item-button';

const Icon = () => <svg />;

const renderButton = (navigate = vi.fn(), onClick = vi.fn()) => {
render(
<RouterProvider navigate={navigate}>
<NavItemButton
href="/settings"
icon={Icon}
label="Settings"
onClick={onClick}
/>
</RouterProvider>
);

return { navigate, onClick, link: screen.getByRole('link') };
};

describe('NavItemButton', () => {
it('navigates through the client router instead of reloading the page', () => {
const { navigate, onClick, link } = renderButton();

const notPrevented = fireEvent.click(link);

expect(onClick).toHaveBeenCalled();
expect(navigate).toHaveBeenCalledWith('/settings', undefined);
expect(notPrevented).toBe(false);
});

it('leaves modified clicks to the browser', () => {
const { navigate, link } = renderButton();

fireEvent.click(link, { metaKey: true });

expect(navigate).not.toHaveBeenCalled();
});
});
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type { FC, MouseEventHandler } from 'react';
import { shouldClientNavigate, useRouter } from '@react-aria/utils';
import type { FC, MouseEvent, MouseEventHandler } from 'react';
import { Pressable } from 'react-aria-components';
import { Tooltip } from '@/components/base/tooltip/tooltip';
import { cx } from '@/utils/cx';
Expand Down Expand Up @@ -45,20 +46,39 @@ export const NavItemButton = ({
tooltipPlacement = 'right',
onClick,
}: NavItemButtonProps) => {
const router = useRouter();

// A plain anchor would reload the whole app; under a RouterProvider, hand
// same-tab clicks to the client router the way react-aria's Link does.
const handleClick = (event: MouseEvent<HTMLAnchorElement>) => {
onClick?.(event);
if (
href &&
!event.defaultPrevented &&
!router.isNative &&
shouldClientNavigate(event.currentTarget, event)
) {
event.preventDefault();
router.open(event.currentTarget, event, href, undefined);
}
};

return (
<Tooltip placement={tooltipPlacement} title={label}>
<Pressable>
<a
aria-label={label}
className={cx(
'tw:relative tw:flex tw:w-full tw:cursor-pointer tw:items-center tw:justify-center tw:rounded-md tw:bg-primary tw:dark:bg-transparent tw:p-2 tw:text-fg-quaternary tw:outline-focus-ring tw:transition tw:duration-100 tw:ease-linear tw:select-none tw:hover:bg-primary_hover tw:hover:text-fg-quaternary_hover tw:focus-visible:z-10 tw:focus-visible:outline-2 tw:focus-visible:outline-offset-2',
// Same current-page treatment as the expanded NavItemBase, so the
// collapsed rail still shows where the user is.
current &&
'tw:bg-active tw:text-fg-quaternary_hover tw:hover:bg-secondary_hover',
'tw:bg-brand-primary_alt tw:text-fg-brand-secondary_alt tw:hover:bg-brand-primary_alt tw:hover:text-fg-brand-secondary_alt',
styles[size].root,
className
)}
href={href}
onClick={onClick}>
onClick={handleClick}>
<Icon
aria-hidden="true"
className={cx(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { render, screen } from '@testing-library/react';
import { describe, expect, it } from 'vitest';
import { fireEvent, render, screen, within } from '@testing-library/react';
import { beforeAll, describe, expect, it, vi } from 'vitest';
import { DateRangePicker } from './date-range-picker';

describe('DateRangePicker trigger', () => {
Expand Down Expand Up @@ -42,3 +42,86 @@ describe('DateRangePicker trigger', () => {
expect(trigger).not.toHaveClass('tw:justify-center');
});
});

describe('DateRangePicker apply', () => {
beforeAll(() => {
// jsdom has no matchMedia; the range calendar asks for the breakpoint.
vi.stubGlobal('matchMedia', () => ({
matches: true,
addEventListener: vi.fn(),
removeEventListener: vi.fn(),
}));
});

it('passes the clicked preset key to onApply', () => {
const onApply = vi.fn();
render(<DateRangePicker onApply={onApply} />);

fireEvent.click(screen.getByRole('button'));
fireEvent.click(screen.getByRole('button', { name: 'Last month' }));
fireEvent.click(screen.getByRole('button', { name: 'Apply' }));

expect(onApply).toHaveBeenCalledWith('lastMonth');
});

it('passes no key when the preset was cancelled', () => {
const onApply = vi.fn();
render(<DateRangePicker onApply={onApply} />);

fireEvent.click(screen.getByRole('button'));
fireEvent.click(screen.getByRole('button', { name: 'Last month' }));
fireEvent.click(screen.getByRole('button', { name: 'Cancel' }));
fireEvent.click(screen.getByRole('button'));
fireEvent.click(screen.getByRole('button', { name: 'Apply' }));

expect(onApply).toHaveBeenCalledWith(undefined);
});
});

describe('DateRangePicker apply on small screens', () => {
beforeAll(() => {
// Below the md breakpoint the sidebar presets are hidden and the calendar
// shows its own preset buttons.
vi.stubGlobal('matchMedia', () => ({
matches: false,
addEventListener: vi.fn(),
removeEventListener: vi.fn(),
}));
});

it('passes the preset key picked in the calendar to onApply', () => {
const onApply = vi.fn();
render(<DateRangePicker onApply={onApply} />);
fireEvent.click(screen.getByRole('button'));
fireEvent.click(
within(screen.getByRole('application')).getByRole('button', {
name: 'Last month',
})
);
fireEvent.click(screen.getByRole('button', { name: 'Apply' }));

expect(onApply).toHaveBeenCalledWith('lastMonth');
});
});

describe('DateRangePicker dismiss', () => {
beforeAll(() => {
vi.stubGlobal('matchMedia', () => ({
matches: true,
addEventListener: vi.fn(),
removeEventListener: vi.fn(),
}));
});

it('forgets the preset when the picker is dismissed without Apply', () => {
const onApply = vi.fn();
render(<DateRangePicker onApply={onApply} />);
fireEvent.click(screen.getByRole('button'));
fireEvent.click(screen.getByRole('button', { name: 'Last month' }));
fireEvent.keyDown(screen.getByRole('dialog'), { key: 'Escape' });
fireEvent.click(screen.getByRole('button'));
fireEvent.click(screen.getByRole('button', { name: 'Apply' }));

expect(onApply).toHaveBeenCalledWith(undefined);
});
});
Loading
Loading