From c329d4c26f033ad78b8484c8babcf7991b996772 Mon Sep 17 00:00:00 2001 From: Harshit Shah Date: Mon, 12 Oct 2026 16:52:21 +0530 Subject: [PATCH 01/51] Fixes #6884: migrate display and navigation components to core --- .../application/accordion/accordion.test.tsx | 45 ++ .../slideout-menus/slideout-menu.test.tsx | 36 ++ .../slideout-menus/slideout-menu.tsx | 22 +- .../progress-circles.test.tsx | 33 ++ .../progress-indicators/progress-circles.tsx | 34 +- .../progress-indicators.test.tsx | 24 + .../progress-indicators.tsx | 10 +- .../eslint-rules/openmetadata-antd.test.mjs | 2 +- .../resources/ui/eslint-suppressions.json | 270 ++--------- .../src/main/resources/ui/eslint.config.mjs | 19 + .../ActivityThreadPanel.tsx | 105 +++-- .../AlertRecentEventsTab.tsx | 287 ++++++------ .../alert-recent-events-tab.less | 17 - .../components/AppContainer/AppContainer.tsx | 25 +- .../DataAssetRules.component.tsx | 3 +- .../AssetSelectionContentBody.test.tsx | 41 +- .../AssetSelectionContentBody.tsx | 59 ++- .../ContractSchemaTable/contract-schema.less | 66 --- .../DataInsightProgressBar.test.tsx | 4 +- .../DataInsight/DataInsightProgressBar.tsx | 16 +- .../EntitySummaryProgressBar.component.tsx | 23 +- .../DataInsight/KPILatestResultsV1.test.tsx | 8 +- .../DataInsight/KPILatestResultsV1.tsx | 19 +- .../components/TestCaseFormV1.less | 10 - .../ColumnDetailPanel.component.tsx | 79 ++-- .../ColumnDetailPanel/ColumnDetailPanel.less | 28 -- .../ColumnDetailPanel.test.tsx | 11 +- .../ColumnFilter/ColumnFilter.component.tsx | 31 +- .../QualityTab/QualityTab.component.tsx | 2 +- .../TableProfiler/table-profiler.less | 7 - .../SampleDataWithMessages/MessageCard.tsx | 53 ++- .../SampleDataWithMessages/message-card.less | 16 - .../TableQueryRightPanel.component.tsx | 14 +- .../TableQueries/table-queries.style.less | 4 - .../Entity/EntityLineage/custom-node.less | 20 - .../EntityLineage/entity-lineage.style.less | 5 - .../LineageTab/LineageTabContent.less | 17 - .../SummaryList/SummaryList.component.tsx | 97 ++-- .../SummaryList/summary-list.less | 19 - .../WhatsNewAlert/WhatsNewAlert.component.tsx | 6 +- .../GithubStarCard.component.tsx | 6 +- .../LeftSidebar/LeftSidebar.component.tsx | 320 +++++++++---- .../LeftSidebar/LeftSidebarItem.component.tsx | 12 +- .../MyData/LeftSidebar/left-sidebar.less | 281 +----------- .../CuratedAssetsWidget.tsx | 11 +- .../ui/src/components/NavBar/NavBar.tsx | 39 +- .../ui/src/components/NavBar/nav-bar.less | 33 -- .../NotificationBox.component.tsx | 50 ++- .../NotificationFeedCard.component.tsx | 54 ++- .../NotificationBox/notification-box.less | 13 +- .../PageHeader/PageHeader.component.tsx | 11 +- .../PaginationComponent.test.tsx | 50 +++ .../PaginationComponent.tsx | 105 +++-- .../TreeView/TreeViewTab.component.tsx | 59 ++- .../Execution/TreeView/tree-view-tab.less | 11 - ...rofileSectionUserDetailsCard.component.tsx | 15 +- .../ProfileSectionUserDetailsCard.test.tsx | 4 +- .../EntitySearchSettings.tsx | 290 ++++++------ .../entity-search-settings.less | 28 -- .../FieldConfiguration/FieldConfiguration.tsx | 254 ++++++----- .../field-configuration.less | 15 - .../AgentsStatusWidget/AgentsStatusWidget.tsx | 149 +++--- .../agents-status-widget.less | 2 +- .../ServiceInsights/service-insights-tab.less | 33 -- .../Applications/AppDetails/app-details.less | 33 +- .../AppInstallVerifyCard.component.tsx | 30 +- .../AppLogsViewer/AppLogsViewer.component.tsx | 61 +-- .../AppLogsViewer/AppLogsViewer.test.tsx | 15 +- .../AppLogsViewer/AppLogsViewer.utils.test.ts | 27 ++ .../AppLogsViewer/AppLogsViewer.utils.ts | 24 + .../ReindexFailures.component.tsx | 138 +++--- .../AppRunsHistory.merge.test.tsx | 20 +- .../AppRunsHistory/AppRunsHistory.test.tsx | 12 +- .../AppScreenshots.test.tsx | 92 ++++ .../MarketPlaceAppDetails/AppScreenshots.tsx | 106 +++++ .../MarketPlaceAppDetails.component.tsx | 38 +- .../Ingestion/AddIngestionButton.interface.ts | 4 +- .../IngestionStepper.component.tsx | 41 +- .../ingestion-stepper.style.less | 5 - .../SettingItemCard.component.tsx | 8 +- .../Team/TeamDetails/TeamDetailsV1.tsx | 18 +- .../Settings/Team/TeamDetails/teams.less | 23 - .../TeamsSelectable/TeamsSelectable.test.tsx | 5 +- .../Team/TeamsSelectable/TeamsSelectable.tsx | 7 +- .../TeamsSelectable/TeamsSelectableNew.tsx | 7 +- .../AdminPermissionDebugger.component.tsx | 7 +- .../UserProfileIcon.component.tsx | 12 +- .../UserProfileIcon/UserProfileIcon.test.tsx | 3 +- .../UserPermissions.component.tsx | 92 ++-- .../UserPermissions.style.less | 10 - .../UserProfileImage.component.tsx | 6 +- .../SSOGroupedFieldTemplate.tsx | 66 +-- .../sso-grouped-field-template.less | 24 - .../TopicSchema/TopicSchema.interface.tsx | 2 +- .../common/CollapseHeader/CollapseHeader.tsx | 7 +- .../EntityImport/EntityImport.component.tsx | 10 +- .../common/ErrorBoundary/ErrorFallback.tsx | 12 +- .../common/FilterPattern/FilterPattern.tsx | 10 +- .../components/common/Form/FormItemLabel.tsx | 14 +- .../ObjectFieldTemplate.test.tsx | 14 +- .../ObjectFieldTemplate.tsx | 48 +- .../object-field-template.less | 14 - .../ManifestJsonWidget/ManifestJsonWidget.tsx | 12 +- .../common/LimitBanner/LimitBanner.tsx | 5 +- .../SummaryCard/SummaryCard.component.tsx | 33 +- .../common/SummaryCard/SummaryCard.test.tsx | 14 +- .../SummaryCard/summary-card.style.less | 55 --- .../TableDataCardV2/TableDataCardV2.tsx | 11 +- .../common/TabsLabel/TabsLabel.component.tsx | 12 +- .../ui/src/interface/sidebar.interface.ts | 7 + .../ui/src/interface/tree.interface.ts | 21 + .../ui/src/locale/languages/ar-sa.json | 4 + .../ui/src/locale/languages/de-de.json | 4 + .../ui/src/locale/languages/en-us.json | 4 + .../ui/src/locale/languages/es-es.json | 4 + .../ui/src/locale/languages/fr-fr.json | 4 + .../ui/src/locale/languages/gl-es.json | 4 + .../ui/src/locale/languages/he-he.json | 4 + .../ui/src/locale/languages/ja-jp.json | 4 + .../ui/src/locale/languages/ko-kr.json | 4 + .../ui/src/locale/languages/mr-in.json | 4 + .../ui/src/locale/languages/nl-nl.json | 4 + .../ui/src/locale/languages/pr-pr.json | 4 + .../ui/src/locale/languages/pt-br.json | 4 + .../ui/src/locale/languages/pt-pt.json | 4 + .../ui/src/locale/languages/ru-ru.json | 4 + .../ui/src/locale/languages/sv-se.json | 4 + .../ui/src/locale/languages/th-th.json | 4 + .../ui/src/locale/languages/tr-tr.json | 4 + .../ui/src/locale/languages/zh-cn.json | 4 + .../ui/src/locale/languages/zh-tw.json | 4 + .../appearance-config-settings-page.less | 10 - .../src/pages/AuditLogsPage/AuditLogsPage.tsx | 12 +- .../DataInsightPage/DataInsightClassBase.ts | 2 +- .../DataInsightLeftPanel.test.tsx | 13 +- .../DataInsightLeftPanel.tsx | 52 +-- .../pages/DataInsightPage/data-insight.less | 27 +- .../bulk-entity-import-page.less | 10 - .../LearningResourceForm.component.tsx | 382 ++++++++-------- .../learning-resource-form.less | 19 - .../PersonaDetailsPage/PersonaDetailsPage.tsx | 2 +- .../ProfilerConfigurationPage.tsx | 424 +++++++++--------- .../profiler-configuration-page.style.less | 29 -- .../SearchSettingsPage/SearchSettingsPage.tsx | 132 +++--- .../SearchSettingsPage/search-settings.less | 45 -- .../SettingsNavigationPage.test.tsx | 24 +- .../SettingsNavigationPage.tsx | 167 ++++--- .../settings-navigation-page.less | 79 ---- .../TableConstraintsModal.component.tsx | 13 +- .../TaskFormSettingsPage.tsx | 21 +- .../components/TaskFormBuilderSection.tsx | 35 +- .../src/main/resources/ui/src/styles/app.less | 38 +- .../ui/src/styles/components/drawer.less | 47 -- .../ui/src/styles/components/menu.less | 12 - .../ui/src/styles/components/pagination.less | 58 +-- .../ui/src/styles/components/step.less | 104 ----- .../ui/src/utils/Alerts/AlertsUtil.tsx | 9 +- .../ui/src/utils/Alerts/alerts-util.less | 17 - .../CustomizeNavigation.ts | 30 +- .../src/utils/EntitySummaryPanelUtilsV1.tsx | 3 +- .../ui/src/utils/EntityUtilClassBase.ts | 2 +- .../ui/src/utils/KnowledgePagePureUtils.ts | 8 +- .../ui/src/utils/ServiceUtilClassBase.ts | 4 +- .../SettingsNavigationPageUtils.test.tsx | 49 +- .../src/utils/SettingsNavigationPageUtils.tsx | 68 ++- .../ui/src/utils/TestCaseUtils.test.tsx | 2 +- .../resources/ui/src/utils/TestCaseUtils.tsx | 2 +- .../resources/ui/src/utils/executionUtils.tsx | 8 +- .../main/resources/ui/src/utils/formUtils.tsx | 6 +- 169 files changed, 3278 insertions(+), 3434 deletions(-) create mode 100644 openmetadata-ui-core-components/src/main/resources/ui/src/components/application/accordion/accordion.test.tsx create mode 100644 openmetadata-ui-core-components/src/main/resources/ui/src/components/application/slideout-menus/slideout-menu.test.tsx create mode 100644 openmetadata-ui-core-components/src/main/resources/ui/src/components/base/progress-indicators/progress-circles.test.tsx create mode 100644 openmetadata-ui-core-components/src/main/resources/ui/src/components/base/progress-indicators/progress-indicators.test.tsx create mode 100644 openmetadata-ui/src/main/resources/ui/src/components/PaginationComponent/PaginationComponent.test.tsx create mode 100644 openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/AppLogsViewer.utils.test.ts create mode 100644 openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/AppLogsViewer.utils.ts create mode 100644 openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/MarketPlaceAppDetails/AppScreenshots.test.tsx create mode 100644 openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/MarketPlaceAppDetails/AppScreenshots.tsx create mode 100644 openmetadata-ui/src/main/resources/ui/src/interface/tree.interface.ts delete mode 100644 openmetadata-ui/src/main/resources/ui/src/pages/SettingsNavigationPage/settings-navigation-page.less diff --git a/openmetadata-ui-core-components/src/main/resources/ui/src/components/application/accordion/accordion.test.tsx b/openmetadata-ui-core-components/src/main/resources/ui/src/components/application/accordion/accordion.test.tsx new file mode 100644 index 000000000000..4aa0de629d0b --- /dev/null +++ b/openmetadata-ui-core-components/src/main/resources/ui/src/components/application/accordion/accordion.test.tsx @@ -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( + + + Advanced + + + + + + ); + + 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'); + }); +}); diff --git a/openmetadata-ui-core-components/src/main/resources/ui/src/components/application/slideout-menus/slideout-menu.test.tsx b/openmetadata-ui-core-components/src/main/resources/ui/src/components/application/slideout-menus/slideout-menu.test.tsx new file mode 100644 index 000000000000..40a595fe8603 --- /dev/null +++ b/openmetadata-ui-core-components/src/main/resources/ui/src/components/application/slideout-menus/slideout-menu.test.tsx @@ -0,0 +1,36 @@ +/* + * 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 { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; +import { SlideoutMenu } from './slideout-menu'; + +describe('SlideoutMenu', () => { + it('labels the dialog from its header and respects custom close controls', () => { + render( + + + Reindex failures + + Details + + ); + + expect( + screen.getByRole('dialog', { name: 'Reindex failures' }) + ).toBeInTheDocument(); + expect( + screen.queryByRole('button', { name: /close/i }) + ).not.toBeInTheDocument(); + }); +}); diff --git a/openmetadata-ui-core-components/src/main/resources/ui/src/components/application/slideout-menus/slideout-menu.tsx b/openmetadata-ui-core-components/src/main/resources/ui/src/components/application/slideout-menus/slideout-menu.tsx index 241fa16043cd..8d8e18608828 100644 --- a/openmetadata-ui-core-components/src/main/resources/ui/src/components/application/slideout-menus/slideout-menu.tsx +++ b/openmetadata-ui-core-components/src/main/resources/ui/src/components/application/slideout-menus/slideout-menu.tsx @@ -83,6 +83,7 @@ interface SlideoutMenuProps extends Omit, RefAttributes { 'aria-label'?: string; + 'aria-labelledby'?: string; children: | ReactNode | ((children: AriaModalRenderProps & { close: () => void }) => ReactNode); @@ -92,6 +93,7 @@ interface SlideoutMenuProps const Menu = ({ 'aria-label': ariaLabel, + 'aria-labelledby': ariaLabelledBy, children, dialogClassName, width, @@ -109,7 +111,10 @@ const Menu = ({ } style={width !== undefined ? { maxWidth: width } : undefined}> {(state) => ( - + {({ close }) => { return typeof children === 'function' ? children({ ...state, close }) @@ -139,12 +144,15 @@ Content.displayName = 'SlideoutContent'; interface SlideoutHeaderProps extends ComponentPropsWithRef<'header'> { onClose?: () => void; + /** Omit the built-in close control when the caller already supplies one. */ + showCloseButton?: boolean; } const Header = ({ className, children, onClose, + showCloseButton = true, ...props }: SlideoutHeaderProps) => { return ( @@ -155,11 +163,13 @@ const Header = ({ className )}> {children} - + {showCloseButton && ( + + )} ); }; diff --git a/openmetadata-ui-core-components/src/main/resources/ui/src/components/base/progress-indicators/progress-circles.test.tsx b/openmetadata-ui-core-components/src/main/resources/ui/src/components/base/progress-indicators/progress-circles.test.tsx new file mode 100644 index 000000000000..9d4f9239ec9b --- /dev/null +++ b/openmetadata-ui-core-components/src/main/resources/ui/src/components/base/progress-indicators/progress-circles.test.tsx @@ -0,0 +1,33 @@ +/* + * Copyright 2023 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 { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; +import { ProgressBarCircle } from './progress-circles'; + +describe('ProgressBarCircle', () => { + it('preserves status colors on the circle and value', () => { + const { container } = render( + + ); + + expect(container.querySelectorAll('circle')[1]).toHaveClass( + 'tw:stroke-fg-success-primary' + ); + expect(screen.getByText('25%')).toHaveClass('tw:text-success-primary'); + expect(screen.getByRole('progressbar')).toHaveAttribute( + 'aria-valuenow', + '25' + ); + }); +}); diff --git a/openmetadata-ui-core-components/src/main/resources/ui/src/components/base/progress-indicators/progress-circles.tsx b/openmetadata-ui-core-components/src/main/resources/ui/src/components/base/progress-indicators/progress-circles.tsx index 356fca9aebe1..e25661542fdf 100644 --- a/openmetadata-ui-core-components/src/main/resources/ui/src/components/base/progress-indicators/progress-circles.tsx +++ b/openmetadata-ui-core-components/src/main/resources/ui/src/components/base/progress-indicators/progress-circles.tsx @@ -6,12 +6,34 @@ interface ProgressBarProps { max?: number; size: 'xxs' | 'xs' | 'sm' | 'md' | 'lg'; label?: string; + /** Status colors belong to the data, independently of the default brand treatment. */ + color?: 'brand' | 'success' | 'error' | 'warning' | 'purple'; valueFormatter?: ( value: number, valueInPercentage: number ) => string | number; } +const colors = sortCx({ + brand: { stroke: 'tw:stroke-fg-brand-primary', text: 'tw:text-primary' }, + success: { + stroke: 'tw:stroke-fg-success-primary', + text: 'tw:text-success-primary', + }, + error: { + stroke: 'tw:stroke-fg-error-primary', + text: 'tw:text-error-primary', + }, + warning: { + stroke: 'tw:stroke-fg-warning-primary', + text: 'tw:text-warning-primary', + }, + purple: { + stroke: 'tw:stroke-utility-purple-500', + text: 'tw:text-utility-purple-500', + }, +}); + const sizes = sortCx({ xxs: { strokeWidth: 6, @@ -57,6 +79,7 @@ export const ProgressBarCircle = ({ size, label, valueFormatter, + color = 'brand', }: ProgressBarProps) => { const percentage = Math.round(((value - min) * 100) / (max - min)); @@ -71,7 +94,9 @@ export const ProgressBarCircle = ({ const cx = diameter / 2; const cy = diameter / 2; - const textPosition = label ? 'absolute text-center' : 'absolute text-primary'; + const textPosition = label + ? 'tw:absolute tw:text-center' + : 'tw:absolute tw:text-primary'; const strokeDashoffset = 100 - percentage; return ( @@ -102,7 +127,7 @@ export const ProgressBarCircle = ({ {/* Foreground circle */}
{label}
-
+
{valueFormatter ? valueFormatter(value, percentage) : `${percentage}%`}
) : ( - + {valueFormatter ? valueFormatter(value, percentage) : `${percentage}%`} @@ -139,6 +164,7 @@ export const ProgressBarCircle = ({ export const ProgressBarHalfCircle = ({ value, + color = 'brand', min = 0, max = 100, size, diff --git a/openmetadata-ui-core-components/src/main/resources/ui/src/components/base/progress-indicators/progress-indicators.test.tsx b/openmetadata-ui-core-components/src/main/resources/ui/src/components/base/progress-indicators/progress-indicators.test.tsx new file mode 100644 index 000000000000..c3cd9933f8d2 --- /dev/null +++ b/openmetadata-ui-core-components/src/main/resources/ui/src/components/base/progress-indicators/progress-indicators.test.tsx @@ -0,0 +1,24 @@ +/* + * 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 { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; +import { ProgressBar } from './progress-indicators'; + +describe('ProgressBar', () => { + it('retains chart-series colors through the labeled component', () => { + render(); + expect(screen.getByRole('progressbar')).toHaveAttribute('aria-valuenow', '42'); + expect(screen.getByRole('progressbar').firstElementChild).toHaveStyle({ backgroundColor: '#123456' }); + expect(screen.getByText('42%')).toBeInTheDocument(); + }); +}); diff --git a/openmetadata-ui-core-components/src/main/resources/ui/src/components/base/progress-indicators/progress-indicators.tsx b/openmetadata-ui-core-components/src/main/resources/ui/src/components/base/progress-indicators/progress-indicators.tsx index 5e99dd45911e..a13f11aa9010 100644 --- a/openmetadata-ui-core-components/src/main/resources/ui/src/components/base/progress-indicators/progress-indicators.tsx +++ b/openmetadata-ui-core-components/src/main/resources/ui/src/components/base/progress-indicators/progress-indicators.tsx @@ -5,6 +5,8 @@ export interface ProgressBarProps { * The current value of the progress bar. */ value: number; + /** Chart-series color; omitted bars use the semantic brand color. */ + color?: string; /** * The minimum value of the progress bar. * @default 0 @@ -38,6 +40,7 @@ export interface ProgressBarProps { */ export const ProgressBarBase = ({ value, + color, min = 0, max = 100, className, @@ -61,7 +64,10 @@ export const ProgressBarBase = ({ 'tw:size-full tw:rounded-md tw:bg-fg-brand-primary tw:transition tw:duration-75 tw:ease-linear', progressClassName )} - style={{ transform: `translateX(-${100 - percentage}%)` }} + style={{ + backgroundColor: color, + transform: `translateX(-${100 - percentage}%)`, + }} /> ); @@ -89,6 +95,7 @@ export interface ProgressIndicatorWithTextProps extends ProgressBarProps { */ export const ProgressBar = ({ value, + color, min = 0, max = 100, valueFormatter, @@ -104,6 +111,7 @@ export const ProgressBar = ({ const baseProgressBar = ( { // Exact, so re-running --suppress-rule cannot quietly absorb new antd usage. // Lower this when a PR removes antd imports and prunes the baseline. - const EXPECTED_SUPPRESSED_ANTD_SYMBOLS = 723; + const EXPECTED_SUPPRESSED_ANTD_SYMBOLS = 615; const suppressedSymbols = Object.values(suppressions).reduce( (total, rules) => total + (rules['openmetadata-antd/no-antd-import']?.count ?? 0), diff --git a/openmetadata-ui/src/main/resources/ui/eslint-suppressions.json b/openmetadata-ui/src/main/resources/ui/eslint-suppressions.json index e327ebbd9333..9b9eac9cb9e7 100644 --- a/openmetadata-ui/src/main/resources/ui/eslint-suppressions.json +++ b/openmetadata-ui/src/main/resources/ui/eslint-suppressions.json @@ -833,21 +833,11 @@ "count": 3 } }, - "src/components/ActivityFeed/ActivityThreadPanel/ActivityThreadPanel.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, "src/components/ActivityFeed/ActivityThreadPanel/ActivityThreadPanelBody.tsx": { "openmetadata-antd/no-antd-import": { "count": 1 } }, - "src/components/ActivityFeed/Shared/AnnouncementBadge.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, "src/components/ActivityFeed/TaskFeedCard/TaskFeedCardFromTask.component.tsx": { "openmetadata-antd/no-antd-import": { "count": 4 @@ -863,11 +853,6 @@ "count": 1 } }, - "src/components/Alerts/AlertDetails/AlertRecentEventsTab/AlertRecentEventsTab.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, "src/components/Alerts/AlertFormSourceItem/AlertFormSourceItem.test.tsx": { "openmetadata-antd/no-antd-import": { "count": 1 @@ -908,11 +893,6 @@ "count": 1 } }, - "src/components/AppContainer/AppContainer.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, "src/components/AppTour/Tour.tsx": { "openmetadata-antd/no-antd-import": { "count": 1 @@ -930,12 +910,12 @@ }, "src/components/DataAssetRules/DataAssetRules.component.tsx": { "openmetadata-antd/no-antd-import": { - "count": 7 + "count": 6 } }, "src/components/DataAssets/AssetsSelectionModal/AssetSelectionContentBody.tsx": { "openmetadata-antd/no-antd-import": { - "count": 4 + "count": 1 } }, "src/components/DataContract/AddDataContract/AddDataContract.tsx": { @@ -1014,11 +994,6 @@ } }, "src/components/DataInsight/DataInsightProgressBar.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 2 - } - }, - "src/components/DataInsight/EntitySummaryProgressBar.component.tsx": { "openmetadata-antd/no-antd-import": { "count": 1 } @@ -1030,7 +1005,7 @@ }, "src/components/DataInsight/KPILatestResultsV1.tsx": { "openmetadata-antd/no-antd-import": { - "count": 3 + "count": 2 } }, "src/components/DataInsight/TotalEntityInsightSummary.component.tsx": { @@ -1098,16 +1073,6 @@ "count": 2 } }, - "src/components/Database/ColumnDetailPanel/ColumnDetailPanel.component.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, - "src/components/Database/ColumnFilter/ColumnFilter.component.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 3 - } - }, "src/components/Database/Profiler/ProfilerSettings/CustomRangeWidget.tsx": { "openmetadata-antd/no-antd-import": { "count": 2 @@ -1135,7 +1100,7 @@ }, "src/components/Database/Profiler/TableProfiler/QualityTab/QualityTab.component.tsx": { "openmetadata-antd/no-antd-import": { - "count": 3 + "count": 2 } }, "src/components/Database/SampleDataTable/SampleDataTable.component.tsx": { @@ -1143,11 +1108,6 @@ "count": 1 } }, - "src/components/Database/SampleDataWithMessages/MessageCard.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, "src/components/Database/SchemaTable/SchemaTable.component.tsx": { "openmetadata-antd/no-antd-import": { "count": 2 @@ -1175,7 +1135,7 @@ }, "src/components/Database/TableQueries/TableQueryRightPanel/TableQueryRightPanel.component.tsx": { "openmetadata-antd/no-antd-import": { - "count": 2 + "count": 1 } }, "src/components/Entity/EntityHeaderTitle/EntityHeaderTitle.component.tsx": { @@ -1238,11 +1198,6 @@ "count": 1 } }, - "src/components/Explore/EntitySummaryPanel/SummaryList/SummaryList.component.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 2 - } - }, "src/components/GlobalSearchBar/GlobalSearchBar.tsx": { "openmetadata-antd/no-antd-import": { "count": 3 @@ -1305,22 +1260,17 @@ }, "src/components/Modals/WhatsNewModal/WhatsNewAlert/WhatsNewAlert.component.tsx": { "openmetadata-antd/no-antd-import": { - "count": 3 + "count": 2 } }, "src/components/MyData/GithubStarCard/GithubStarCard.component.tsx": { "openmetadata-antd/no-antd-import": { - "count": 4 + "count": 3 } }, "src/components/MyData/LeftSidebar/LeftSidebar.component.tsx": { "openmetadata-antd/no-antd-import": { - "count": 6 - } - }, - "src/components/MyData/LeftSidebar/LeftSidebarItem.component.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 + "count": 2 } }, "src/components/MyData/Persona/AddEditPersona/AddEditPersona.component.tsx": { @@ -1340,12 +1290,12 @@ }, "src/components/NavBar/NavBar.tsx": { "openmetadata-antd/no-antd-import": { - "count": 5 + "count": 2 } }, "src/components/NotificationBox/NotificationBox.component.tsx": { "openmetadata-antd/no-antd-import": { - "count": 4 + "count": 2 } }, "src/components/NotificationBox/NotificationBox.utils.tsx": { @@ -1353,31 +1303,11 @@ "count": 1 } }, - "src/components/NotificationBox/NotificationFeedCard.component.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, - "src/components/PageHeader/PageHeader.component.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, - "src/components/PaginationComponent/PaginationComponent.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 4 - } - }, "src/components/Pipeline/Execution/Execution.component.tsx": { "openmetadata-antd/no-antd-import": { "count": 3 } }, - "src/components/Pipeline/Execution/TreeView/TreeViewTab.component.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 2 - } - }, "src/components/Pipeline/PipelineTaskTab/PipelineTaskTab.tsx": { "openmetadata-antd/no-antd-import": { "count": 1 @@ -1385,17 +1315,17 @@ }, "src/components/ProfileCard/ProfileSectionUserDetailsCard.component.tsx": { "openmetadata-antd/no-antd-import": { - "count": 4 + "count": 3 } }, "src/components/SearchSettings/EntitySeachSettings/EntitySearchSettings.tsx": { "openmetadata-antd/no-antd-import": { - "count": 4 + "count": 3 } }, "src/components/SearchSettings/FieldConfiguration/FieldConfiguration.tsx": { "openmetadata-antd/no-antd-import": { - "count": 6 + "count": 4 } }, "src/components/SearchSettings/FieldValueBoostList/FieldValueBoostList.tsx": { @@ -1423,11 +1353,6 @@ "count": 4 } }, - "src/components/ServiceInsights/AgentsStatusWidget/AgentsStatusWidget.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, "src/components/Settings/Alerts/AlertsDetails/AlertDetails.component.tsx": { "openmetadata-antd/no-antd-import": { "count": 1 @@ -1440,17 +1365,17 @@ }, "src/components/Settings/Applications/AppInstallVerifyCard/AppInstallVerifyCard.component.tsx": { "openmetadata-antd/no-antd-import": { - "count": 6 + "count": 4 } }, "src/components/Settings/Applications/AppLogsViewer/AppLogsViewer.component.tsx": { "openmetadata-antd/no-antd-import": { - "count": 4 + "count": 2 } }, "src/components/Settings/Applications/AppLogsViewer/ReindexFailures.component.tsx": { "openmetadata-antd/no-antd-import": { - "count": 2 + "count": 1 } }, "src/components/Settings/Applications/AppRunsHistory/AppRunsHistory.component.tsx": { @@ -1458,11 +1383,6 @@ "count": 2 } }, - "src/components/Settings/Applications/AppRunsHistory/AppRunsHistory.test.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, "src/components/Settings/Applications/AppSchedule/AppSchedule.component.tsx": { "openmetadata-antd/no-antd-import": { "count": 2 @@ -1475,7 +1395,7 @@ }, "src/components/Settings/Applications/MarketPlaceAppDetails/MarketPlaceAppDetails.component.tsx": { "openmetadata-antd/no-antd-import": { - "count": 4 + "count": 2 } }, "src/components/Settings/Bot/BotDetails/AuthMechanism.tsx": { @@ -1513,21 +1433,11 @@ "count": 4 } }, - "src/components/Settings/Services/Ingestion/AddIngestionButton.interface.ts": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, "src/components/Settings/Services/Ingestion/IngestionPipelineList/IngestionPipelineList.component.tsx": { "openmetadata-antd/no-antd-import": { "count": 1 } }, - "src/components/Settings/Services/Ingestion/IngestionStepper/IngestionStepper.component.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, "src/components/Settings/Services/Ingestion/IngestionWorkflowForm/IngestionWorkflowForm.tsx": { "openmetadata-antd/no-antd-import": { "count": 1 @@ -1540,12 +1450,12 @@ }, "src/components/Settings/SettingItemCard/SettingItemCard.component.tsx": { "openmetadata-antd/no-antd-import": { - "count": 2 + "count": 1 } }, "src/components/Settings/Team/TeamDetails/TeamDetailsV1.tsx": { "openmetadata-antd/no-antd-import": { - "count": 4 + "count": 2 } }, "src/components/Settings/Team/TeamDetails/TeamHierarchy.tsx": { @@ -1575,17 +1485,17 @@ }, "src/components/Settings/Team/TeamsSelectable/TeamsSelectable.tsx": { "openmetadata-antd/no-antd-import": { - "count": 2 + "count": 1 } }, "src/components/Settings/Team/TeamsSelectable/TeamsSelectableNew.tsx": { "openmetadata-antd/no-antd-import": { - "count": 2 + "count": 1 } }, "src/components/Settings/Users/AdminPermissionDebugger/AdminPermissionDebugger.component.tsx": { "openmetadata-antd/no-antd-import": { - "count": 6 + "count": 5 } }, "src/components/Settings/Users/ChangePasswordForm.tsx": { @@ -1598,21 +1508,6 @@ "count": 8 } }, - "src/components/Settings/Users/UserProfileIcon/UserProfileIcon.component.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, - "src/components/Settings/Users/UsersProfile/UserPermissions/UserPermissions.component.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 2 - } - }, - "src/components/Settings/Users/UsersProfile/UserProfileImage/UserProfileImage.component.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, "src/components/Settings/Users/UsersProfile/UserProfileRoles/UserProfileRoles.component.tsx": { "openmetadata-antd/no-antd-import": { "count": 2 @@ -1650,7 +1545,7 @@ }, "src/components/SettingsSso/SSOGroupedFieldTemplate/SSOGroupedFieldTemplate.tsx": { "openmetadata-antd/no-antd-import": { - "count": 3 + "count": 2 } }, "src/components/TestLibrary/TestDefinitionList/TestDefinitionList.component.tsx": { @@ -1658,11 +1553,6 @@ "count": 1 } }, - "src/components/Topic/TopicSchema/TopicSchema.interface.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, "src/components/UploadFile/UploadFile.interface.ts": { "openmetadata-antd/no-antd-import": { "count": 1 @@ -1725,22 +1615,22 @@ }, "src/components/common/EntityImport/EntityImport.component.tsx": { "openmetadata-antd/no-antd-import": { - "count": 2 + "count": 1 } }, "src/components/common/ErrorBoundary/ErrorFallback.tsx": { "openmetadata-antd/no-antd-import": { - "count": 2 + "count": 1 } }, "src/components/common/FilterPattern/FilterPattern.tsx": { "openmetadata-antd/no-antd-import": { - "count": 2 + "count": 1 } }, "src/components/common/Form/FormItemLabel.tsx": { "openmetadata-antd/no-antd-import": { - "count": 2 + "count": 1 } }, "src/components/common/Form/JSONSchema/JSONSchemaTemplate/ArrayFieldTemplate.tsx": { @@ -1750,7 +1640,7 @@ }, "src/components/common/Form/JSONSchema/JSONSchemaTemplate/ObjectFieldTemplate.tsx": { "openmetadata-antd/no-antd-import": { - "count": 3 + "count": 2 } }, "src/components/common/Form/JSONSchema/JSONSchemaTemplate/WorkflowArrayFieldTemplate.tsx": { @@ -1763,11 +1653,6 @@ "count": 4 } }, - "src/components/common/Form/JSONSchema/JsonSchemaWidgets/ManifestJsonWidget/ManifestJsonWidget.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, "src/components/common/Form/JSONSchema/JsonSchemaWidgets/PasswordWidget.tsx": { "openmetadata-antd/no-antd-import": { "count": 1 @@ -1795,7 +1680,7 @@ }, "src/components/common/LimitBanner/LimitBanner.tsx": { "openmetadata-antd/no-antd-import": { - "count": 2 + "count": 1 } }, "src/components/common/ListView/ListView.component.tsx": { @@ -1843,26 +1728,11 @@ "count": 1 } }, - "src/components/common/SummaryCard/SummaryCard.component.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, "src/components/common/Table/DraggableMenu/DraggableMenuItem.component.tsx": { "openmetadata-antd/no-antd-import": { "count": 3 } }, - "src/components/common/TableDataCardV2/TableDataCardV2.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, - "src/components/common/TabsLabel/TabsLabel.component.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, "src/components/common/TagRenderer/TagRenderer.tsx": { "openmetadata-antd/no-antd-import": { "count": 1 @@ -1950,7 +1820,7 @@ }, "src/pages/AuditLogsPage/AuditLogsPage.tsx": { "openmetadata-antd/no-antd-import": { - "count": 2 + "count": 1 } }, "src/pages/Configuration/EditLoginConfiguration/EditLoginConfigurationPage.tsx": { @@ -1983,21 +1853,11 @@ "count": 3 } }, - "src/pages/DataInsightPage/DataInsightClassBase.ts": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, "src/pages/DataInsightPage/DataInsightHeader/DataInsightHeader.component.tsx": { "openmetadata-antd/no-antd-import": { "count": 1 } }, - "src/pages/DataInsightPage/DataInsightLeftPanel/DataInsightLeftPanel.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 2 - } - }, "src/pages/EmailConfigSettingsPage/EmailConfigSettingsPage.component.tsx": { "openmetadata-antd/no-antd-import": { "count": 2 @@ -2020,7 +1880,7 @@ }, "src/pages/LearningResourcesPage/LearningResourceForm.component.tsx": { "openmetadata-antd/no-antd-import": { - "count": 6 + "count": 5 } }, "src/pages/LineageConfigPage/LineageConfigPage.tsx": { @@ -2055,7 +1915,7 @@ }, "src/pages/Persona/PersonaDetailsPage/PersonaDetailsPage.tsx": { "openmetadata-antd/no-antd-import": { - "count": 3 + "count": 2 } }, "src/pages/Persona/PersonaListPage/PersonaPage.tsx": { @@ -2110,7 +1970,7 @@ }, "src/pages/ProfilerConfigurationPage/ProfilerConfigurationPage.tsx": { "openmetadata-antd/no-antd-import": { - "count": 7 + "count": 6 } }, "src/pages/RolesPage/AddAttributeModal/AddAttributeModal.tsx": { @@ -2135,17 +1995,7 @@ }, "src/pages/SearchSettingsPage/SearchSettingsPage.tsx": { "openmetadata-antd/no-antd-import": { - "count": 4 - } - }, - "src/pages/SettingsNavigationPage/SettingsNavigationPage.test.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, - "src/pages/SettingsNavigationPage/SettingsNavigationPage.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 4 + "count": 3 } }, "src/pages/TableDetailsPageV1/FrequentlyJoinedTables/FrequentlyJoinedTables.component.tsx": { @@ -2165,17 +2015,17 @@ }, "src/pages/TableDetailsPageV1/TableConstraints/TableConstraintsModal/TableConstraintsModal.component.tsx": { "openmetadata-antd/no-antd-import": { - "count": 6 + "count": 5 } }, "src/pages/TaskFormSettingsPage/TaskFormSettingsPage.tsx": { "openmetadata-antd/no-antd-import": { - "count": 7 + "count": 5 } }, "src/pages/TaskFormSettingsPage/components/TaskFormBuilderSection.tsx": { "openmetadata-antd/no-antd-import": { - "count": 8 + "count": 6 } }, "src/pages/TasksPage/shared/DiffViewNew.tsx": { @@ -2195,7 +2045,7 @@ }, "src/utils/Alerts/AlertsUtil.tsx": { "openmetadata-antd/no-antd-import": { - "count": 6 + "count": 4 } }, "src/utils/Alerts/AlertsUtilPure.ts": { @@ -2218,11 +2068,6 @@ "count": 1 } }, - "src/utils/CustomizaNavigation/CustomizeNavigation.ts": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, "src/utils/DataAssetsVersionHeaderUtils.tsx": { "openmetadata-antd/no-antd-import": { "count": 1 @@ -2249,11 +2094,6 @@ } }, "src/utils/EntitySummaryPanelUtilsV1.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 2 - } - }, - "src/utils/EntityUtilClassBase.ts": { "openmetadata-antd/no-antd-import": { "count": 1 } @@ -2268,11 +2108,6 @@ "count": 1 } }, - "src/utils/KnowledgePagePureUtils.ts": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, "src/utils/Lineage/LineageUtils.tsx": { "openmetadata-antd/no-antd-import": { "count": 2 @@ -2298,21 +2133,6 @@ "count": 1 } }, - "src/utils/ServiceUtilClassBase.ts": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, - "src/utils/SettingsNavigationPageUtils.test.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, - "src/utils/SettingsNavigationPageUtils.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, "src/utils/TableColumn.util.tsx": { "openmetadata-antd/no-antd-import": { "count": 1 @@ -2328,24 +2148,14 @@ "count": 2 } }, - "src/utils/TestCaseUtils.test.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, - "src/utils/TestCaseUtils.tsx": { - "openmetadata-antd/no-antd-import": { - "count": 1 - } - }, "src/utils/executionUtils.tsx": { "openmetadata-antd/no-antd-import": { - "count": 2 + "count": 1 } }, "src/utils/formUtils.tsx": { "openmetadata-antd/no-antd-import": { - "count": 8 + "count": 7 } }, "src/utils/mocks/EntitySummaryPanelUtils.mock.tsx": { diff --git a/openmetadata-ui/src/main/resources/ui/eslint.config.mjs b/openmetadata-ui/src/main/resources/ui/eslint.config.mjs index 3addcd107e4a..bb5808c61d43 100644 --- a/openmetadata-ui/src/main/resources/ui/eslint.config.mjs +++ b/openmetadata-ui/src/main/resources/ui/eslint.config.mjs @@ -36,6 +36,25 @@ import omPlaywright from './playwright/eslint-rules/index.mjs'; // antd components with no remaining imports anywhere in src. Add a component // here in the PR that removes its last import (open-metadata/openmetadata-collate#6884). const MIGRATED_ANTD_COMPONENTS = [ + 'Affix', + 'Alert', + 'Avatar', + 'Badge', + 'Carousel', + 'Collapse', + 'Drawer', + 'Empty', + 'Image', + 'Layout', + 'List', + 'Menu', + 'Pagination', + 'Progress', + 'Result', + 'Spin', + 'Steps', + 'Tree', + 'Table', 'Card', 'Col', 'Divider', diff --git a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityThreadPanel/ActivityThreadPanel.tsx b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityThreadPanel/ActivityThreadPanel.tsx index 5040ed1f8d55..a6b23d2639e4 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityThreadPanel/ActivityThreadPanel.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityThreadPanel/ActivityThreadPanel.tsx @@ -11,8 +11,9 @@ * limitations under the License. */ -import { Tabs } from '@openmetadata/ui-core-components'; -import { Drawer } from 'antd'; +import { SlideoutMenu, Tabs } from '@openmetadata/ui-core-components'; +import { DrawerPopupContainerProvider } from '../../common/DrawerPopupContainerProvider/DrawerPopupContainerProvider'; + import classNames from 'classnames'; import { FC, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; @@ -46,51 +47,65 @@ const ActivityThreadPanel: FC = ({ ); }, [initialView]); - useEffect(() => { - document.body.style.overflow = 'hidden'; - }, []); - + // Popup portals belong to the drawer even though they render outside its DOM tree. return ( - + !element.closest('[data-react-aria-top-layer]') + } width={576} - onClose={onCancel}> -
- onTabChange(String(key))}> - - {t('label.task-plural')} - - {t('label.conversation-plural')} - - - - - - - - - -
-
+ onOpenChange={(nextOpen) => { + if (!nextOpen) { + onCancel?.(); + } + }}> + + +
+ onTabChange(String(key))}> + + + {t('label.task-plural')} + + + {t('label.conversation-plural')} + + + + + + + + + +
+
+
+ ); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Alerts/AlertDetails/AlertRecentEventsTab/AlertRecentEventsTab.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Alerts/AlertDetails/AlertRecentEventsTab/AlertRecentEventsTab.tsx index c7556d5981ff..e8e209840bf5 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Alerts/AlertDetails/AlertRecentEventsTab/AlertRecentEventsTab.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Alerts/AlertDetails/AlertRecentEventsTab/AlertRecentEventsTab.tsx @@ -12,6 +12,10 @@ */ import { + Accordion, + AccordionHeader, + AccordionItem, + AccordionPanel, Box, Button, Dropdown, @@ -22,7 +26,7 @@ import { Typography, } from '@openmetadata/ui-core-components'; import { Bell01 } from '@openmetadata/ui-core-components/icons'; -import { Collapse } from 'antd'; + import { AxiosError } from 'axios'; import { isEmpty, isUndefined, startCase } from 'lodash'; import { Key, lazy, useCallback, useEffect, useMemo, useState } from 'react'; @@ -64,8 +68,6 @@ const SchemaEditor = withSuspenseFallback( lazy(() => import('../../../Database/SchemaEditor/SchemaEditor')) ); -const { Panel } = Collapse; - function AlertRecentEventsTab({ alertDetails }: AlertRecentEventsTabProps) { const { t } = useTranslation(); const [filter, setFilter] = useState( @@ -138,18 +140,25 @@ function AlertRecentEventsTab({ alertDetails }: AlertRecentEventsTabProps) { const recentEventsList = useMemo(() => { if (loading) { return ( - + {Array.from( { length: 5 }, (_, index) => `alert-event-skeleton-${index}` ).map((skeletonKey) => ( - } - key={skeletonKey} - /> + id={String(skeletonKey)} + key={skeletonKey}> + + + + {null} + ))} - + ); } @@ -190,148 +199,156 @@ function AlertRecentEventsTab({ alertDetails }: AlertRecentEventsTabProps) { className="layout-column" data-testid="recent-events-list" span={24}> - + {alertRecentEvents?.map((typedEvent) => { // Get the change event data from the typedEvent object const { changeEventData, changeEventDataToDisplay } = getChangeEventDataFromTypedEvent(typedEvent); return ( - + + { + + + + + {/* Display icon for the status of the alert event */} + + {getAlertStatusIcon(typedEvent.status)}{' '} + + + + {/* Display icon for the asset the change event is related to */} + + {searchClassBase.getEntityIcon( + changeEventData.entityType ?? '', + 'h-4 w-4' + )} + + + + {/* Display the change event id */} + + {isEmpty(typedEvent.data) + ? t('label.unreadable-event') + : changeEventData.id} + + + + + + {/* Display the event timestamp */} + + {formatDateTime(typedEvent.timestamp)} + + + + } + + - - - {/* Display icon for the status of the alert event */} - - {getAlertStatusIcon(typedEvent.status)}{' '} - + + {Object.entries(changeEventDataToDisplay).map( + ([key, value]) => + isUndefined(value) ? null : ( + + + + + {`${getLabelsForEventDetails( + key as keyof AlertEventDetailsToDisplay + )}:`} + + + + + {value} + + + + + ) + )} + + + {!isEmpty(changeEventData.changeDescription) && ( + <> + + + {`${t('label.change-entity', { + entity: t('label.description'), + })}:`} + - - {/* Display icon for the asset the change event is related to */} - - {searchClassBase.getEntityIcon( - changeEventData.entityType ?? '', - 'h-4 w-4' + + + /> - - {/* Display the change event id */} - - {isEmpty(typedEvent.data) - ? t('label.unreadable-event') - : changeEventData.id} - - - - - - {/* Display the event timestamp */} - - {formatDateTime(typedEvent.timestamp)} - - + + )} - } - key={`${changeEventData.id}-${changeEventData.timestamp}`}> - - - - {Object.entries(changeEventDataToDisplay).map( - ([key, value]) => - isUndefined(value) ? null : ( - - - - - {`${getLabelsForEventDetails( - key as keyof AlertEventDetailsToDisplay - )}:`} - - - - - {value} - - - - - ) - )} - - - {!isEmpty(changeEventData.changeDescription) && ( - <> - - - {`${t('label.change-entity', { - entity: t('label.description'), - })}:`} - - - - - - - )} - - + + ); })} - + {showPagination && ( diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Alerts/AlertDetails/AlertRecentEventsTab/alert-recent-events-tab.less b/openmetadata-ui/src/main/resources/ui/src/components/Alerts/AlertDetails/AlertRecentEventsTab/alert-recent-events-tab.less index dad71cf22055..cb4c61d8b1b1 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Alerts/AlertDetails/AlertRecentEventsTab/alert-recent-events-tab.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/Alerts/AlertDetails/AlertRecentEventsTab/alert-recent-events-tab.less @@ -1,20 +1,3 @@ /* * Copyright 2024 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. - */ - -.recent-events-collapse.ant-collapse { - background: none; - .ant-collapse-header { - padding: var(--om-space-8) var(--om-space-40) var(--om-space-8) - var(--om-space-12); - } -} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/AppContainer/AppContainer.tsx b/openmetadata-ui/src/main/resources/ui/src/components/AppContainer/AppContainer.tsx index 4fb6406e0875..384fd52a61d2 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/AppContainer/AppContainer.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/AppContainer/AppContainer.tsx @@ -10,7 +10,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Layout } from 'antd'; +import { Box } from '@openmetadata/ui-core-components'; + import classNames from 'classnames'; import { isNil } from 'lodash'; import { useCallback, useEffect } from 'react'; @@ -31,8 +32,6 @@ import NavBar from '../NavBar/NavBar'; import applicationsClassBase from '../Settings/Applications/AppDetails/ApplicationsClassBase'; import './app-container.less'; -const { Content } = Layout; - const AppContainer = () => { const location = useCustomLocation(); const analytics = useAnalytics(); @@ -95,18 +94,18 @@ const AppContainer = () => { }, [location.pathname, analytics]); return ( - + - + })} + direction="row"> {/* Render left side navigation */} {/* Render main content */} - + {/* Render Appbar */} {applicationRoutesClass.isProtectedRoute(location.pathname) && isAuthenticated @@ -114,13 +113,13 @@ const AppContainer = () => { : null} {/* Render main content */} - +
{ApplicationExtras && } - - - - +
+
+
+ ); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataAssetRules/DataAssetRules.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DataAssetRules/DataAssetRules.component.tsx index 1cf8681239fe..a00c4288d821 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataAssetRules/DataAssetRules.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataAssetRules/DataAssetRules.component.tsx @@ -18,7 +18,7 @@ import { Toggle, Typography, } from '@openmetadata/ui-core-components'; -import { Button, Form, Input, Modal, Table } from 'antd'; +import { Button, Form, Input, Modal } from 'antd'; import { FormInstance } from 'antd/es/form/Form'; import { AxiosError } from 'axios'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; @@ -40,6 +40,7 @@ import jsonLogicSearchClassBase from '../../utils/JSONLogicSearchClassBase'; import { showErrorToast, showSuccessToast } from '../../utils/ToastUtils'; import QueryBuilderWidget from '../common/Form/JSONSchema/JsonSchemaWidgets/QueryBuilderWidget/QueryBuilderWidget'; import RichTextEditorPreviewerNew from '../common/RichTextEditor/RichTextEditorPreviewNew'; +import Table from '../common/Table/TableV2'; import { SearchOutputType } from '../Explore/AdvanceSearchProvider/AdvanceSearchProvider.interface'; import './DataAssetRules.less'; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataAssets/AssetsSelectionModal/AssetSelectionContentBody.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DataAssets/AssetsSelectionModal/AssetSelectionContentBody.test.tsx index 442ef1e4fda5..50eb8d801ee6 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataAssets/AssetsSelectionModal/AssetSelectionContentBody.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataAssets/AssetsSelectionModal/AssetSelectionContentBody.test.tsx @@ -10,12 +10,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { fireEvent, render, screen } from '@testing-library/react'; +import { + fireEvent, + render, + screen, + waitFor, + within, +} from '@testing-library/react'; import AssetSelectionContentBody, { AssetSelectionContentBodyProps, } from './AssetSelectionContentBody'; jest.mock('@openmetadata/ui-core-components', () => ({ + Alert: jest.requireActual('@openmetadata/ui-core-components').Alert, + Checkbox: jest.requireActual('@openmetadata/ui-core-components').Checkbox, Box: ({ children, onScroll, @@ -271,6 +279,37 @@ describe('AssetSelectionContentBody', () => { ).toBeInTheDocument(); }); + it('dismisses failed requests and restores the alert for a later failure', async () => { + const failedStatus = { + failedRequest: [{ request: { id: '1' }, message: 'failed' }], + } as never; + const { rerender } = render( + + ); + + fireEvent.click( + within(screen.getByRole('alert')).getByRole('button', { name: /close/i }) + ); + await waitFor(() => + expect(screen.queryByRole('alert')).not.toBeInTheDocument() + ); + + rerender(); + rerender( + + ); + + expect(screen.getByRole('alert')).toHaveTextContent( + 'label.validation-error-plural' + ); + }); + it('should not show validation error alert when failedStatus has no failed requests', () => { render( { const { t } = useTranslation(); + const [isFailureAlertDismissed, setIsFailureAlertDismissed] = useState(false); + const hasFailedRequests = Boolean(failedStatus?.failedRequest?.length); + + // Core alerts are controlled; a later failure must reappear after this one clears. + useEffect(() => { + if (!hasFailedRequests) { + setIsFailureAlertDismissed(false); + } + }, [hasFailedRequests]); return ( @@ -104,7 +116,7 @@ const AssetSelectionHeader = ({ )} {infoBannerText && ( - + )}
@@ -143,16 +155,12 @@ const AssetSelectionHeader = ({ )}
- {failedStatus?.failedRequest && failedStatus.failedRequest.length > 0 && ( + {hasFailedRequests && !isFailureAlertDismissed && ( - {t('message.validation-error-assets')} - - } - message={ + showIcon={false} + title={
@@ -160,8 +168,12 @@ const AssetSelectionHeader = ({
} - type="error" - /> + variant="error" + onClose={() => setIsFailureAlertDismissed(true)}> + + {t('message.validation-error-assets')} + +
)}
); @@ -203,15 +215,21 @@ const AssetSelectionList = ({
onSelectAll(e.target.checked)}> - {t('label.select-field', { - field: t('label.all'), - })} - - + label={ + <> + {t('label.select-field', { + field: t('label.all'), + })} + + } + onChange={(e) => onSelectAll(e)} + /> + <> item._source.id ?? item._id}> + itemKey={(item) => item._source.id ?? item._id} + role="list"> {({ _source: item }) => { const { isError, errorMessage } = getErrorStatusAndMessage( item.id ?? '' @@ -222,7 +240,8 @@ const AssetSelectionList = ({ className={classNames({ 'm-y-sm border-danger rounded-4': isError, })} - key={item.id}> + key={item.id} + role="listitem"> - + {isLoading && items.length < totalCount && (
diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaTable/contract-schema.less b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaTable/contract-schema.less index 06bab0a4efb1..720bb95554d9 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaTable/contract-schema.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSchemaTable/contract-schema.less @@ -21,69 +21,3 @@ } } } - -.ant-pagination.schema-custom-pagination { - align-items: center; - &.ant-table-pagination-right { - justify-content: center; - } - - .ant-pagination-prev, - .ant-pagination-next { - width: 36px; - height: 36px; - display: flex; - justify-content: center; - align-items: center; - border-radius: var(--om-radius-lg); - background: var(--tw-color-bg-primary); - box-shadow: 0 0 0 1px var(--om-legacy-color-10-13-18-0-18) inset, - 0 -2px 0 0 var(--om-legacy-color-10-13-18-0-05) inset, - 0 1px 2px 0 var(--om-legacy-color-10-13-18-0-05); - - .anticon { - color: @grey-400; - } - - &:hover { - background: @grey-100; - } - } - - .ant-pagination-prev { - margin-right: var(--om-space-10); - .anticon { - transform: rotate(180deg); - } - } - - .ant-pagination-disabled { - opacity: 0.3; - } - - .ant-pagination-item { - width: 36px; - height: 36px; - display: flex; - justify-content: center; - align-items: center; - - a { - color: @grey-500; - } - - &:hover { - a { - color: @grey-300; - } - } - } - - .ant-pagination-item-active { - background: @grey-46; - - a { - color: @grey-500; - } - } -} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataInsight/DataInsightProgressBar.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DataInsight/DataInsightProgressBar.test.tsx index 064be5439bb8..f4088ab6d032 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataInsight/DataInsightProgressBar.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataInsight/DataInsightProgressBar.test.tsx @@ -74,11 +74,11 @@ describe('Test DataInsightProgressBar Component', () => { }); it('uses the active theme color for the progress stroke', async () => { - const { container } = render(, { + render(, { wrapper: MemoryRouter, }); - expect(container.querySelector('.ant-progress-bg')).toHaveStyle({ + expect(screen.getByRole('progressbar').firstElementChild).toHaveStyle({ backgroundColor: '#123456', }); }); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataInsight/DataInsightProgressBar.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DataInsight/DataInsightProgressBar.tsx index 75d30cf05c11..c72be3279a72 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataInsight/DataInsightProgressBar.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataInsight/DataInsightProgressBar.tsx @@ -12,7 +12,8 @@ */ import Icon from '@ant-design/icons/lib/components/Icon'; -import { Progress } from 'antd'; +import { ProgressBar } from '@openmetadata/ui-core-components'; + import classNames from 'classnames'; import { round } from 'lodash'; import { ReactComponent as IconSuccessBadge } from '../../assets/svg/success-badge.svg'; @@ -74,12 +75,13 @@ const DataInsightProgressBar = ({ {showProgress && (
- renderProgressTarget(target, suffix)} - percent={progress} - strokeColor={progressColor} - /> +
+ + {renderProgressTarget(target, suffix)} +
{showSuccessInfo && progress >= 100 && ( - +
+ +
); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataInsight/KPILatestResultsV1.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DataInsight/KPILatestResultsV1.test.tsx index 3947f716b4e1..7201cfb8d3ce 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataInsight/KPILatestResultsV1.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataInsight/KPILatestResultsV1.test.tsx @@ -97,8 +97,10 @@ describe('KPILatestResultsV1', () => { backgroundColor: '#100000@0.1', color: '#100000', }); - expect(container.querySelector('.ant-progress-bg')).toHaveStyle({ - backgroundColor: '#100000', - }); + expect(screen.getAllByRole('progressbar')[0].firstElementChild).toHaveStyle( + { + backgroundColor: '#100000', + } + ); }); }); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataInsight/KPILatestResultsV1.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DataInsight/KPILatestResultsV1.tsx index c9287d2d2dce..609b55a44111 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataInsight/KPILatestResultsV1.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataInsight/KPILatestResultsV1.tsx @@ -15,6 +15,7 @@ import { CheckCircleOutlined, InfoCircleOutlined } from '@ant-design/icons'; import { Box, Grid, + ProgressBar, Tooltip, Typography, } from '@openmetadata/ui-core-components'; @@ -23,7 +24,7 @@ import { hexToRgba, useChartPalette, } from '@openmetadata/ui-core-components/charts'; -import { Progress } from 'antd'; + import { toNumber } from 'lodash'; import { FC, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; @@ -138,12 +139,16 @@ const KPILatestResultsV1: FC = ({ kpiLatestResultsRecord }) => { ) : null} - +
+ +
diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/AddDataQualityTest/components/TestCaseFormV1.less b/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/AddDataQualityTest/components/TestCaseFormV1.less index 590e05d38f7f..6889c464f03e 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/AddDataQualityTest/components/TestCaseFormV1.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/AddDataQualityTest/components/TestCaseFormV1.less @@ -182,16 +182,6 @@ } .test-case-form-drawer { - .ant-drawer-body { - padding: 0 @padding-lg; - - .test-case-form-v1, - .edit-test-case-form-v1 { - padding-top: @padding-lg; - padding-bottom: @padding-lg; - } - } - .drawer-content-wrapper .drawer-doc-panel { .entity-summary-in-docs { margin-top: 0; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Database/ColumnDetailPanel/ColumnDetailPanel.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Database/ColumnDetailPanel/ColumnDetailPanel.component.tsx index 4685077d3dce..3808ddb467a8 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Database/ColumnDetailPanel/ColumnDetailPanel.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Database/ColumnDetailPanel/ColumnDetailPanel.component.tsx @@ -15,6 +15,7 @@ import { Box, Button, Card, + SlideoutMenu, Tooltip, Typography, } from '@openmetadata/ui-core-components'; @@ -24,7 +25,9 @@ import { ChevronUp, XClose, } from '@openmetadata/ui-core-components/icons'; -import { Drawer } from 'antd'; +import { useId } from 'react'; +import { DrawerPopupContainerProvider } from '../../common/DrawerPopupContainerProvider/DrawerPopupContainerProvider'; + import { AxiosError } from 'axios'; import classNames from 'classnames'; import { isString } from 'lodash'; @@ -128,6 +131,8 @@ export const ColumnDetailPanel = ({ tableConstraints = [], entityType, }: ColumnDetailPanelProps) => { + const drawerTitleId = useId(); + const { t } = useTranslation(); const { permissions, changeSummary } = useGenericContext(); @@ -1062,37 +1067,51 @@ export const ColumnDetailPanel = ({
); + // Popup portals belong to the drawer even though they render outside its DOM tree. return ( - + !element.closest('[data-react-aria-top-layer]') + } width="40%" - onClose={onClose}> -
-
- - - {renderTabContent()} - - -
- + onOpenChange={(nextOpen) => { + if (!nextOpen) { + onClose(); + } + }}> + + {columnTitle} + + + +
+
+ + + {renderTabContent()} + + +
+ +
+
-
-
- {renderDisplayNameModal()} - + {renderDisplayNameModal()} + + + {navFooter} + ); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Database/ColumnDetailPanel/ColumnDetailPanel.less b/openmetadata-ui/src/main/resources/ui/src/components/Database/ColumnDetailPanel/ColumnDetailPanel.less index 0b6bece50ec5..59d753c90b94 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Database/ColumnDetailPanel/ColumnDetailPanel.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/Database/ColumnDetailPanel/ColumnDetailPanel.less @@ -14,7 +14,6 @@ .overview-tab-content { height: auto; } -.ant-drawer-content, .navigation-container { background-color: @grey-50 !important; } @@ -27,33 +26,6 @@ } .column-detail-panel { - .ant-drawer-footer { - border-top: none; - padding-top: 0; - position: relative; - } - .ant-drawer-header { - padding: var(--om-space-8); - padding-bottom: 0; - - .ant-drawer-header-title { - width: 100%; - min-width: 0; - overflow: hidden; - } - - .ant-drawer-title { - width: 100%; - min-width: 0; - overflow: hidden; - } - } - - .ant-drawer-body { - padding: 0; - height: 100%; - } - .title-section { padding-bottom: 0; width: 100%; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Database/ColumnDetailPanel/ColumnDetailPanel.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Database/ColumnDetailPanel/ColumnDetailPanel.test.tsx index 323ca1356e40..ec8519968234 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Database/ColumnDetailPanel/ColumnDetailPanel.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Database/ColumnDetailPanel/ColumnDetailPanel.test.tsx @@ -507,10 +507,11 @@ describe('ColumnDetailPanel', () => { describe('Component Rendering', () => { it('should render drawer when isOpen is true', async () => { - const { getByTestId } = render(); + const { getByTestId, getByRole } = render( + + ); - expect(getByTestId('drawer')).toBeInTheDocument(); - expect(getByTestId('drawer')).toHaveAttribute('data-open', 'true'); + expect(getByRole('dialog')).toBeInTheDocument(); await waitFor(() => { expect(getByTestId('description-section')).toBeInTheDocument(); @@ -518,11 +519,11 @@ describe('ColumnDetailPanel', () => { }); it('should not render drawer when isOpen is false', () => { - const { getByTestId } = render( + const { queryByRole } = render( ); - expect(getByTestId('drawer')).toHaveAttribute('data-open', 'false'); + expect(queryByRole('dialog')).not.toBeInTheDocument(); }); it('should render all sections in overview tab', async () => { diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Database/ColumnFilter/ColumnFilter.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Database/ColumnFilter/ColumnFilter.component.tsx index ed6bc7ce04bc..7d5c7b288280 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Database/ColumnFilter/ColumnFilter.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Database/ColumnFilter/ColumnFilter.component.tsx @@ -10,8 +10,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Menu } from 'antd'; -import Checkbox, { CheckboxChangeEvent } from 'antd/lib/checkbox/Checkbox'; +import { Box } from '@openmetadata/ui-core-components'; + +import { Checkbox } from '@openmetadata/ui-core-components'; import { isEmpty, startCase } from 'lodash'; import React from 'react'; import i18n from '../../../utils/i18next/LocalUtil'; @@ -23,8 +24,7 @@ export const ColumnFilter = ({ confirm, filters, }: FilterDropdownProps) => { - const handleClick = (e: CheckboxChangeEvent) => { - const checkedKey = e.target.value; + const handleClick = (checkedKey: React.Key) => { if (selectedKeys.indexOf(checkedKey) > -1) { setSelectedKeys(selectedKeys.filter((key) => key !== checkedKey)); } else { @@ -46,18 +46,15 @@ export const ColumnFilter = ({ } return ( - ({ - key: f.value as string, - label: ( - -1} - value={f.value} - onChange={handleClick}> - {startCase(f.text as string)} - - ), - }))} - /> + + {filters?.map((filter) => ( + -1} + key={String(filter.value)} + label={startCase(filter.text as string)} + onChange={() => handleClick(filter.value as React.Key)} + /> + ))} + ); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Database/Profiler/TableProfiler/QualityTab/QualityTab.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Database/Profiler/TableProfiler/QualityTab/QualityTab.component.tsx index 8d90d1293fa9..cbc1518e5519 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Database/Profiler/TableProfiler/QualityTab/QualityTab.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Database/Profiler/TableProfiler/QualityTab/QualityTab.component.tsx @@ -12,7 +12,6 @@ */ import { Box, Tabs } from '@openmetadata/ui-core-components'; import { Form, Select } from 'antd'; -import { ItemType } from 'antd/lib/menu/hooks/useItems'; import { isEmpty } from 'lodash'; import QueryString from 'qs'; import { useEffect, useMemo, useState } from 'react'; @@ -48,6 +47,7 @@ import { checkPermission } from '../../../../../utils/PermissionsUtils'; import { getEntityDetailsPath } from '../../../../../utils/RouterUtils'; import { ExtraTestCaseDropdownOptions } from '../../../../../utils/TestCaseUtils'; import ManageButton from '../../../../common/EntityPageInfos/ManageButton/ManageButton'; +import { ManageMenuItem as ItemType } from '../../../../common/EntityPageInfos/ManageButton/ManageMenu'; import ErrorPlaceHolder from '../../../../common/ErrorWithPlaceholder/ErrorPlaceHolder'; import { NextPreviousProps } from '../../../../common/NextPrevious/NextPrevious.interface'; import Searchbar from '../../../../common/SearchBarComponent/SearchBar.component'; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Database/Profiler/TableProfiler/table-profiler.less b/openmetadata-ui/src/main/resources/ui/src/components/Database/Profiler/TableProfiler/table-profiler.less index e86a2d3bffca..56f09cbe578e 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Database/Profiler/TableProfiler/table-profiler.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/Database/Profiler/TableProfiler/table-profiler.less @@ -53,13 +53,6 @@ } .profiler-settings-drawer { - .ant-drawer-body { - display: flex; - flex-direction: column; - height: 100%; - padding: 0 @padding-lg @padding-lg; - } - .profiler-settings-loader { min-height: calc(100vh - 200px); display: flex; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Database/SampleDataWithMessages/MessageCard.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Database/SampleDataWithMessages/MessageCard.tsx index 574906dfff3d..56bfe07ab29b 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Database/SampleDataWithMessages/MessageCard.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Database/SampleDataWithMessages/MessageCard.tsx @@ -11,8 +11,15 @@ * limitations under the License. */ -import { Badge, Typography } from '@openmetadata/ui-core-components'; -import { Collapse } from 'antd'; +import { + Accordion, + AccordionHeader, + AccordionItem, + AccordionPanel, + Badge, + Typography, +} from '@openmetadata/ui-core-components'; + import { lazy, ReactNode, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import withSuspenseFallback from '../../AppRouter/withSuspenseFallback'; @@ -22,8 +29,6 @@ const SchemaEditor = withSuspenseFallback( lazy(() => import('../SchemaEditor/SchemaEditor')) ); -const { Panel } = Collapse; - const MessageCard = ({ message }: { message: string }) => { const { t } = useTranslation(); const [header, setHeader] = useState( @@ -39,7 +44,7 @@ const MessageCard = ({ message }: { message: string }) => { if (isExpanded) { setHeader( { }, [isExpanded]); return ( - - - - - + + + + {header} + + + + + + ); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Database/SampleDataWithMessages/message-card.less b/openmetadata-ui/src/main/resources/ui/src/components/Database/SampleDataWithMessages/message-card.less index a9bcc959b535..b5e1a398eb5c 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Database/SampleDataWithMessages/message-card.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/Database/SampleDataWithMessages/message-card.less @@ -11,19 +11,3 @@ * limitations under the License. */ @import '../../../styles/variables.less'; - -.message-card-collapse { - background-color: var(--tw-color-bg-primary); - .ant-collapse-header-text { - width: 95%; - } - .ant-collapse-header { - background-color: transparent; - } - .ant-collapse-content { - border-top-width: 0px; - } - .ant-collapse-content-box { - padding-top: 0; - } -} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Database/TableQueries/TableQueryRightPanel/TableQueryRightPanel.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Database/TableQueries/TableQueryRightPanel/TableQueryRightPanel.component.tsx index e22eba36df24..82db8820a0e4 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Database/TableQueries/TableQueryRightPanel/TableQueryRightPanel.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Database/TableQueries/TableQueryRightPanel/TableQueryRightPanel.component.tsx @@ -13,7 +13,7 @@ import Icon from '@ant-design/icons'; import { Box, Grid, Owner, Typography } from '@openmetadata/ui-core-components'; -import { Drawer } from 'antd'; + import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { Link } from 'react-router-dom'; @@ -77,15 +77,7 @@ const TableQueryRightPanel = ({ }; return ( - + {isLoading ? ( ) : ( @@ -247,7 +239,7 @@ const TableQueryRightPanel = ({ )} - + ); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Database/TableQueries/table-queries.style.less b/openmetadata-ui/src/main/resources/ui/src/components/Database/TableQueries/table-queries.style.less index a650dcd13972..5ac6937829cd 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Database/TableQueries/table-queries.style.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/Database/TableQueries/table-queries.style.less @@ -44,8 +44,4 @@ -ms-overflow-style: none; border-radius: @border-rad-sm; scrollbar-width: none; - - .ant-drawer-body { - padding: unset; - } } diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Entity/EntityLineage/custom-node.less b/openmetadata-ui/src/main/resources/ui/src/components/Entity/EntityLineage/custom-node.less index 222ca4923da3..5f14d7f2d3da 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Entity/EntityLineage/custom-node.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/Entity/EntityLineage/custom-node.less @@ -381,26 +381,6 @@ padding-top: var(--om-space-8); } - .lineage-collapse-column.ant-collapse { - border: none; - border-radius: 0; - - .ant-collapse-header { - padding: var(--om-space-4); - font-size: var(--om-font-size-xs); - display: inherit; // to fix the overflow issue of parent column node, which has children. - } - - .ant-collapse-content-box { - padding: var(--om-space-4); - } - - .ant-collapse-item { - border: none; - border-radius: 0; - } - } - .custom-node-column-container { padding: var(--om-space-6) var(--om-space-8); background-color: inherit; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Entity/EntityLineage/entity-lineage.style.less b/openmetadata-ui/src/main/resources/ui/src/components/Entity/EntityLineage/entity-lineage.style.less index 1931574ad180..63e5af556629 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Entity/EntityLineage/entity-lineage.style.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/Entity/EntityLineage/entity-lineage.style.less @@ -272,11 +272,6 @@ .entity-panel-container { right: 16px; margin-top: var(--om-space-12); - - .ant-drawer-content-wrapper { - border-radius: var(--om-radius-10); - overflow: hidden; - } } } diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Explore/EntitySummaryPanel/LineageTab/LineageTabContent.less b/openmetadata-ui/src/main/resources/ui/src/components/Explore/EntitySummaryPanel/LineageTab/LineageTabContent.less index c83b119eeeb2..f28adc6ebe58 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Explore/EntitySummaryPanel/LineageTab/LineageTabContent.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/Explore/EntitySummaryPanel/LineageTab/LineageTabContent.less @@ -72,13 +72,6 @@ display: flex; align-items: center; justify-content: center; - - .ant-badge { - .ant-badge-status-text { - font-size: var(--om-font-size-11); - font-weight: var(--om-font-weight-medium); - } - } } .lineage-items-list { .lineage-item-card { @@ -134,16 +127,6 @@ color: @grey-500; font-size: var(--om-font-size-xs) !important; } - - .ant-badge { - .ant-badge-status-text { - font-size: var(--om-font-size-11); - color: @grey-10; - background-color: @grey-100; - padding: var(--om-space-2) var(--om-space-8); - border-radius: var(--om-radius-xl); - } - } } } .entity-type-icon { diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Explore/EntitySummaryPanel/SummaryList/SummaryList.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Explore/EntitySummaryPanel/SummaryList/SummaryList.component.tsx index 7a0e9729a2b3..cd2319db4af1 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Explore/EntitySummaryPanel/SummaryList/SummaryList.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Explore/EntitySummaryPanel/SummaryList/SummaryList.component.tsx @@ -12,11 +12,15 @@ */ import { + Accordion, + AccordionHeader, + AccordionItem, + AccordionPanel, Box, SkeletonParagraph, Typography, } from '@openmetadata/ui-core-components'; -import { Collapse, List } from 'antd'; + import { isEmpty, isUndefined } from 'lodash'; import { useTranslation } from 'react-i18next'; import { SummaryEntityType } from '../../../../enums/EntitySummary.enum'; @@ -45,48 +49,63 @@ export default function SummaryList({ } return ( - + {formattedEntityData.length ? ( + formattedEntityData.map((item) => ( +
  • + {isEmpty(item.children) || isUndefined(item.children) ? ( + + ) : ( + + + + + + {t('label.detail-plural')} + + + + + + + + + + + + )} +
  • + )) + ) : ( +
  • {emptyPlaceholderText ?? t('message.no-data-available')}
    - ), - }} - renderItem={(item) => - isEmpty(item.children) || isUndefined(item.children) ? ( - - ) : ( - - - } - key={`${item.name}-collapse-panel`}> - - - - ) - } - /> +
  • + )} + ); } diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Explore/EntitySummaryPanel/SummaryList/summary-list.less b/openmetadata-ui/src/main/resources/ui/src/components/Explore/EntitySummaryPanel/SummaryList/summary-list.less index 1ecc0a8b04cb..049b932109b7 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Explore/EntitySummaryPanel/SummaryList/summary-list.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/Explore/EntitySummaryPanel/SummaryList/summary-list.less @@ -14,25 +14,6 @@ @import '../../../../styles/variables.less'; .summary-list-collapse { - &.ant-collapse { - background-color: var(--tw-color-bg-primary); - margin-bottom: var(--om-space-16); - padding: var(--om-space-16); - border-radius: var(--om-radius-xl); - .ant-collapse-item { - .ant-collapse-header { - padding: 0; - .summary-list-item-container { - padding: 0; - margin-bottom: 0; - } - } - .summary-list-item-container { - background-color: inherit; - margin-bottom: 0; - } - } - } .summary-list-collapse { margin-bottom: 0; } diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Modals/WhatsNewModal/WhatsNewAlert/WhatsNewAlert.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Modals/WhatsNewModal/WhatsNewAlert/WhatsNewAlert.component.tsx index f851b5ef3e88..039b3ca1bde9 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Modals/WhatsNewModal/WhatsNewAlert/WhatsNewAlert.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Modals/WhatsNewModal/WhatsNewAlert/WhatsNewAlert.component.tsx @@ -12,7 +12,7 @@ */ import Icon from '@ant-design/icons'; import { Box, Card, Typography } from '@openmetadata/ui-core-components'; -import { Affix, Button } from 'antd'; +import { Button } from 'antd'; import { CookieStorage } from 'cookie-storage'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; @@ -101,7 +101,7 @@ const WhatsNewAlert = () => { return ( <> {showWhatsNew.alert && isHomePage && ( - +
    @@ -179,7 +179,7 @@ const WhatsNewAlert = () => { - +
    )} ); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/MyData/GithubStarCard/GithubStarCard.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/MyData/GithubStarCard/GithubStarCard.component.tsx index edde664a5051..c5fa125b7caa 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/MyData/GithubStarCard/GithubStarCard.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/MyData/GithubStarCard/GithubStarCard.component.tsx @@ -17,7 +17,7 @@ import { Skeleton, Typography, } from '@openmetadata/ui-core-components'; -import { Affix, Button } from 'antd'; +import { Button } from 'antd'; import ButtonGroup from 'antd/lib/button/button-group'; import { CookieStorage } from 'cookie-storage'; import { useCallback, useEffect, useMemo, useState } from 'react'; @@ -124,7 +124,7 @@ const GithubStarCard = () => { }, [usernameExistsInCookie, updateGithubPopup]); return showGithubStarPopup && isHomePage ? ( - { - +
    ) : null; }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/MyData/LeftSidebar/LeftSidebar.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/MyData/LeftSidebar/LeftSidebar.component.tsx index 4b4fb7ac669c..9cedfebacdcd 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/MyData/LeftSidebar/LeftSidebar.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/MyData/LeftSidebar/LeftSidebar.component.tsx @@ -10,14 +10,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Icon from '@ant-design/icons/lib/components/Icon'; -import { Typography } from '@openmetadata/ui-core-components'; -import { Button, Layout, Menu, MenuProps } from 'antd'; +import { + Accordion, + AccordionHeader, + AccordionItem, + AccordionPanel, + Badge, + Box, + Button as CoreButton, + ButtonUtility, + Divider, + Dropdown, + NavItemBase, + NavItemButton, + Typography, +} from '@openmetadata/ui-core-components'; +import { Button } from 'antd'; import Modal from 'antd/lib/modal/Modal'; import classNames from 'classnames'; -import { noop } from 'lodash'; -import { MenuInfo } from 'rc-menu/lib/interface'; -import { useCallback, useMemo, useState } from 'react'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Link } from 'react-router-dom'; import { @@ -28,6 +39,7 @@ import { SidebarItem } from '../../../enums/sidebar.enum'; import { useCurrentUserPreferences } from '../../../hooks/currentUserStore/useCurrentUserStore'; import useCustomLocation from '../../../hooks/useCustomLocation/useCustomLocation'; import { useSidebarItems } from '../../../hooks/useSidebarItems'; +import { LeftSidebarItem as SidebarEntry } from '../../../interface/sidebar.interface'; import leftSidebarClassBase from '../../../utils/LeftSidebarClassBase'; import { getSidebarActiveKeys, @@ -36,25 +48,22 @@ import { import { useAuthProvider } from '../../Auth/AuthProviders/AuthProvider'; import BrandImage from '../../common/BrandImage/BrandImage'; import './left-sidebar.less'; -import LeftSidebarItem from './LeftSidebarItem.component'; -const { Sider } = Layout; const LeftSidebar = () => { const location = useCustomLocation(); - const { t } = useTranslation(); + const { t, i18n } = useTranslation(); const { onLogoutHandler } = useAuthProvider(); const [isConfirmLogoutModalOpen, setIsConfirmLogoutModalOpen] = useState(false); const { preferences: { isSidebarCollapsed }, } = useCurrentUserPreferences(); - - const { i18n } = useTranslation(); - const isDirectionRTL = useMemo(() => i18n.dir() === 'rtl', [i18n]); + const isDirectionRTL = i18n.dir() === 'rtl'; const [openKeys, setOpenKeys] = useState([]); - + const [collapsedMenuKey, setCollapsedMenuKey] = useState(); + const hoverCloseTimer = useRef>(); + const collapsedPopover = useRef(null); const sideBarItems = useSidebarItems(); - const selectedKeys = useMemo( () => getSidebarActiveKeys( @@ -63,62 +72,190 @@ const LeftSidebar = () => { ), [location.pathname, location.state] ); + const handleLogoutClick = useCallback( + () => setIsConfirmLogoutModalOpen(true), + [] + ); + const hideConfirmLogoutModal = () => setIsConfirmLogoutModalOpen(false); - const handleLogoutClick = useCallback(() => { - setIsConfirmLogoutModalOpen(true); - }, []); + const cancelHoverClose = () => { + if (hoverCloseTimer.current !== undefined) { + clearTimeout(hoverCloseTimer.current); + hoverCloseTimer.current = undefined; + } + }; - const hideConfirmLogoutModal = () => { - setIsConfirmLogoutModalOpen(false); + useEffect(() => { + setCollapsedMenuKey(undefined); + + return () => { + if (hoverCloseTimer.current !== undefined) { + clearTimeout(hoverCloseTimer.current); + } + }; + }, [isSidebarCollapsed]); + + const navigateToItem = (item: SidebarEntry, parentKey?: string) => { + setOpenKeys(parentKey ? [parentKey] : []); + // App-mode changes must run before the router follows this item's link. + item.onClick?.(); }; - const LOWER_SIDEBAR_TOP_SIDEBAR_MENU_ITEMS: MenuProps['items'] = useMemo( - () => - [SETTING_ITEM, LOGOUT_ITEM].map((item) => ({ - key: item.key, - icon: , - onClick: item.key === SidebarItem.LOGOUT ? handleLogoutClick : noop, - label: , - })), - [handleLogoutClick] - ); + const renderLeaf = (item: SidebarEntry, parentKey?: string) => { + if (!item.redirect_url) { + return ( + { + navigateToItem(item, parentKey); + if (item.key === SidebarItem.LOGOUT) { + handleLogoutClick(); + } + }}> + {!isSidebarCollapsed && t(item.title)} + + ); + } - const menuItems = useMemo(() => { - return sideBarItems.map((item) => ({ - key: item.key, - icon: , - label: , - 'data-testid': `side-bar-${item.dataTestId}`, - children: item.children?.map((child) => ({ - key: child.key, - icon: , - label: , - 'data-testid': `side-bar-${item.dataTestId}`, - })), - })); - }, [sideBarItems]); + if (isSidebarCollapsed) { + return ( + + navigateToItem(item, parentKey)} + /> + + ); + } - const handleMenuClick: MenuProps['onClick'] = useCallback( - (info: MenuInfo) => { - // keyPath is [childKey, ...ancestorKeys]; keep the active item's submenu - // open (empty for a top-level item, which collapses any open submenu). - setOpenKeys(info.keyPath.slice(1)); - }, - [] - ); + return ( + + {t('label.beta')} + + ) : undefined + } + current={selectedKeys.includes(item.key)} + dataTestId={item.dataTestId} + href={item.redirect_url} + icon={item.icon} + size="sm" + type="link" + onClick={() => navigateToItem(item, parentKey)}> + {t(item.title)} + + ); + }; + + const renderGroup = (item: SidebarEntry) => { + if (isSidebarCollapsed) { + return ( + + setCollapsedMenuKey(isOpen ? item.key : undefined) + }> + { + cancelHoverClose(); + setCollapsedMenuKey(item.key); + }} + onMouseLeave={() => { + // A short handoff lets the pointer reach the portal without closing it mid-flight. + cancelHoverClose(); + hoverCloseTimer.current = setTimeout(() => { + if ( + !collapsedPopover.current?.contains(document.activeElement) + ) { + setCollapsedMenuKey(undefined); + } + }, 150); + }}> + selectedKeys.includes(child.key)) + ? 'secondary' + : 'tertiary' + } + icon={item.icon} + size="sm" + /> + + +
    setCollapsedMenuKey(undefined)}> + + {item.children?.map((child) => ( + navigateToItem(child, item.key)} + /> + ))} + +
    +
    +
    + ); + } + + return ( + + + + + {t(item.title)} + + + +
      + {item.children?.map((child) => ( +
    • + {renderLeaf(child, item.key)} +
    • + ))} +
    +
    +
    + ); + }; return ( - + dir={i18n.dir()}>
    { />
    -
    -
    -
    - -
    - -
    - -
    -
    + + + +
    - {isConfirmLogoutModalOpen && ( {
    )} - + ); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/MyData/LeftSidebar/LeftSidebarItem.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/MyData/LeftSidebar/LeftSidebarItem.component.tsx index 6bfcfa158236..0516b6407e26 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/MyData/LeftSidebar/LeftSidebarItem.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/MyData/LeftSidebar/LeftSidebarItem.component.tsx @@ -10,7 +10,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Badge } from 'antd'; +import { Badge } from '@openmetadata/ui-core-components'; + import { useTranslation } from 'react-i18next'; import { NavLink } from 'react-router-dom'; import { LeftSidebarItemProps } from './LeftSidebar.interface'; @@ -33,10 +34,11 @@ const LeftSidebarItem = ({ {isBeta && ( + color="brand" + size="sm" + style={{ marginLeft: 8 }}> + {t('label.beta')} + )} ) : ( diff --git a/openmetadata-ui/src/main/resources/ui/src/components/MyData/LeftSidebar/left-sidebar.less b/openmetadata-ui/src/main/resources/ui/src/components/MyData/LeftSidebar/left-sidebar.less index 42f884f9fb0c..78c535915c8f 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/MyData/LeftSidebar/left-sidebar.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/MyData/LeftSidebar/left-sidebar.less @@ -24,7 +24,7 @@ } .app-container { - & > .ant-layout-sider { + & > .app-sidebar { height: 100vh; overflow-y: auto; scrollbar-width: none; @@ -35,281 +35,6 @@ } } -.left-sidebar-menu { - &:not(.ant-menu-submenu-hidden) { - display: flex; - flex-direction: column; - } - - .ant-menu-item, - .ant-menu-submenu { - color: @grey-600; - } - - &.ant-menu.ant-menu-vertical[dir='rtl'] { - padding: 0 @padding-md 0 0; - } - - &.ant-menu.ant-menu-vertical, - &.ant-menu.ant-menu-inline { - border: none; - padding: 0 0 0 @padding-md; - overflow: hidden; - - .ant-menu-submenu-vertical { - &.ant-menu-submenu-active { - border: none; - } - } - - .ant-menu-submenu.ant-menu-submenu-inline { - &.ant-menu-submenu-active:not(.ant-menu-submenu-open):not( - .ant-menu-submenu-selected - ) { - .ant-menu-submenu-title { - background: @hover-color; - } - } - - .anticon { - svg { - fill: transparent; - } - } - - .ant-menu-submenu-title { - .ant-menu-title-content { - line-height: 16px; - font-weight: var(--om-font-weight-medium); - } - } - - .ant-menu-item, - .ant-menu-submenu-title { - display: flex; - align-items: center; - padding: var(--om-space-14) !important; - height: auto !important; - margin-bottom: 0; - margin-top: 0; - border-radius: var(--om-radius-xl); - - &.ant-menu-item-selected { - background: @selected-color; - color: var(--tw-color-text-white); - - .ant-menu-title-content { - line-height: 16px; - font-weight: var(--om-font-weight-medium); - } - - .anticon { - color: inherit; - } - } - - &.ant-menu-item-active:not(.ant-menu-item-selected) { - background: @hover-color; - } - - .ant-menu-title-content { - line-height: 16px; - font-weight: var(--om-font-weight-medium); - } - - .left-panel-label { - font-weight: var(--om-font-weight-medium); - color: inherit; - } - } - } - - .ant-menu-item { - display: flex; - align-items: center; - padding: var(--om-space-14) !important; - height: auto !important; - margin-bottom: var(--om-space-8); - margin-top: 0; - border-radius: var(--om-radius-xl); - - &.ant-menu-item-active:not(.ant-menu-item-selected) { - background: @hover-color; - - .anticon { - color: @active-color; - } - - .ant-menu-title-content { - .left-panel-label { - color: @active-color; - } - } - } - - .ant-menu-title-content { - line-height: 16px; - font-weight: var(--om-font-weight-medium); - } - - .left-panel-label { - font-weight: var(--om-font-weight-medium); - color: inherit; - } - - a { - line-height: 20px; - font-size: var(--om-font-size-sm); - font-weight: var(--om-font-weight-medium); - - a:hover { - color: @active-color; - } - } - - &.ant-menu-item-selected { - background-color: @selected-color; - color: var(--tw-color-text-white); - - svg { - fill: transparent; - } - - a, - a:hover { - color: var(--tw-color-text-white); - font-weight: var(--om-font-weight-semibold); - line-height: 20px; - font-size: var(--om-font-size-sm); - } - } - } - - .ant-menu-item-selected::after { - content: ''; - border: none; - } - } - - .anticon { - line-height: 0 !important; - font-size: @left-sidebar-icon-size !important; - - svg { - fill: transparent; - } - } - - .ant-menu-submenu.ant-menu-submenu-open { - border-width: 0px 1px 1px 1px; - border-style: solid; - border-color: @primary-4; - color: var(--tw-color-text-white); - border-radius: var(--om-radius-xl); - overflow: hidden; - - .ant-menu-submenu-title { - background-color: @active-color; - font-weight: var(--om-font-weight-semibold); - line-height: 20px; - font-size: var(--om-font-size-sm); - border-radius: var(--om-radius-xl) var(--om-radius-xl) 0 0 !important; - color: var(--tw-color-text-white); - padding: var(--om-space-14) !important; - - .ant-menu-title-content { - font-weight: var(--om-font-weight-medium); - line-height: 16px; - } - - &:hover { - .left-panel-label { - color: @active-color; - } - } - - .ant-menu-title-content { - line-height: 16px; - - .left-panel-label { - color: var(--tw-color-text-white); - font-weight: var(--om-font-weight-semibold); - line-height: 20px; - font-size: var(--om-font-size-sm); - } - } - - .ant-menu-submenu-arrow { - color: var(--tw-color-text-white); - } - } - - .ant-menu.ant-menu-sub.ant-menu-inline { - border-radius: var(--om-radius-xl); - - .ant-menu-item { - margin: 0; - padding: var(--om-space-10) var(--om-space-16) !important; - border-radius: 0; - width: calc(100% - 0.01px); - - .anticon { - font-size: @left-sidebar-icon-size !important; - } - - &:last-child { - border-radius: 0 0 var(--om-radius-xl) var(--om-radius-xl); - } - } - } - } - - .ant-menu-submenu { - width: 100%; - border-radius: var(--om-radius-xl); - margin-bottom: var(--om-space-8); - padding-bottom: 0 !important; - - &.ant-menu-submenu-selected:not(.ant-menu-submenu-open) { - color: @active-color; - - .ant-menu-submenu-title { - background: @active-color; - color: var(--tw-color-text-white); - border-radius: var(--om-radius-xl); - - .ant-menu-submenu-arrow { - color: var(--tw-color-text-white); - } - } - } - } - - .ant-menu-submenu > .ant-menu-submenu-title { - display: flex; - align-items: center; - padding: var(--om-space-14) !important; - height: auto !important; - line-height: 0 !important; - margin-bottom: 0; - margin-top: 0; - border-radius: var(--om-radius-xl); - - .ant-menu-title-content { - .anticon { - font-size: @left-sidebar-icon-size !important; - } - } - } - - .ant-menu-sub { - .ant-menu-item { - display: flex; - align-items: center; - } - } -} - .left-sidebar-layout { height: calc( 100vh - @layout-header-height @@ -335,3 +60,7 @@ flex-shrink: 0; } } + +.sidebar-collapsed .logo-container { + padding: 0 var(--om-space-16); +} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/MyData/Widgets/CuratedAssetsWidget/CuratedAssetsWidget.tsx b/openmetadata-ui/src/main/resources/ui/src/components/MyData/Widgets/CuratedAssetsWidget/CuratedAssetsWidget.tsx index 5dfe468b9346..effa4666ea9a 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/MyData/Widgets/CuratedAssetsWidget/CuratedAssetsWidget.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/MyData/Widgets/CuratedAssetsWidget/CuratedAssetsWidget.tsx @@ -15,7 +15,6 @@ import { Grid, Typography } from '@openmetadata/ui-core-components'; import { AxiosError } from 'axios'; import { get, isEmpty } from 'lodash'; -import { MenuInfo } from 'rc-menu/lib/interface'; import { lazy, useCallback, useEffect, useMemo, useState } from 'react'; import { Layout } from 'react-grid-layout'; import { useTranslation } from 'react-i18next'; @@ -256,9 +255,9 @@ const CuratedAssetsWidgetContent = ({ }; const handleSortByClick = useCallback( - (e: MenuInfo) => { + (key: string) => { if (!isEditView) { - setSelectedSortBy(e.key); + setSelectedSortBy(key); return; } @@ -271,7 +270,7 @@ const CuratedAssetsWidgetContent = ({ const updatedLayout = hasCurrentCuratedAssets ? currentLayout?.map((layout: WidgetConfig) => layout.i === widgetKey - ? { ...layout, config: { ...layout.config, sortBy: e.key } } + ? { ...layout, config: { ...layout.config, sortBy: key } } : layout ) : [ @@ -281,7 +280,7 @@ const CuratedAssetsWidgetContent = ({ i: widgetKey, config: { ...CURATED_ASSETS_WIDGET_DEFAULT_VALUES.config, - sortBy: e.key, + sortBy: key, }, }, ]; @@ -455,7 +454,7 @@ const CuratedAssetsWidgetContent = ({ } widgetKey={widgetKey} onEditClick={handleModalOpen} - onSortChange={(key: string) => handleSortByClick({ key } as MenuInfo)} + onSortChange={handleSortByClick} onTitleClick={handleTitleClick} /> ), diff --git a/openmetadata-ui/src/main/resources/ui/src/components/NavBar/NavBar.tsx b/openmetadata-ui/src/main/resources/ui/src/components/NavBar/NavBar.tsx index b33c778c9056..0afc0515c447 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/NavBar/NavBar.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/NavBar/NavBar.tsx @@ -12,16 +12,18 @@ */ import { + Alert, Button as CoreButton, ButtonUtility, + Dot, Dropdown, Popover, PopoverTrigger, Tooltip as CoreTooltip, Tooltip, } from '@openmetadata/ui-core-components'; -import { Alert, Badge, Button, InputRef } from 'antd'; -import { Header } from 'antd/lib/layout/layout'; +import { RefreshCw01 } from '@openmetadata/ui-core-components/icons'; +import { Button, InputRef } from 'antd'; import { AxiosError } from 'axios'; import { CookieStorage } from 'cookie-storage'; import { startCase, upperCase } from 'lodash'; @@ -39,7 +41,6 @@ import { useNavigate } from 'react-router-dom'; import { ReactComponent as DropDownIcon } from '../../assets/svg/drop-down.svg'; import { ReactComponent as IconBell } from '../../assets/svg/ic-alert-bell.svg'; import { ReactComponent as Help } from '../../assets/svg/ic-help.svg'; -import { ReactComponent as RefreshIcon } from '../../assets/svg/ic-refresh.svg'; import { ReactComponent as SidebarCollapsedIcon } from '../../assets/svg/ic-sidebar-collapsed.svg'; import { ReactComponent as SidebarExpandedIcon } from '../../assets/svg/ic-sidebar-expanded.svg'; import { @@ -569,7 +570,9 @@ const NavBar = () => { showVersionMissMatchAlert ? ( { {t('label.refresh')} } - className="refresh-alert slide-in-top" - description="For a seamless experience recommend you to refresh the page" - icon={} - message="A new version is available" - type="info" - /> + title={t('message.new-version-available')} + variant="brand"> + {t('message.refresh-page-recommended')} + ) : null, [showVersionMissMatchAlert, navigate, t] ); return ( <> -
    +
    @@ -642,11 +643,17 @@ const NavBar = () => { aria-label={t('label.notification-plural')} color="tertiary" iconLeading={ - + - + {(hasTaskNotification || hasMentionNotification) && ( + + )} + } size="sm" /> @@ -687,7 +694,7 @@ const NavBar = () => {
    -
    +
    {versionMismatchAlert} {renderAlertCards} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/NavBar/nav-bar.less b/openmetadata-ui/src/main/resources/ui/src/components/NavBar/nav-bar.less index e670d4de6439..7c9f823f4c04 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/NavBar/nav-bar.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/NavBar/nav-bar.less @@ -69,36 +69,3 @@ transform: translate(-50%, 0); } } - -.ant-alert.ant-alert-info.refresh-alert { - width: 470px; - bottom: 30px; - align-items: center; - z-index: var(--om-z-9999); - margin: 0 auto; - box-shadow: 0px 2px 10px var(--om-legacy-color-0-0-0-0-12); - border-radius: var(--om-radius-10); - border: 1px solid var(--tw-color-bg-primary-solid); - background: var(--tw-color-bg-primary-solid); - color: var(--tw-color-text-white); - position: fixed; - left: 50%; - transform: translateX(-50%); - - .ant-alert-message { - color: var(--tw-color-text-white); - } - - .ant-alert-description { - color: var(--tw-color-gray-400); - } - - .ant-alert-content { - border-right: 1px solid var(--tw-color-text-white); - } - - .ant-btn { - font-weight: var(--om-font-weight-bold); - color: var(--tw-color-text-white); - } -} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/NotificationBox/NotificationBox.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/NotificationBox/NotificationBox.component.tsx index 5335e6ea3072..7b5443e0e937 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/NotificationBox/NotificationBox.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/NotificationBox/NotificationBox.component.tsx @@ -12,8 +12,8 @@ */ import Icon from '@ant-design/icons/lib/components/Icon'; -import { Tabs, Typography } from '@openmetadata/ui-core-components'; -import { Badge, Button, List } from 'antd'; +import { Dot, Tabs, Typography } from '@openmetadata/ui-core-components'; +import { Button } from 'antd'; import { AxiosError } from 'axios'; import { isEmpty } from 'lodash'; import { useCallback, useEffect, useMemo, useState } from 'react'; @@ -240,13 +240,7 @@ const NotificationBox = ({ const getTabTitle = (name: string, key: string) => { return ( - + {name} - + {(key === NotificationTabsKey.TASK + ? hasTaskNotification + : hasMentionNotification) && ( + + )} + ); }; @@ -265,10 +269,17 @@ const NotificationBox = ({

    {t('message.no-notification-found')}

    ) : ( - +
      + {notificationDropDownList.map((item, index) => ( +
    • + {item} +
    • + ))} +
    +
    - } - itemLayout="vertical" - renderItem={(item) => ( - - {item} - - )} - size="small" - /> +
    +
    ), [notifications, notificationDropDownList, viewAllPath, t] ); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/NotificationBox/NotificationFeedCard.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/NotificationBox/NotificationFeedCard.component.tsx index b595cba64b0b..a961a0860160 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/NotificationBox/NotificationFeedCard.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/NotificationBox/NotificationFeedCard.component.tsx @@ -12,7 +12,7 @@ */ import { Box, Typography } from '@openmetadata/ui-core-components'; -import { List } from 'antd'; + import { startCase } from 'lodash'; import { FC, useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; @@ -112,34 +112,30 @@ const NotificationFeedCard: FC = ({ className="no-underline" to={isMentionNotification ? mentionLink : taskLink} onClick={!isMentionNotification ? handleTaskLinkClick : undefined}> - } - className="m-0" - description={ - - - <>{createdBy} - {isMentionNotification ? mentionContent : taskContent} - - - {getRelativeTime(timestamp)} - - - } - style={{ marginBottom: 0 }} - /> + + + + + <>{createdBy} + {isMentionNotification ? mentionContent : taskContent} + + + {getRelativeTime(timestamp)} + + + ); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/NotificationBox/notification-box.less b/openmetadata-ui/src/main/resources/ui/src/components/NotificationBox/notification-box.less index a525d35ef653..4adda09ebe19 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/NotificationBox/notification-box.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/NotificationBox/notification-box.less @@ -19,19 +19,12 @@ border-radius: @card-radius; box-shadow: @box-shadow-base; - .ant-list { - .ant-list-footer { - border-top: 1px solid var(--om-legacy-color-dce3ec); - box-shadow: var(--om-legacy-color-0-0-0-0-04) 0px -4px 4px; - } + .notification-list-footer { + border-top: 1px solid var(--om-legacy-color-dce3ec); + box-shadow: var(--om-legacy-color-0-0-0-0-04) 0px -4px 4px; } } .notification-content-container { min-height: 16rem; - - .ant-spin-nested-loading { - height: 200px; - overflow-y: scroll; - } } diff --git a/openmetadata-ui/src/main/resources/ui/src/components/PageHeader/PageHeader.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/PageHeader/PageHeader.component.tsx index 2bf863baaf2f..81d520fd86ea 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/PageHeader/PageHeader.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/PageHeader/PageHeader.component.tsx @@ -11,8 +11,8 @@ * limitations under the License. */ -import { Box, Typography } from '@openmetadata/ui-core-components'; -import { Badge } from 'antd'; +import { Badge, Box, Typography } from '@openmetadata/ui-core-components'; + import { useTranslation } from 'react-i18next'; import { LearningIcon } from '../Learning/LearningIcon/LearningIcon.component'; import './page-header.less'; @@ -48,10 +48,11 @@ const PageHeader = ({ {isBeta && ( + size="sm"> + {t('label.beta')} + )} {learningPageId && ( diff --git a/openmetadata-ui/src/main/resources/ui/src/components/PaginationComponent/PaginationComponent.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/PaginationComponent/PaginationComponent.test.tsx new file mode 100644 index 000000000000..9d40b89c5d02 --- /dev/null +++ b/openmetadata-ui/src/main/resources/ui/src/components/PaginationComponent/PaginationComponent.test.tsx @@ -0,0 +1,50 @@ +/* + * 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 PaginationComponent from './PaginationComponent'; + +describe('PaginationComponent', () => { + it('hides a single page by default', () => { + render(); + + expect(screen.queryByRole('navigation')).not.toBeInTheDocument(); + }); + + it('converts records into pages and preserves the callback page size', () => { + const onChange = jest.fn(); + render( + + ); + + fireEvent.click(screen.getByTestId('next')); + + expect(onChange).toHaveBeenCalledWith(2, 10); + expect(screen.getByText('3')).toBeInTheDocument(); + }); + + it('keeps uncontrolled navigation state', () => { + render(); + + fireEvent.click(screen.getByTestId('next')); + + expect(screen.getByRole('textbox', { name: /current page/i })).toHaveValue( + '2' + ); + }); +}); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/PaginationComponent/PaginationComponent.tsx b/openmetadata-ui/src/main/resources/ui/src/components/PaginationComponent/PaginationComponent.tsx index 11a424de9f28..7d583da1412c 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/PaginationComponent/PaginationComponent.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/PaginationComponent/PaginationComponent.tsx @@ -10,63 +10,76 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import Icon from '@ant-design/icons'; -import { Button, Pagination, PaginationProps } from 'antd'; -import { useTranslation } from 'react-i18next'; -import { ReactComponent as ArrowRightOutlined } from '../../assets/svg/arrow-right.svg'; + +import { PaginationCardWithControls } from '@openmetadata/ui-core-components'; +import { HTMLAttributes, useState } from 'react'; import { PAGE_SIZE_BASE, PAGE_SIZE_LARGE, PAGE_SIZE_MEDIUM, } from '../../constants/constants'; -const PaginationComponent = (props: PaginationProps) => { - const { t } = useTranslation(); - const itemRender: PaginationProps['itemRender'] = ( - _, - type, - originalElement - ) => { - if (type === 'prev') { - return ( - - ); - } - if (type === 'next') { - return ( - - ); - } +interface PaginationComponentProps + extends Omit, 'onChange'> { + current?: number; + total?: number; + pageSize?: number; + defaultCurrent?: number; + defaultPageSize?: number; + hideOnSinglePage?: boolean; + showSizeChanger?: boolean; + onChange?: (page: number, pageSize: number) => void; +} + +const PaginationComponent = ({ + current, + total = 0, + pageSize, + defaultCurrent = 1, + defaultPageSize = PAGE_SIZE_BASE, + hideOnSinglePage = true, + showSizeChanger, + onChange, + ...props +}: PaginationComponentProps) => { + const [internalPage, setInternalPage] = useState(defaultCurrent); + const [internalPageSize, setInternalPageSize] = useState(defaultPageSize); + const currentPage = current ?? internalPage; + const currentPageSize = pageSize ?? internalPageSize; + // Ant Design takes a record count; core pagination takes a page count. + const totalPages = Math.max(1, Math.ceil(total / currentPageSize)); + + const changePage = (nextPage: number) => { + setInternalPage(nextPage); + onChange?.(nextPage, currentPageSize); + }; - return originalElement; + const changePageSize = (nextSize: number) => { + // Keep the current page unless a smaller page count makes it unavailable. + const nextPage = Math.min( + currentPage, + Math.max(1, Math.ceil(total / nextSize)) + ); + setInternalPageSize(nextSize); + setInternalPage(nextPage); + onChange?.(nextPage, nextSize); }; + if (hideOnSinglePage && totalPages <= 1) { + return null; + } + return ( - 50 ? changePageSize : undefined + } /> ); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Pipeline/Execution/TreeView/TreeViewTab.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Pipeline/Execution/TreeView/TreeViewTab.component.tsx index fa39000b6fa0..22d4bf60526c 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Pipeline/Execution/TreeView/TreeViewTab.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Pipeline/Execution/TreeView/TreeViewTab.component.tsx @@ -11,9 +11,15 @@ * limitations under the License. */ -import { Box, Card, Grid, Typography } from '@openmetadata/ui-core-components'; -import { Empty } from 'antd'; -import Tree from 'antd/lib/tree'; +import { + Box, + Card, + EmptyPlaceholder, + Grid, + Tree, + Typography, +} from '@openmetadata/ui-core-components'; + import { isEmpty } from 'lodash'; import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; @@ -22,6 +28,7 @@ import { PipelineStatus, Task, } from '../../../../generated/entity/data/pipeline'; +import { TreeNode } from '../../../../interface/tree.interface'; import { getLayoutGutter } from '../../../../utils/common/layout.utils'; import { formatDateTime } from '../../../../utils/date-time/DateTimeUtils'; import { getTreeData, getTreeViewData } from '../../../../utils/executionUtils'; @@ -54,6 +61,25 @@ const TreeViewTab = ({ const { t } = useTranslation(); + const renderNode = ( + node: TreeNode, + showGuideLines: boolean + ): React.ReactNode => ( + + + {node.icon} + {node.title} + + {node.children?.map((child) => renderNode(child, showGuideLines))} + + ); + const expandedKeys = (nodes: TreeNode[]): (string | number)[] => + nodes.flatMap((node) => [node.key, ...expandedKeys(node.children ?? [])]); + return ( @@ -79,29 +105,28 @@ const TreeViewTab = ({ {isEmpty(viewData) ? ( - ) : ( } - treeData={treeLabelList} - /> + aria-label={t('label.task-plural')} + defaultExpandedKeys={expandedKeys(treeLabelList)} + selectionMode="none"> + {treeLabelList.map((node) => renderNode(node, true))} + } - treeData={treeDataList} - /> + aria-label={t('label.task-plural')} + defaultExpandedKeys={expandedKeys(treeDataList)} + selectionMode="none"> + {treeDataList.map((node) => renderNode(node, false))} + )} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Pipeline/Execution/TreeView/tree-view-tab.less b/openmetadata-ui/src/main/resources/ui/src/components/Pipeline/Execution/TreeView/tree-view-tab.less index 503b1569d7cc..f5977cf30dc6 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Pipeline/Execution/TreeView/tree-view-tab.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/Pipeline/Execution/TreeView/tree-view-tab.less @@ -23,14 +23,3 @@ border-radius: var(--om-radius-md); border: 6px solid var(--om-legacy-color-cccccc); } - -.tree-without-indent { - .ant-tree-indent { - display: none; - } -} - -.tree-without-indent .ant-tree-treenode { - width: 100%; - overflow-x: hidden; -} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/ProfileCard/ProfileSectionUserDetailsCard.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/ProfileCard/ProfileSectionUserDetailsCard.component.tsx index a532660ae77d..645019524357 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/ProfileCard/ProfileSectionUserDetailsCard.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/ProfileCard/ProfileSectionUserDetailsCard.component.tsx @@ -12,12 +12,13 @@ */ import Icon from '@ant-design/icons'; import { + BadgeWithDot, ButtonUtility, Popover, PopoverTrigger, Typography, } from '@openmetadata/ui-core-components'; -import { Badge, Button, Modal } from 'antd'; +import { Button, Modal } from 'antd'; import { AxiosError } from 'axios'; import { useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; @@ -277,7 +278,7 @@ const ProfileSectionUserDetailsCard = ({ aria-label={t('label.manage-entity', { entity: t('label.profile'), })} - className="user-details-menu-icon tw:p-0" + className="user-details-menu-icon" color="tertiary" data-testid="user-profile-manage-btn" icon={} @@ -308,11 +309,11 @@ const ProfileSectionUserDetailsCard = ({ {userEmailRender} {onlineStatus && (
    - + + + {onlineStatus.text} + +
    )}
    diff --git a/openmetadata-ui/src/main/resources/ui/src/components/ProfileCard/ProfileSectionUserDetailsCard.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/ProfileCard/ProfileSectionUserDetailsCard.test.tsx index 1b3a8ff64394..b5caeb8131f9 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/ProfileCard/ProfileSectionUserDetailsCard.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/ProfileCard/ProfileSectionUserDetailsCard.test.tsx @@ -238,9 +238,9 @@ describe('ProfileSectionUserDetailsCard', () => { '[data-testid="user-online-status"]' ); - const statusDot = badge?.querySelector('.ant-badge-status-dot'); + const statusDot = badge?.querySelector('svg'); - expect(statusDot).toHaveClass('ant-badge-status-success'); + expect(statusDot).toHaveClass('tw:text-utility-success-500'); }); it('should be positioned below the email', () => { diff --git a/openmetadata-ui/src/main/resources/ui/src/components/SearchSettings/EntitySeachSettings/EntitySearchSettings.tsx b/openmetadata-ui/src/main/resources/ui/src/components/SearchSettings/EntitySeachSettings/EntitySearchSettings.tsx index f0b4b4206d43..5689b8b1665d 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/SearchSettings/EntitySeachSettings/EntitySearchSettings.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/SearchSettings/EntitySeachSettings/EntitySearchSettings.tsx @@ -12,13 +12,17 @@ */ import Icon from '@ant-design/icons/lib/components/Icon'; import { + Accordion, + AccordionHeader, + AccordionItem, + AccordionPanel, Badge, Box, Grid, Toggle, Typography, } from '@openmetadata/ui-core-components'; -import { Collapse, InputNumber, Select } from 'antd'; +import { InputNumber, Select } from 'antd'; import { AxiosError } from 'axios'; import { isEmpty, omit, startCase } from 'lodash'; import { useEffect, useMemo, useState } from 'react'; @@ -921,146 +925,162 @@ const EntitySearchSettings = () => { maxWidth: '33.33333333333333%', flex: '0 0 33.33333333333333%', }}> - - + handleCollapseChange([...keys].map(String)) + }> + + {t('label.ranking-detail-plural')} - } - key="ranking"> -
    - {renderRankingSettings()} -
    -
    - - } - key="1"> -
    - - {entitySearchFields.map( - ( - field: { - fieldName: string; - weight: number; - matchType?: MatchType; - }, - index: number - ) => ( - - + +
    + {renderRankingSettings()} +
    +
    + + + + {t('label.matching-fields')} + + } + /> + +
    + + {entitySearchFields.map( + ( + field: { + fieldName: string; + weight: number; + matchType?: MatchType; + }, + index: number + ) => ( + + + + ) + )} + {/* Score Mode and Boost Mode Section */} + +
    + + {t('label.score-mode')} + + - handleModeUpdate('scoreMode', value) - } - /> -
    -
    - - {t('label.boost-mode')} - - + handleModeUpdate('boostMode', value) + } + /> +
    +
    - -
    - - - } - key="2"> -
    - -
    -
    - - } - key="3"> -
    - -
    -
    - +
    + + + + + {t('label.term-boost')} + + } + /> + +
    + +
    +
    +
    + + + {t('label.field-value-boost')} + + } + /> + +
    + +
    +
    +
    + .ant-collapse-header { - background-color: var(--tw-color-bg-primary); - padding: var(--om-space-16); - display: flex; - align-items: center; - - .ant-collapse-header-text { - width: 100%; - } - } - - > .ant-collapse-content { - > .ant-collapse-content-box { - padding: 0; - } - } - } } .term-boost-card { diff --git a/openmetadata-ui/src/main/resources/ui/src/components/SearchSettings/FieldConfiguration/FieldConfiguration.tsx b/openmetadata-ui/src/main/resources/ui/src/components/SearchSettings/FieldConfiguration/FieldConfiguration.tsx index 23c05c1473ac..6d08a03a2941 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/SearchSettings/FieldConfiguration/FieldConfiguration.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/SearchSettings/FieldConfiguration/FieldConfiguration.tsx @@ -12,13 +12,19 @@ */ import Icon from '@ant-design/icons'; import { + Accordion, + AccordionHeader, + AccordionItem, + AccordionPanel, + Badge, + Box, Divider, Toggle, Tooltip, TooltipTrigger, Typography, } from '@openmetadata/ui-core-components'; -import { Badge, Button, Collapse, Select, Slider } from 'antd'; +import { Button, Select, Slider } from 'antd'; import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { ReactComponent as Delete } from '../../../assets/svg/delete-colored.svg'; @@ -91,134 +97,144 @@ const FieldConfiguration: React.FC = ({ ]; return ( - handleCollapseChange(key, index)}> - + ((key) => handleCollapseChange(key, index))([...keys].map(String)) + }> + -
    -
    - - {field.fieldName} - - {field.fieldName.startsWith('extension.') && ( - - )} + id={String(String(index))} + key={String(index)}> + + + +
    +
    +
    + + {field.fieldName} + + {field.fieldName.startsWith('extension.') && ( + + {t('label.custom')} + + )} +
    +
    + +
    + + {fieldDescription ?? t('label.no-description')} + + + + {fieldWeight < 10 ? `0${fieldWeight}` : fieldWeight} + +
    -
    - - + + {` ${t('label.all-entity', { entity: t('label.metadata'), - })}`} - key="1" - /> - + })}`} + {null} + +
    diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/AppLogsViewer.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/AppLogsViewer.component.tsx index 74c22ff3fd50..263d4f1d2400 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/AppLogsViewer.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/AppLogsViewer.component.tsx @@ -13,13 +13,14 @@ import Icon from '@ant-design/icons/lib/components/Icon'; import { + Badge, Box, Card, Divider, Grid, Typography, } from '@openmetadata/ui-core-components'; -import { Badge, Button, Table } from 'antd'; +import { Button } from 'antd'; import { capitalize, isEmpty, toString } from 'lodash'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; @@ -35,12 +36,14 @@ import { getLayoutGutter } from '../../../../utils/common/layout.utils'; import { formatDateTimeWithTimezone } from '../../../../utils/date-time/DateTimeUtils'; import AppBadge from '../../../common/Badge/Badge.component'; import LogViewerModal from '../../../common/LogViewerModal/LogViewerModal.component'; +import Table from '../../../common/Table/TableV2'; import './app-logs-viewer.less'; import { AppLogsViewerProps, ServerStats, ServerStatsData, } from './AppLogsViewer.interface'; +import { formatRecordCount } from './AppLogsViewer.utils'; import ReindexFailures from './ReindexFailures.component'; const AppLogsViewer = ({ data, scrollHeight }: AppLogsViewerProps) => { @@ -166,46 +169,46 @@ const AppLogsViewer = ({ data, scrollHeight }: AppLogsViewerProps) => { gap={2} itemClassName="layout-space-item"> + }`}> + {formatRecordCount(stepStats.totalRecords)} + + })}: ${stepStats.successRecords}`}> + {formatRecordCount(stepStats.successRecords)} + + })}: ${stepStats.failedRecords}`}> + {formatRecordCount(stepStats.failedRecords)} + {stepStats.warningRecords !== undefined && stepStats.warningRecords > 0 && ( + })}: ${stepStats.warningRecords}`}> + {formatRecordCount(stepStats.warningRecords)} + )} @@ -580,9 +583,11 @@ const AppLogsViewer = ({ data, scrollHeight }: AppLogsViewerProps) => { {serverCount && ( + color="brand" + size="sm" + tooltip={`${serverCount} ${t('label.server')}(s)`}> + {formatRecordCount(serverCount, 99)} + )} } diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/AppLogsViewer.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/AppLogsViewer.test.tsx index 6ff24c32f4df..e6984f622295 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/AppLogsViewer.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/AppLogsViewer.test.tsx @@ -10,7 +10,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { act, render, screen } from '@testing-library/react'; +import { act, render, screen, within } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { ReactComponent as IconSuccessBadge } from '../../../../assets/svg/success-badge.svg'; import { @@ -51,11 +51,6 @@ jest.mock('../../../common/CopyToClipboardButton/CopyToClipboardButton', () => jest.fn().mockReturnValue(<>CopyToClipboardButton) ); -jest.mock('antd', () => ({ - ...jest.requireActual('antd'), - Badge: jest.fn().mockReturnValue(
    Badge
    ), -})); - jest.mock('../../../../utils/ApplicationUtils', () => ({ // Use the real formatters so the wall-clock regression test asserts // the same display strings the user sees. getEntityStatsData stays @@ -299,7 +294,13 @@ describe('AppLogsViewer component', () => { expect(screen.getByText('label.status:')).toBeInTheDocument(); expect(screen.getByText('Success')).toBeInTheDocument(); expect(screen.getByText('label.index-states:')).toBeInTheDocument(); - expect(screen.getAllByText('Badge')).toHaveLength(3); + + const overallStats = screen.getByTestId( + 'stats-component-label.overall-stat-plural' + ); + + expect(within(overallStats).getAllByText('274')).toHaveLength(2); + expect(within(overallStats).getByText('0')).toBeInTheDocument(); expect(screen.getByText('label.last-updated:')).toBeInTheDocument(); expect(screen.getByText('formatDateTimeWithTimezone')).toBeInTheDocument(); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/AppLogsViewer.utils.test.ts b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/AppLogsViewer.utils.test.ts new file mode 100644 index 000000000000..da59054e04e6 --- /dev/null +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/AppLogsViewer.utils.test.ts @@ -0,0 +1,27 @@ +/* + * Copyright 2023 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 { formatRecordCount } from './AppLogsViewer.utils'; + +describe('formatRecordCount', () => { + it('preserves unavailable and zero counts', () => { + expect(formatRecordCount(undefined)).toBeUndefined(); + expect(formatRecordCount(0)).toBe(0); + }); + + it('caps counts only above the specified overflow limit', () => { + expect(formatRecordCount(99999999)).toBe(99999999); + expect(formatRecordCount(100000000)).toBe('99999999+'); + expect(formatRecordCount(100, 99)).toBe('99+'); + }); +}); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/AppLogsViewer.utils.ts b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/AppLogsViewer.utils.ts new file mode 100644 index 000000000000..7f3cd45c3cef --- /dev/null +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/AppLogsViewer.utils.ts @@ -0,0 +1,24 @@ +/* + * Copyright 2023 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. + */ + +export const formatRecordCount = ( + count: number | undefined, + overflowCount = 99999999 +) => { + // Missing counters mean unavailable statistics, not zero processed records. + if (count === undefined) { + return undefined; + } + + return count > overflowCount ? `${overflowCount}+` : count; +}; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/ReindexFailures.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/ReindexFailures.component.tsx index 5af02763a008..7efb46a9c243 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/ReindexFailures.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppLogsViewer/ReindexFailures.component.tsx @@ -14,14 +14,16 @@ import { Box, Button, + SlideoutMenu, Tooltip, Typography, } from '@openmetadata/ui-core-components'; -import { Drawer, Select } from 'antd'; +import { Select } from 'antd'; import { AxiosError } from 'axios'; import { useCallback, useEffect, + useId, useLayoutEffect, useMemo, useRef, @@ -34,6 +36,7 @@ import { getReindexFailures } from '../../../../rest/searchAPI'; import { formatDateTimeWithTimezone } from '../../../../utils/date-time/DateTimeUtils'; import { showErrorToast } from '../../../../utils/ToastUtils'; import CopyToClipboardButton from '../../../common/CopyToClipboardButton/CopyToClipboardButton'; +import { DrawerPopupContainerProvider } from '../../../common/DrawerPopupContainerProvider/DrawerPopupContainerProvider'; import { ColumnsType } from '../../../common/Table/Table.interface'; import Table from '../../../common/Table/TableV2'; import { @@ -83,6 +86,8 @@ const ReindexFailures = ({ onClose, appName, }: ReindexFailuresProps) => { + const drawerTitleId = useId(); + const { t } = useTranslation(); const [loading, setLoading] = useState(false); const [data, setData] = useState([]); @@ -229,67 +234,80 @@ const ReindexFailures = ({ [t] ); + // Popup portals belong to the drawer even though they render outside its DOM tree. return ( - + !element.closest('[data-react-aria-top-layer]') + } width={900} - onClose={onClose}> - - - {t('label.filter-by-entity-type')}: - - - {total > 0 && ( - - {t('label.showing-total-failure-plural', { total })} - - )} - - - handlePageChange(current ?? 1)} - /> - + onOpenChange={(nextOpen) => { + if (!nextOpen) { + onClose(); + } + }}> + + {t('label.reindex-failure-plural')} + + + + + + {t('label.filter-by-entity-type')}: + + + {total > 0 && ( + + {t('label.showing-total-failure-plural', { total })} + + )} + +
    handlePageChange(current ?? 1)} + /> + + + ); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppRunsHistory/AppRunsHistory.merge.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppRunsHistory/AppRunsHistory.merge.test.tsx index 8fa0d0f57224..bb03d58003d2 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppRunsHistory/AppRunsHistory.merge.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppRunsHistory/AppRunsHistory.merge.test.tsx @@ -16,9 +16,7 @@ import { render, screen, waitForElementToBeRemoved, - within, } from '@testing-library/react'; -import { Table as AntdTable } from 'antd'; import { AppRunRecord, Status, @@ -117,9 +115,13 @@ jest.mock('../../../common/ErrorWithPlaceholder/ErrorPlaceHolder', () => ); jest.mock('../../../common/Table/TableV2', () => { + const ActualTable = jest.requireActual( + '../../../common/Table/TableV2' + ).default; + return jest.fn().mockImplementation(({ loading, ...rest }) => (
    - {loading ?

    TableLoader

    : } + {loading ?

    TableLoader

    : } Table
    )); @@ -204,7 +206,9 @@ const getTriggeredByCell = () => { .findIndex((header) => header.textContent === 'label.triggered-by'); const [, firstDataRow] = screen.getAllByRole('row'); - return within(firstDataRow).getAllByRole('cell')[columnIndex]; + return Array.from( + firstDataRow.querySelectorAll('[role="rowheader"], [role="gridcell"]') + )[columnIndex]; }; const getConfigFormData = () => { @@ -320,10 +324,14 @@ describe('AppRunsHistory websocket merge', () => { .findIndex((header) => header.textContent === 'label.triggered-by'); expect( - within(firstRow).getAllByRole('cell')[triggeredByIndex] + Array.from( + firstRow.querySelectorAll('[role="rowheader"], [role="gridcell"]') + )[triggeredByIndex] ).toHaveTextContent('alice'); expect( - within(secondRow).getAllByRole('cell')[triggeredByIndex] + Array.from( + secondRow.querySelectorAll('[role="rowheader"], [role="gridcell"]') + )[triggeredByIndex] ).toHaveTextContent('bob'); }); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppRunsHistory/AppRunsHistory.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppRunsHistory/AppRunsHistory.test.tsx index c98ecc95fa06..4b77d46a726d 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppRunsHistory/AppRunsHistory.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppRunsHistory/AppRunsHistory.test.tsx @@ -16,10 +16,8 @@ import { render, screen, waitForElementToBeRemoved, - within, } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { Table as AntdTable } from 'antd'; import React from 'react'; import { AppType } from '../../../../generated/entity/applications/app'; import { Status } from '../../../../generated/entity/applications/appRunRecord'; @@ -148,11 +146,15 @@ jest.mock('../../../common/ErrorWithPlaceholder/ErrorPlaceHolder', () => ); jest.mock('../../../common/Table/TableV2', () => { + const ActualTable = jest.requireActual( + '../../../common/Table/TableV2' + ).default; + return jest .fn() .mockImplementation(({ loading, customPaginationProps, ...rest }) => (
    - {loading ?

    TableLoader

    : } + {loading ?

    TableLoader

    : } {customPaginationProps && ( + ))} + + + )} + + ); +}; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/MarketPlaceAppDetails/MarketPlaceAppDetails.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/MarketPlaceAppDetails/MarketPlaceAppDetails.component.tsx index b5f708ca523f..4a457e973a14 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/MarketPlaceAppDetails/MarketPlaceAppDetails.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/MarketPlaceAppDetails/MarketPlaceAppDetails.component.tsx @@ -13,16 +13,18 @@ import { LeftOutlined } from '@ant-design/icons'; import { + Alert, Box, Button as CoreButton, Grid, Tooltip, Typography, } from '@openmetadata/ui-core-components'; -import { Alert, Button, Carousel } from 'antd'; +import { Button } from 'antd'; import { AxiosError } from 'axios'; -import { uniqueId } from 'lodash'; -import { useCallback, useEffect, useMemo, useState } from 'react'; +import { AppScreenshots } from './AppScreenshots'; + +import { Fragment, useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router-dom'; import { ReactComponent as CheckMarkIcon } from '../../../../assets/svg/ic-cloud-checkmark.svg'; @@ -70,10 +72,15 @@ const MarketPlaceAppDetails = () => { const imageSrc = imageModule.default; return ( - {screenshotName} + {screenshotName} ); } catch (error) { - return <>; + return ; } }; @@ -194,7 +201,8 @@ const MarketPlaceAppDetails = () => { {isAppDisabled && ( {t('message.cache-service-not-configured-message')} @@ -222,7 +230,7 @@ const MarketPlaceAppDetails = () => { ) } - type="info" + variant="brand" /> )}
    @@ -320,21 +328,7 @@ const MarketPlaceAppDetails = () => { - - {appScreenshots.map((data) => ( -
    - {data} -
    - ))} -
    +
    diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Services/Ingestion/AddIngestionButton.interface.ts b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Services/Ingestion/AddIngestionButton.interface.ts index 08b83b015fba..f0f0a10bd8e2 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Services/Ingestion/AddIngestionButton.interface.ts +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Services/Ingestion/AddIngestionButton.interface.ts @@ -11,11 +11,11 @@ * limitations under the License. */ -import { MenuProps } from 'antd'; import { ServiceCategory } from '../../../../enums/service.enum'; import { PipelineType } from '../../../../generated/api/services/ingestionPipelines/createIngestionPipeline'; import { IngestionPipeline } from '../../../../generated/entity/services/ingestionPipelines/ingestionPipeline'; import { ServicesType } from '../../../../interface/service.interface'; +import { ManageMenuItem } from '../../../common/EntityPageInfos/ManageButton/ManageMenu'; export interface AddIngestionButtonProps { serviceDetails: ServicesType; @@ -23,5 +23,5 @@ export interface AddIngestionButtonProps { ingestionList: Array; serviceCategory: ServiceCategory; serviceName: string; - extraMenuItems?: MenuProps['items']; + extraMenuItems?: ManageMenuItem[]; } diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Services/Ingestion/IngestionStepper/IngestionStepper.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Services/Ingestion/IngestionStepper/IngestionStepper.component.tsx index 305baab42c4b..24f8a56df051 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Services/Ingestion/IngestionStepper/IngestionStepper.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Services/Ingestion/IngestionStepper/IngestionStepper.component.tsx @@ -11,7 +11,11 @@ * limitations under the License. */ -import { Steps } from 'antd'; +import { + ProgressStepItem, + ProgressSteps, +} from '@openmetadata/ui-core-components'; + import classNames from 'classnames'; import { useMemo } from 'react'; import './ingestion-stepper.style.less'; @@ -36,21 +40,20 @@ const IngestionStepper = ({ steps .filter((step) => !excludeSteps.includes(step.step)) .map((step) => { + let status: ProgressStepItem['status'] = 'incomplete'; + if (step.step === activeStep) { + status = 'current'; + } else if (step.step < activeStep) { + status = 'complete'; + } + + // Optional steps can leave gaps, so derive status from the original identifier. return { - icon: ( - + id: String(step.step), + title: ( + {step.name} ), - key: step.name, - title: step.name, + status, }; }), [steps, activeStep, excludeSteps] @@ -60,11 +63,11 @@ const IngestionStepper = ({
    -
    ); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Services/Ingestion/IngestionStepper/ingestion-stepper.style.less b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Services/Ingestion/IngestionStepper/ingestion-stepper.style.less index bf056f32e7f6..493224abf06f 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Services/Ingestion/IngestionStepper/ingestion-stepper.style.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Services/Ingestion/IngestionStepper/ingestion-stepper.style.less @@ -10,8 +10,3 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -.stepper-container { - .ant-steps-item-content { - width: 120px; - } -} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/SettingItemCard/SettingItemCard.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Settings/SettingItemCard/SettingItemCard.component.tsx index d801f533a1b5..9097c87b74df 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Settings/SettingItemCard/SettingItemCard.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/SettingItemCard/SettingItemCard.component.tsx @@ -12,8 +12,8 @@ */ import Icon from '@ant-design/icons/lib/components/Icon'; -import { Card, Typography } from '@openmetadata/ui-core-components'; -import { Badge } from 'antd'; +import { Badge, Card, Typography } from '@openmetadata/ui-core-components'; + import classNames from 'classnames'; import { useCallback } from 'react'; import { useTranslation } from 'react-i18next'; @@ -46,7 +46,9 @@ const SettingItemCard = ({
    {Boolean(data?.isBeta) && ( - + + {t('label.beta')} + )}
    diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Team/TeamDetails/TeamDetailsV1.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Team/TeamDetails/TeamDetailsV1.tsx index 1529c700f129..9175de901902 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Team/TeamDetails/TeamDetailsV1.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Team/TeamDetails/TeamDetailsV1.tsx @@ -12,6 +12,7 @@ */ import { + Avatar, Box, Button as CoreButton, Grid, @@ -21,8 +22,7 @@ import { Typography, } from '@openmetadata/ui-core-components'; import { Plus } from '@openmetadata/ui-core-components/icons'; -import { Avatar, Button, Modal } from 'antd'; -import { ItemType } from 'antd/lib/menu/hooks/useItems'; +import { Button, Modal } from 'antd'; import { AxiosError } from 'axios'; import { compare } from 'fast-json-patch'; import { cloneDeep, isEmpty, isUndefined } from 'lodash'; @@ -89,6 +89,7 @@ import { } from '../../../common/CustomPropertyTable/CustomPropertyTable.interface'; import Description from '../../../common/EntityDescription/Description'; import ManageButton from '../../../common/EntityPageInfos/ManageButton/ManageButton'; +import { ManageMenuItem as ItemType } from '../../../common/EntityPageInfos/ManageButton/ManageMenu'; import ErrorPlaceHolder from '../../../common/ErrorWithPlaceholder/ErrorPlaceHolder'; import Loader from '../../../common/Loader/Loader'; import { ManageButtonItemLabel } from '../../../common/ManageButtonContentItem/ManageButtonContentItem.component'; @@ -1035,9 +1036,16 @@ const TeamDetailsV1 = ({ {!isOrganization && }
    - - - + + + + } + size="md" + /> ({ TreeSelect.component
    )), - Alert: jest.fn().mockImplementation(() =>
    Alert
    ), })); jest.mock('../../../../rest/teamsAPI', () => ({ @@ -80,7 +79,7 @@ describe('TeamsSelectable component test', () => { }); }); - const noTeamsAlert = screen.getByText('Alert'); + const noTeamsAlert = screen.getByRole('alert'); expect(noTeamsAlert).toBeInTheDocument(); }); @@ -97,7 +96,7 @@ describe('TeamsSelectable component test', () => { }); }); - const noTeamsAlert = screen.queryByText('Alert'); + const noTeamsAlert = screen.queryByRole('alert'); expect(noTeamsAlert).toBeNull(); }); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Team/TeamsSelectable/TeamsSelectable.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Team/TeamsSelectable/TeamsSelectable.tsx index 7523d71715c3..31ecf3e0a135 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Team/TeamsSelectable/TeamsSelectable.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Team/TeamsSelectable/TeamsSelectable.tsx @@ -11,7 +11,8 @@ * limitations under the License. */ -import { Alert, TreeSelect } from 'antd'; +import { Alert } from '@openmetadata/ui-core-components'; +import { TreeSelect } from 'antd'; import { AxiosError } from 'axios'; import { isEmpty } from 'lodash'; @@ -117,10 +118,10 @@ const TeamsSelectable = ({ )} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Team/TeamsSelectable/TeamsSelectableNew.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Team/TeamsSelectable/TeamsSelectableNew.tsx index b50aeb644faf..a7e165416f11 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Team/TeamsSelectable/TeamsSelectableNew.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Team/TeamsSelectable/TeamsSelectableNew.tsx @@ -11,7 +11,8 @@ * limitations under the License. */ -import { Alert, TreeSelect } from 'antd'; +import { Alert } from '@openmetadata/ui-core-components'; +import { TreeSelect } from 'antd'; import { AxiosError } from 'axios'; import { isEmpty } from 'lodash'; @@ -137,10 +138,10 @@ const TeamsSelectableNew = forwardRef( )} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/AdminPermissionDebugger/AdminPermissionDebugger.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/AdminPermissionDebugger/AdminPermissionDebugger.component.tsx index 386564f538ca..ef6ef6649d49 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/AdminPermissionDebugger/AdminPermissionDebugger.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/AdminPermissionDebugger/AdminPermissionDebugger.component.tsx @@ -12,7 +12,7 @@ */ import { Box, Card, Grid, Typography } from '@openmetadata/ui-core-components'; -import { AutoComplete, Button, Form, Input, Select, Spin } from 'antd'; +import { AutoComplete, Button, Form, Input, Select } from 'antd'; import { AxiosError } from 'axios'; import { debounce } from 'lodash'; import React, { useCallback, useMemo, useState } from 'react'; @@ -30,6 +30,7 @@ import { searchQuery } from '../../../../rest/searchAPI'; import { getLayoutGutter } from '../../../../utils/common/layout.utils'; import { getSettingPageEntityBreadCrumb } from '../../../../utils/GlobalSettingsUtils'; import { showErrorToast } from '../../../../utils/ToastUtils'; +import Loader from '../../../common/Loader/Loader'; import TitleBreadcrumb from '../../../common/TitleBreadcrumb/TitleBreadcrumb.component'; import { TitleBreadcrumbProps } from '../../../common/TitleBreadcrumb/TitleBreadcrumb.interface'; import PageLayoutV1 from '../../../PageLayoutV1/PageLayoutV1'; @@ -382,7 +383,7 @@ const AdminPermissionDebugger: React.FC = () => { : null + searchingUsers ? : null } options={userOptions} placeholder={t('label.search-entity', { @@ -509,7 +510,7 @@ const AdminPermissionDebugger: React.FC = () => { {loadingPermissions && (
    - +
    )} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UserProfileIcon/UserProfileIcon.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UserProfileIcon/UserProfileIcon.component.tsx index 1c936710495b..57add36c3b54 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UserProfileIcon/UserProfileIcon.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UserProfileIcon/UserProfileIcon.component.tsx @@ -14,10 +14,11 @@ import { Badge, Dropdown, + RadioButtonBase, Tooltip, Typography, } from '@openmetadata/ui-core-components'; -import { Radio } from 'antd'; + import { isEmpty, orderBy } from 'lodash'; import { FC, @@ -185,7 +186,7 @@ export const UserProfileIcon = () => { {defaultPersona?.id === item.id && ( { )}
    - + {selectedPersona?.id === item.id && ( + {t('label.selected')} + )} +
    ), [selectedPersona, defaultPersona, t] diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UserProfileIcon/UserProfileIcon.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UserProfileIcon/UserProfileIcon.test.tsx index f84974693c4e..38c5483194a5 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UserProfileIcon/UserProfileIcon.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UserProfileIcon/UserProfileIcon.test.tsx @@ -211,7 +211,6 @@ describe('UserProfileIcon', () => { personaLabels = screen.getAllByTestId('persona-label'); expect(personaLabels).toHaveLength(3); - expect(screen.getAllByRole('radio')).toHaveLength(3); }); it('should handle persona selection', async () => { @@ -262,7 +261,7 @@ describe('UserProfileIcon', () => { await openDropdown(); expect(screen.queryByTestId('default-persona-tag')).not.toBeInTheDocument(); - expect(screen.getAllByRole('radio').length).toBeGreaterThan(0); + expect(screen.getAllByTestId('persona-label').length).toBeGreaterThan(0); }); it('should update dropdown labels when language changes', async () => { diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UsersProfile/UserPermissions/UserPermissions.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UsersProfile/UserPermissions/UserPermissions.component.tsx index 07ebd7a349fd..57aef426323e 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UsersProfile/UserPermissions/UserPermissions.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UsersProfile/UserPermissions/UserPermissions.component.tsx @@ -12,6 +12,10 @@ */ import { + Accordion, + AccordionHeader, + AccordionItem, + AccordionPanel, Badge, Box, Card, @@ -19,7 +23,7 @@ import { Grid, Typography, } from '@openmetadata/ui-core-components'; -import { Collapse, Spin } from 'antd'; + import { AxiosError } from 'axios'; import { isEmpty } from 'lodash'; import React, { useEffect, useState } from 'react'; @@ -46,10 +50,9 @@ import { getTeamsWithFqnPath, } from '../../../../../utils/RouterUtils'; import { showErrorToast } from '../../../../../utils/ToastUtils'; +import Loader from '../../../../common/Loader/Loader'; import './UserPermissions.style.less'; -const { Panel } = Collapse; - interface UserPermissionsProps { username: string; isLoggedInUser: boolean; @@ -170,41 +173,54 @@ const UserPermissions: React.FC = ({ policy.effect === 'ALLOW' ? 'success' : nonAllowPolicyColor; return ( - - - - {getEntityName(policy.policy)} - - - {policy.effect} - - - {policy.rules.length} - {t('label.rule-lowercase-plural')} - + + + + + {t('label.detail-plural')} + + + + + {getEntityName(policy.policy)} + + + {policy.effect} + + + {policy.rules.length} + {t('label.rule-lowercase-plural')} + + - } - key={index}> -
    - {policy.rules.map((rule, ruleIndex) => renderRule(rule, ruleIndex))} -
    -
    -
    + + +
    + {policy.rules.map((rule, ruleIndex) => + renderRule(rule, ruleIndex) + )} +
    +
    + + ); }; @@ -593,7 +609,7 @@ const UserPermissions: React.FC = ({ if (loading) { return (
    - +
    ); } diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UsersProfile/UserPermissions/UserPermissions.style.less b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UsersProfile/UserPermissions/UserPermissions.style.less index 1746a107c88f..471af7456ff9 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UsersProfile/UserPermissions/UserPermissions.style.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UsersProfile/UserPermissions/UserPermissions.style.less @@ -24,16 +24,6 @@ min-height: 400px; } - .policy-collapse { - .ant-collapse-header { - padding-left: 0 !important; - } - - .ant-collapse-content-box { - padding-left: var(--om-space-24); - } - } - .rule-item { padding: var(--om-space-12); background-color: @grey-1; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UsersProfile/UserProfileImage/UserProfileImage.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UsersProfile/UserProfileImage/UserProfileImage.component.tsx index 39d7e91186c3..16634b762988 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UsersProfile/UserProfileImage/UserProfileImage.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/UsersProfile/UserProfileImage/UserProfileImage.component.tsx @@ -11,7 +11,6 @@ * limitations under the License. */ -import { Image } from 'antd'; import { useEffect, useMemo, useState } from 'react'; import { getEntityName } from '../../../../../utils/EntityNameUtils'; import { @@ -39,13 +38,12 @@ const UserProfileImage = ({ userData }: UserProfileImageProps) => { className="profile-image-container" data-testid="profile-image-container"> {isImgUrlValid ? ( - { + onErrorCapture={() => { setIsImgUrlValid(false); }} /> diff --git a/openmetadata-ui/src/main/resources/ui/src/components/SettingsSso/SSOGroupedFieldTemplate/SSOGroupedFieldTemplate.tsx b/openmetadata-ui/src/main/resources/ui/src/components/SettingsSso/SSOGroupedFieldTemplate/SSOGroupedFieldTemplate.tsx index 1c134e20eef3..d68f82b03d3a 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/SettingsSso/SSOGroupedFieldTemplate/SSOGroupedFieldTemplate.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/SettingsSso/SSOGroupedFieldTemplate/SSOGroupedFieldTemplate.tsx @@ -12,12 +12,18 @@ */ import { PlusOutlined } from '@ant-design/icons'; -import { Box } from '@openmetadata/ui-core-components'; +import { + Accordion, + AccordionHeader, + AccordionItem, + AccordionPanel, + Box, +} from '@openmetadata/ui-core-components'; import { ObjectFieldTemplatePropertyType, ObjectFieldTemplateProps, } from '@rjsf/utils'; -import { Button, Collapse } from 'antd'; +import { Button } from 'antd'; import classNames from 'classnames'; import { isEmpty, isUndefined } from 'lodash'; import { createElement, Fragment, FunctionComponent } from 'react'; @@ -458,36 +464,40 @@ export const SSOGroupedFieldTemplate: FunctionComponent< })} {!isEmpty(advancedProperties) && ( - + {/* Advanced fields must stay mounted: transformErrors discards any error whose field is absent from the DOM, so destroying the collapsed panel silently swallowed both client and server validation errors for fields like tokenValidity instead of surfacing them. */} - -
    - {advancedProperties.map((element) => ( -
    - {element.content} -
    - ))} -
    -
    -
    + + + {t('label.advanced-config')} + + +
    + {advancedProperties.map((element) => ( +
    + {element.content} +
    + ))} +
    +
    +
    + )} ); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/SettingsSso/SSOGroupedFieldTemplate/sso-grouped-field-template.less b/openmetadata-ui/src/main/resources/ui/src/components/SettingsSso/SSOGroupedFieldTemplate/sso-grouped-field-template.less index f71f65e79c90..255c6add846f 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/SettingsSso/SSOGroupedFieldTemplate/sso-grouped-field-template.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/SettingsSso/SSOGroupedFieldTemplate/sso-grouped-field-template.less @@ -162,27 +162,3 @@ align-items: center; gap: @size-xs; } - -.ant-collapse.sso-advanced-properties-collapse { - border-radius: @border-rad-xs; - - .ant-collapse-item { - border-radius: @border-rad-xs; - - .ant-collapse-header { - background: @grey-9; - border-radius: @border-rad-xs; - } - .ant-collapse-content { - border: none; - border-radius: 0 0 @border-rad-xs @border-rad-xs; - .ant-collapse-content-box { - padding: 0; - border-radius: 0 0 @border-rad-xs @border-rad-xs; - .sso-field-group-box { - border-radius: 0 0 @border-rad-xs @border-rad-xs; - } - } - } - } -} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Topic/TopicSchema/TopicSchema.interface.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Topic/TopicSchema/TopicSchema.interface.tsx index 5fd3d1a58de5..d5b3d7e8bc3b 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Topic/TopicSchema/TopicSchema.interface.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Topic/TopicSchema/TopicSchema.interface.tsx @@ -11,9 +11,9 @@ * limitations under the License. */ -import { TableProps } from 'antd'; import { HTMLAttributes, ReactNode } from 'react'; import { Field } from '../../../generated/entity/data/topic'; +import { TableProps } from '../../common/Table/Table.interface'; export interface TopicSchemaFieldsProps extends HTMLAttributes> { diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/CollapseHeader/CollapseHeader.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/CollapseHeader/CollapseHeader.tsx index 1c42e5033f16..1e41e0ec5285 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/CollapseHeader/CollapseHeader.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/CollapseHeader/CollapseHeader.tsx @@ -10,8 +10,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Button, Dropdown, Typography } from '@openmetadata/ui-core-components'; +import { Box, Button, Dropdown } from '@openmetadata/ui-core-components'; import { Plus } from '@openmetadata/ui-core-components/icons'; +import { ReactNode } from 'react'; import { useTranslation } from 'react-i18next'; export interface CollapseHeaderMenuItem { @@ -21,7 +22,7 @@ export interface CollapseHeaderMenuItem { } interface CollapseHeaderProps { - title: string; + title: ReactNode; menuItems?: CollapseHeaderMenuItem[]; handleAddNewBoost?: () => void; dataTestId?: string; @@ -37,7 +38,7 @@ const CollapseHeader = ({ return (
    - {title} + {title} {menuItems ? (
    )}
    diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/ErrorBoundary/ErrorFallback.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/ErrorBoundary/ErrorFallback.tsx index 509d3d5c8e40..051cb83527dc 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/ErrorBoundary/ErrorFallback.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/ErrorBoundary/ErrorFallback.tsx @@ -11,7 +11,8 @@ * limitations under the License. */ -import { Button, Result } from 'antd'; +import { EmptyPlaceholder } from '@openmetadata/ui-core-components'; +import { Button } from 'antd'; import React from 'react'; import { FallbackProps } from 'react-error-boundary'; @@ -51,9 +52,10 @@ const ErrorFallback: React.FC = ({ }; return ( - = ({ } icon={} - subTitle={message} title={title} + width="100%" /> ); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/FilterPattern/FilterPattern.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/FilterPattern/FilterPattern.tsx index a2aade4d277c..2e7c2963bcfb 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/FilterPattern/FilterPattern.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/FilterPattern/FilterPattern.tsx @@ -13,11 +13,12 @@ import { Box, + Checkbox, Divider, Grid, Typography, } from '@openmetadata/ui-core-components'; -import { Checkbox, Select } from 'antd'; +import { Select } from 'antd'; import { capitalize } from 'lodash'; import { useTranslation } from 'react-i18next'; import { getLayoutGutter } from '../../../utils/common/layout.utils'; @@ -48,13 +49,14 @@ const FilterPattern = ({ handleChecked(e.target.checked)} + onChange={(e) => handleChecked(e)} />
    diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/Form/FormItemLabel.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/Form/FormItemLabel.tsx index 9ba0851b19cf..2a26df4e6fbc 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/Form/FormItemLabel.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/Form/FormItemLabel.tsx @@ -12,12 +12,11 @@ */ import { InfoCircleOutlined } from '@ant-design/icons'; -import { Tooltip } from '@openmetadata/ui-core-components'; -import { Badge } from 'antd'; +import { Badge, Tooltip } from '@openmetadata/ui-core-components'; + import classNames from 'classnames'; import { useTranslation } from 'react-i18next'; import { GRAYED_OUT_COLOR } from '../../../constants/constants'; -import { useApplicationStore } from '../../../hooks/useApplicationStore'; import { HelperTextType } from '../../../interface/FormUtils.interface'; import { FormItemLabelProps } from './Form.interface'; @@ -32,7 +31,6 @@ const FormItemLabel = ({ betaBadgeClassName, }: FormItemLabelProps) => { const { t } = useTranslation(); - const { theme } = useApplicationStore(); return ( <> @@ -60,10 +58,10 @@ const FormItemLabel = ({ {isBeta && ( + color="brand" + size="sm"> + {t('label.beta')} + )} ); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JSONSchemaTemplate/ObjectFieldTemplate.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JSONSchemaTemplate/ObjectFieldTemplate.test.tsx index 4a837e01a129..c9d23cf89599 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JSONSchemaTemplate/ObjectFieldTemplate.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JSONSchemaTemplate/ObjectFieldTemplate.test.tsx @@ -121,7 +121,7 @@ describe('ObjectFieldTemplate', () => { ); - const collapse = container.querySelector('.ant-collapse'); + const collapse = container.querySelector('.advanced-properties-collapse'); expect(collapse).toBeInTheDocument(); @@ -138,7 +138,7 @@ describe('ObjectFieldTemplate', () => { ); // The collapse should exist - const collapse = container.querySelector('.ant-collapse'); + const collapse = container.querySelector('.advanced-properties-collapse'); expect(collapse).toBeInTheDocument(); @@ -154,7 +154,9 @@ describe('ObjectFieldTemplate', () => { it('should not render collapse when no advanced properties', () => { const { container } = render(); - expect(container.querySelector('.ant-collapse')).not.toBeInTheDocument(); + expect( + container.querySelector('.advanced-properties-collapse') + ).not.toBeInTheDocument(); }); it('should separate normal and advanced properties correctly', () => { @@ -163,7 +165,7 @@ describe('ObjectFieldTemplate', () => { ); // Check that collapse exists for advanced properties - const collapse = container.querySelector('.ant-collapse'); + const collapse = container.querySelector('.advanced-properties-collapse'); expect(collapse).toBeInTheDocument(); @@ -380,7 +382,9 @@ describe('ObjectFieldTemplate', () => { ); - expect(container.querySelector('.ant-collapse')).toBeInTheDocument(); + expect( + container.querySelector('.advanced-properties-collapse') + ).toBeInTheDocument(); // Advanced properties are in collapsed panel, so check for the header const collapseHeader = screen.getByRole('button', { diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JSONSchemaTemplate/ObjectFieldTemplate.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JSONSchemaTemplate/ObjectFieldTemplate.tsx index 800b85df0124..e750cb95cd3c 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JSONSchemaTemplate/ObjectFieldTemplate.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JSONSchemaTemplate/ObjectFieldTemplate.tsx @@ -12,12 +12,18 @@ */ import { PlusOutlined } from '@ant-design/icons'; -import { Box } from '@openmetadata/ui-core-components'; +import { + Accordion, + AccordionHeader, + AccordionItem, + AccordionPanel, + Box, +} from '@openmetadata/ui-core-components'; import { ObjectFieldTemplatePropertyType, ObjectFieldTemplateProps, } from '@rjsf/utils'; -import { Button, Collapse } from 'antd'; +import { Button } from 'antd'; import classNames from 'classnames'; import { isEmpty, isUndefined } from 'lodash'; import { createElement, Fragment, FunctionComponent } from 'react'; @@ -26,8 +32,6 @@ import { ADVANCED_PROPERTIES } from '../../../../../constants/Services.constant' import serviceUtilClassBase from '../../../../../utils/ServiceUtilClassBase'; import './object-field-template.less'; -const { Panel } = Collapse; - interface PropertyMap { advancedProperties: ObjectFieldTemplatePropertyType[]; normalProperties: ObjectFieldTemplatePropertyType[]; @@ -136,22 +140,26 @@ export const ObjectFieldTemplate: FunctionComponent<
    ))} {!isEmpty(advancedProperties) && ( - - - {advancedProperties.map((element) => ( -
    - {element.content} -
    - ))} -
    -
    + + + {`${title} ${t( + 'label.advanced-config' + )}`} + + {advancedProperties.map((element) => ( +
    + {element.content} +
    + ))} +
    +
    +
    )}
    ); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JSONSchemaTemplate/object-field-template.less b/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JSONSchemaTemplate/object-field-template.less index 84490821cffa..493224abf06f 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JSONSchemaTemplate/object-field-template.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JSONSchemaTemplate/object-field-template.less @@ -10,17 +10,3 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -.advanced-properties-collapse { - .ant-collapse-item { - .ant-collapse-content { - background-color: inherit; - border-top: none; - } - .ant-collapse-content > .ant-collapse-content-box { - padding-left: var(--om-space-20); - } - .ant-collapse-header > .ant-collapse-header-text { - font-size: var(--om-font-size-md); - } - } -} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JsonSchemaWidgets/ManifestJsonWidget/ManifestJsonWidget.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JsonSchemaWidgets/ManifestJsonWidget/ManifestJsonWidget.tsx index 04ec48666558..2317dc0bf313 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JsonSchemaWidgets/ManifestJsonWidget/ManifestJsonWidget.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/Form/JSONSchema/JsonSchemaWidgets/ManifestJsonWidget/ManifestJsonWidget.tsx @@ -10,9 +10,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Typography } from '@openmetadata/ui-core-components'; +import { Alert, Typography } from '@openmetadata/ui-core-components'; import { WidgetProps } from '@rjsf/utils'; -import { Alert } from 'antd'; + import { TFunction } from 'i18next'; import { lazy, useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; @@ -159,22 +159,22 @@ const ManifestJsonWidget = ({ {t('label.valid-manifest-entry-count', { count: validation.entryCount, })} } - type="success" + variant="success" /> )} {validation.status === 'error' && ( )}
    diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/LimitBanner/LimitBanner.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/LimitBanner/LimitBanner.tsx index d29f673cc017..c4aded7a576a 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/LimitBanner/LimitBanner.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/LimitBanner/LimitBanner.tsx @@ -11,7 +11,6 @@ * limitations under the License. */ import Icon from '@ant-design/icons'; -import { Header } from 'antd/lib/layout/layout'; import classNames from 'classnames'; import { useTranslation } from 'react-i18next'; import { Link } from 'react-router-dom'; @@ -29,7 +28,7 @@ export const LimitBanner = () => { const showBanner = bannerDetails && !(isTourOpen || isTourPage); return ( -
    { style={{ color: '#546E7A', fontSize: '14px' }} onClick={() => setBannerDetails(null)} /> -
    + ); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/SummaryCard/SummaryCard.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/SummaryCard/SummaryCard.component.tsx index e128539ead0b..752a912da8f5 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/SummaryCard/SummaryCard.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/SummaryCard/SummaryCard.component.tsx @@ -12,15 +12,15 @@ */ import { Box, + ProgressBarCircle, SkeletonParagraph, Typography, } from '@openmetadata/ui-core-components'; -import { Progress } from 'antd'; + import classNames from 'classnames'; import { isNumber, round } from 'lodash'; import { useMemo } from 'react'; import { formatNumberWithComma } from '../../../utils/NumberUtils'; -import { progressBarFormatter } from '../../../utils/ProgressBar/ProgressBar.utils'; import './summary-card.style.less'; import { SummaryCardProps } from './SummaryCard.interface'; @@ -38,7 +38,8 @@ export const SummaryCard = ({ }: SummaryCardProps) => { const percent = useMemo(() => { if (isNumber(value)) { - return round((value / total) * 100, 1); + // Empty summaries have no completed work; dividing by zero would produce an invalid progress value. + return round((total > 0 ? value / total : 0) * 100, 1); } return 0; @@ -92,14 +93,24 @@ export const SummaryCard = ({ {showProgressBar && ( - +
    + `${percent}%`} + /> +
    )} ); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/SummaryCard/SummaryCard.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/SummaryCard/SummaryCard.test.tsx index 14b7039cbe63..215b98ef10c0 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/SummaryCard/SummaryCard.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/SummaryCard/SummaryCard.test.tsx @@ -21,6 +21,16 @@ const mockProps: SummaryCardProps = { }; describe('SummaryCard component', () => { + it('shows zero progress for an empty summary', () => { + render(); + + expect(screen.getByRole('progressbar')).toHaveAttribute( + 'aria-valuenow', + '0' + ); + expect(screen.getByText('0%')).toBeInTheDocument(); + }); + it('component should render', async () => { render(); @@ -31,13 +41,13 @@ describe('SummaryCard component', () => { expect( await screen.findByTestId('summary-card-description') ).toBeInTheDocument(); - expect(await screen.findByRole('presentation')).toBeInTheDocument(); + expect(await screen.findByRole('progressbar')).toBeInTheDocument(); }); it('should not render progress bar, if showProgressBar is false', async () => { render(); - expect(screen.queryByRole('presentation')).not.toBeInTheDocument(); + expect(screen.queryByRole('progressbar')).not.toBeInTheDocument(); }); it('should not render skeleton loader, if isLoading is true', async () => { diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/SummaryCard/summary-card.style.less b/openmetadata-ui/src/main/resources/ui/src/components/common/SummaryCard/summary-card.style.less index 48ac41865f4b..2ede99d2c8f6 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/SummaryCard/summary-card.style.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/SummaryCard/summary-card.style.less @@ -36,12 +36,6 @@ margin-bottom: 0; } - .ant-progress-circle { - .ant-progress-text { - font-weight: var(--om-font-weight-medium); - } - } - &.bg-success { background-color: @green-8; } @@ -54,53 +48,4 @@ &.bg-primary { background-color: @blue-8; } - - .new.ant-progress-circle { - .ant-progress-circle-path { - stroke: @blue-3 !important; - } - .ant-progress-text { - color: @blue-3; - } - } - .success.ant-progress-circle { - .ant-progress-circle-path { - stroke: @green-3 !important; - } - .ant-progress-text { - color: @green-3; - } - } - .aborted.ant-progress-circle { - .ant-progress-circle-path { - stroke: @yellow-2 !important; - } - .ant-progress-text { - color: @yellow-2; - } - } - .failed.ant-progress-circle { - .ant-progress-circle-path { - stroke: @red-3 !important; - } - .ant-progress-text { - color: @red-3; - } - } - .acknowledged.ant-progress-circle { - .ant-progress-circle-path { - stroke: @blue-2 !important; - } - .ant-progress-text { - color: @blue-2; - } - } - .assigned.ant-progress-circle { - .ant-progress-circle-path { - stroke: @purple-3 !important; - } - .ant-progress-text { - color: @purple-3; - } - } } diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/TableDataCardV2/TableDataCardV2.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/TableDataCardV2/TableDataCardV2.tsx index 5755dc8fa0a2..86a45555041e 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/TableDataCardV2/TableDataCardV2.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/TableDataCardV2/TableDataCardV2.tsx @@ -11,8 +11,8 @@ * limitations under the License. */ -import { Box, Owner } from '@openmetadata/ui-core-components'; -import { Checkbox } from 'antd'; +import { Box, Checkbox, Owner } from '@openmetadata/ui-core-components'; + import classNames from 'classnames'; import { isString, startCase } from 'lodash'; import { ExtraInfo } from 'Models'; @@ -174,7 +174,12 @@ const TableDataCardV2: React.FC = forwardRef< style={{ flex: '0 0 20px' }}> {/* Same test id as ExploreSearchCard's checkbox, so Playwright selects assets in this modal and in the asset tabs the same way. */} - + handleSummaryPanelDisplay?.(source, tab)} + /> )} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/TabsLabel/TabsLabel.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/TabsLabel/TabsLabel.component.tsx index 4d89c4877f3e..f031461db71b 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/TabsLabel/TabsLabel.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/TabsLabel/TabsLabel.component.tsx @@ -10,8 +10,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Skeleton, useTabItemState } from '@openmetadata/ui-core-components'; -import { Badge } from 'antd'; +import { + Badge, + Skeleton, + useTabItemState, +} from '@openmetadata/ui-core-components'; + import { isNil } from 'lodash'; import { useTranslation } from 'react-i18next'; import { getCountBadge } from '../../../utils/EntityDisplayPureUtils'; @@ -51,7 +55,9 @@ const TabsLabel = ({ ) )} {isBeta && ( - + + {t('label.beta')} + )} {/* Note: add ".custom-menu-with-description" class in Menu component if need description in menu */} diff --git a/openmetadata-ui/src/main/resources/ui/src/interface/sidebar.interface.ts b/openmetadata-ui/src/main/resources/ui/src/interface/sidebar.interface.ts index 8c1087a4cdf1..6bd50fc689ed 100644 --- a/openmetadata-ui/src/main/resources/ui/src/interface/sidebar.interface.ts +++ b/openmetadata-ui/src/main/resources/ui/src/interface/sidebar.interface.ts @@ -31,3 +31,10 @@ export interface LeftSidebarItem { */ onClick?: () => void; } + +export interface NavigationTreeNode { + key: string; + title: string; + icon?: SvgComponent; + children?: NavigationTreeNode[]; +} diff --git a/openmetadata-ui/src/main/resources/ui/src/interface/tree.interface.ts b/openmetadata-ui/src/main/resources/ui/src/interface/tree.interface.ts new file mode 100644 index 000000000000..d7431ae7e6aa --- /dev/null +++ b/openmetadata-ui/src/main/resources/ui/src/interface/tree.interface.ts @@ -0,0 +1,21 @@ +/* + * 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 { ReactNode } from 'react'; + +export interface TreeNode { + key: string | number; + title: ReactNode; + icon?: ReactNode; + isLeaf?: boolean; + children?: TreeNode[]; +} diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ar-sa.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ar-sa.json index d7b9a6cf80c5..04ad66a839ab 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ar-sa.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ar-sa.json @@ -4662,6 +4662,7 @@ "need-help-message": "هل تحتاج مساعدة؟ <0>{{doc}}.", "new-conversation": "أنت تبدأ محادثة جديدة", "new-to-the-platform": "هل أنت جديد على المنصة؟", + "new-version-available": "يتوفر إصدار جديد", "no-access-placeholder": "ليس لديك الصلاحيات اللازمة. يرجى التحقق مع المسؤول للحصول على صلاحية <0>{{entity}}.", "no-access-token-subtitle": "Generate a token to start making authenticated API calls. You can revoke it any time.", "no-access-token-title": "No personal access token yet", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "جارٍ إعادة التوجيه إلى الصفحة الرئيسية", "refer-to-our-doc": "هل ما زلت بحاجة إلى مساعدة؟ ارجع إلى <0>{{doc}} الخاص بنا لمزيد من المعلومات.", "refresh-frequency-contract-description": "التردد المتوقع لتحديثات البيانات", + "refresh-page-recommended": "للحصول على تجربة سلسة، نوصي بتحديث الصفحة.", "relation-color-tooltip": "رمز لون سداسي عشري يستخدم لتصور نوع العلاقة هذا في رسم الأنطولوجيا البياني (مثلاً، #1890ff).", "relation-type-in-use-count": "مستخدم بواسطة {{count}} علاقة مصطلح", "relation-type-not-in-use": "غير مستخدم حالياً", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "حلّ {{user}} الحادثة", "task-event-rejected": "{{user}} رفض هذه المهمة", "task-event-revoked": "{{user}} ألغى هذا الطلب", + "task-form-builder-description": "استخدم المنشئ لنماذج الإنشاء والحل والانتقال وتعيينات المراحل. تظل محررات JSON متاحة ضمن الخيارات المتقدمة.", + "task-form-builder-title": "تصميم نماذج المهام بصريًا", "task-opened-by": "فتحها {{user}} {{time}}", "task-opened-this-incident": "{{user}} فتح هذه الحادثة {{time}}", "task-outcome-by-on": "{{status}} بواسطة {{user}} في {{date}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/de-de.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/de-de.json index 9e953b001aeb..d64f40a2fd48 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/de-de.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/de-de.json @@ -4662,6 +4662,7 @@ "need-help-message": "Brauchen Sie Hilfe? <0>{{doc}}.", "new-conversation": "Sie beginnen eine neue Konversation.", "new-to-the-platform": "Neu auf der Plattform?", + "new-version-available": "Eine neue Version ist verfügbar", "no-access-placeholder": "Sie haben nicht die erforderlichen Berechtigungen. Bitte wenden Sie sich an den Administrator, um die Berechtigung für <0>{{entity}} zu erhalten.", "no-access-token-subtitle": "Generieren Sie ein Token, um mit authentifizierten API-Aufrufen zu beginnen. Sie können es jederzeit widerrufen.", "no-access-token-title": "Noch kein persönliches Zugriffstoken", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "Umleitung zur Startseite", "refer-to-our-doc": "Brauchen Sie immer noch Hilfe? Siehe unser <0>{{doc}} für weitere Informationen.", "refresh-frequency-contract-description": "Erwartete Häufigkeit von Datenaktualisierungen", + "refresh-page-recommended": "Für eine reibungslose Nutzung empfehlen wir, die Seite neu zu laden.", "relation-color-tooltip": "Hexadezimaler Farbcode zur Visualisierung dieses Beziehungstyps im Ontologie-Graphen (z.B. #1890ff).", "relation-type-in-use-count": "Verwendet von {{count}} Begriffsbeziehung(en)", "relation-type-not-in-use": "Derzeit nicht in Verwendung", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "{{user}} hat den Vorfall gelöst", "task-event-rejected": "{{user}} hat diese Aufgabe abgelehnt", "task-event-revoked": "{{user}} hat diese Anfrage widerrufen", + "task-form-builder-description": "Verwenden Sie den Builder für Erstellungs-, Lösungs- und Übergangsformulare sowie Phasenzuordnungen. Die JSON-Editoren sind weiterhin unter Erweitert verfügbar.", + "task-form-builder-title": "Aufgabenformulare visuell gestalten", "task-opened-by": "Eröffnet von {{user}} {{time}}", "task-opened-this-incident": "{{user}} hat diesen Vorfall {{time}} eröffnet", "task-outcome-by-on": "{{status}} von {{user}} am {{date}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json index e5557d6c7011..dba5f66691e3 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json @@ -4662,6 +4662,7 @@ "need-help-message": "Need help? <0>{{doc}}.", "new-conversation": "You are starting a new conversation", "new-to-the-platform": "New to the platform?", + "new-version-available": "A new version is available", "no-access-placeholder": "You don't have necessary permissions. Please check with the admin to get the <0>{{entity}} permission.", "no-access-token-subtitle": "Generate a token to start making authenticated API calls. You can revoke it any time.", "no-access-token-title": "No personal access token yet", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "Redirecting to the home page", "refer-to-our-doc": "Still need help? Refer to our <0>{{doc}} for more information.", "refresh-frequency-contract-description": "Expected frequency of data updates", + "refresh-page-recommended": "For a seamless experience, we recommend refreshing the page.", "relation-color-tooltip": "Hex color code used to visualize this relation type in the ontology graph (e.g., #1890ff).", "relation-type-in-use-count": "Used by {{count}} term relation(s)", "relation-type-not-in-use": "Not currently in use", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "{{user}} resolved the incident", "task-event-rejected": "{{user}} rejected this task", "task-event-revoked": "{{user}} revoked this request", + "task-form-builder-description": "Use the builder for create forms, resolve forms, transition forms, and stage mappings. The raw JSON editors are still available under Advanced.", + "task-form-builder-title": "Design task forms visually", "task-opened-by": "Opened by {{user}} {{time}}", "task-opened-this-incident": "{{user}} opened this incident {{time}}", "task-outcome-by-on": "{{status}} by {{user}} on {{date}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/es-es.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/es-es.json index 9a3117b229b0..ffb3cb045509 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/es-es.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/es-es.json @@ -4662,6 +4662,7 @@ "need-help-message": "¿Necesitas ayuda? <0>{{doc}}.", "new-conversation": "Estás iniciando una nueva conversación", "new-to-the-platform": "¿Nuevo en la plataforma?", + "new-version-available": "Hay una nueva versión disponible", "no-access-placeholder": "No tienes los permisos necesarios. Por favor, contacta con el administrador para obtener el permiso de <0>{{entity}}.", "no-access-token-subtitle": "Genera un token para empezar a realizar llamadas autenticadas a la API. Puedes revocarlo en cualquier momento.", "no-access-token-title": "Aún no hay ningún token de acceso personal", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "Redirigiendo a la página principal", "refer-to-our-doc": "¿Necesitas más ayuda? Consulta nuestra <0>{{doc}} para obtener más información.", "refresh-frequency-contract-description": "Frecuencia esperada de actualizaciones de datos", + "refresh-page-recommended": "Para una experiencia fluida, recomendamos actualizar la página.", "relation-color-tooltip": "Código de color hexadecimal utilizado para visualizar este tipo de relación en el grafo de ontología (por ejemplo, #1890ff).", "relation-type-in-use-count": "Utilizado por {{count}} relación(es) de términos", "relation-type-not-in-use": "No está en uso actualmente", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "{{user}} resolvió el incidente", "task-event-rejected": "{{user}} rechazó esta tarea", "task-event-revoked": "{{user}} revocó esta solicitud", + "task-form-builder-description": "Usa el constructor para formularios de creación, resolución y transición, y asignaciones de etapas. Los editores JSON siguen disponibles en Avanzado.", + "task-form-builder-title": "Diseña formularios de tareas visualmente", "task-opened-by": "Abierta por {{user}} {{time}}", "task-opened-this-incident": "{{user}} abrió este incidente {{time}}", "task-outcome-by-on": "{{status}} por {{user}} el {{date}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/fr-fr.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/fr-fr.json index e7c4b90bf530..873230aba178 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/fr-fr.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/fr-fr.json @@ -4662,6 +4662,7 @@ "need-help-message": "Besoin d'aide ? <0>{{doc}}.", "new-conversation": "Vous commencez une nouvelle conversation", "new-to-the-platform": "Nouveau sur la plateforme ?", + "new-version-available": "Une nouvelle version est disponible", "no-access-placeholder": "Vous n'avez pas les autorisations nécessaires. Veuillez contacter l'administrateur pour obtenir l'autorisation <0>{{entity}}.", "no-access-token-subtitle": "Générez un jeton pour commencer à effectuer des appels d'API authentifiés. Vous pouvez le révoquer à tout moment.", "no-access-token-title": "Aucun jeton d'accès personnel pour l'instant", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "Rediriger vers la page d'accueil", "refer-to-our-doc": "Toujours besoin d'aide ? Consultez notre <0>{{doc}} pour plus d'informations.", "refresh-frequency-contract-description": "Fréquence attendue de mise à jour des données", + "refresh-page-recommended": "Pour une expérience fluide, nous vous recommandons de recharger la page.", "relation-color-tooltip": "Code couleur hexadécimal utilisé pour visualiser ce type de relation dans le graphe d'ontologie (par ex. #1890ff).", "relation-type-in-use-count": "Utilisé par {{count}} relation(s) de termes", "relation-type-not-in-use": "Actuellement non utilisé", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "{{user}} a résolu l'incident", "task-event-rejected": "{{user}} a rejeté cette tâche", "task-event-revoked": "{{user}} a révoqué cette demande", + "task-form-builder-description": "Utilisez le concepteur pour les formulaires de création, de résolution et de transition, ainsi que les associations d’étapes. Les éditeurs JSON restent disponibles dans Avancé.", + "task-form-builder-title": "Concevoir visuellement les formulaires de tâches", "task-opened-by": "Ouverte par {{user}} {{time}}", "task-opened-this-incident": "{{user}} a ouvert cet incident {{time}}", "task-outcome-by-on": "{{status}} par {{user}} le {{date}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/gl-es.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/gl-es.json index def3102c103f..08d32928f899 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/gl-es.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/gl-es.json @@ -4662,6 +4662,7 @@ "need-help-message": "¿Necesitas ayuda? <0>{{doc}}.", "new-conversation": "Estás comezando unha nova conversa", "new-to-the-platform": "Es novo na plataforma?", + "new-version-available": "Hai unha nova versión dispoñible", "no-access-placeholder": "Non tes os permisos necesarios. Consulta co administrador para obter permisos <0>{{entity}}.", "no-access-token-subtitle": "Xera un token para comezar a facer chamadas autenticadas á API. Podes revogalo en calquera momento.", "no-access-token-title": "Aínda non hai token de acceso persoal", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "Redirixindo á páxina de inicio", "refer-to-our-doc": "Aínda necesitas axuda? Consulta o noso <0>{{doc}} para máis información.", "refresh-frequency-contract-description": "Frecuencia esperada de actualizacións de datos", + "refresh-page-recommended": "Para unha experiencia fluída, recomendamos actualizar a páxina.", "relation-color-tooltip": "Código de cor hexadecimal utilizado para visualizar este tipo de relación no grafo de ontoloxía (por exemplo, #1890ff).", "relation-type-in-use-count": "Utilizado por {{count}} relación(s) de termos", "relation-type-not-in-use": "Non está en uso actualmente", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "{{user}} resolveu o incidente", "task-event-rejected": "{{user}} rexeitou esta tarefa", "task-event-revoked": "{{user}} revogou esta solicitude", + "task-form-builder-description": "Usa o construtor para formularios de creación, resolución e transición, e asignacións de etapas. Os editores JSON seguen dispoñibles en Avanzado.", + "task-form-builder-title": "Deseña formularios de tarefas visualmente", "task-opened-by": "Aberta por {{user}} {{time}}", "task-opened-this-incident": "{{user}} abriu este incidente {{time}}", "task-outcome-by-on": "{{status}} por {{user}} o {{date}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/he-he.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/he-he.json index 62f57a8a5c0f..9934c1c6b577 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/he-he.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/he-he.json @@ -4662,6 +4662,7 @@ "need-help-message": "צריך עזרה? <0>{{doc}}.", "new-conversation": "אתה מתחיל שיחה חדשה", "new-to-the-platform": "חדש בפלטפורמה?", + "new-version-available": "גרסה חדשה זמינה", "no-access-placeholder": "אין לך את ההרשאות הנדרשות. אנא פנה למנהל כדי לקבל הרשאת <0>{{entity}}.", "no-access-token-subtitle": "צור אסימון כדי להתחיל לבצע קריאות API מאומתות. תוכל לבטל אותו בכל עת.", "no-access-token-title": "אין עדיין אסימון גישה אישי", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "מועבר לדף הבית", "refer-to-our-doc": "זקוק.ה לעזרה נוספת? בקר.י ב-<0>{{doc}} לקבלת מידע נוסף.", "refresh-frequency-contract-description": "תדירות צפויה של עדכוני נתונים", + "refresh-page-recommended": "לחוויה חלקה, מומלץ לרענן את הדף.", "relation-color-tooltip": "קוד צבע הקסדצימלי המשמש להמחשת סוג קשר זה בגרף האונטולוגיה (למשל, #1890ff).", "relation-type-in-use-count": "בשימוש על ידי {{count}} קשר(י) מונח", "relation-type-not-in-use": "לא בשימוש כרגע", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "{{user}} פתר/ה את התקרית", "task-event-rejected": "{{user}} דחה משימה זו", "task-event-revoked": "{{user}} ביטל בקשה זו", + "task-form-builder-description": "השתמש בבונה עבור טופסי יצירה, פתרון ומעבר ומיפויי שלבים. עורכי JSON עדיין זמינים תחת מתקדם.", + "task-form-builder-title": "עיצוב חזותי של טופסי משימות", "task-opened-by": "נפתח על ידי {{user}} {{time}}", "task-opened-this-incident": "{{user}} פתח תקרית זו {{time}}", "task-outcome-by-on": "{{status}} על ידי {{user}} ב-{{date}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ja-jp.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ja-jp.json index fb22db5bba07..0a977d8fadaf 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ja-jp.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ja-jp.json @@ -4662,6 +4662,7 @@ "need-help-message": "お困りですか? <0>{{doc}}", "new-conversation": "新しく会話を始める", "new-to-the-platform": "このプラットフォームを初めて利用する方へ", + "new-version-available": "新しいバージョンが利用可能です", "no-access-placeholder": "必要な権限がありません。管理者に連絡して <0>{{entity}} の権限を取得してください。", "no-access-token-subtitle": "認証済みAPIコールを開始するためのトークンを生成してください。いつでも取り消すことができます。", "no-access-token-title": "個人アクセストークンはまだありません", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "ホームページへリダイレクト中です", "refer-to-our-doc": "さらに詳しく知りたいですか?こちらの <0>{{doc}} をご覧ください。", "refresh-frequency-contract-description": "データ更新の想定頻度", + "refresh-page-recommended": "快適に使用するため、ページの再読み込みをお勧めします。", "relation-color-tooltip": "オントロジーグラフでこの関係タイプを可視化するために使用される16進カラーコード(例: #1890ff)。", "relation-type-in-use-count": "{{count}}件の用語関係で使用中", "relation-type-not-in-use": "現在使用されていません", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "{{user}} がインシデントを解決しました", "task-event-rejected": "{{user}} がこのタスクを却下しました", "task-event-revoked": "{{user}} がこのリクエストを取り消しました", + "task-form-builder-description": "ビルダーで作成、解決、遷移のフォームとステージの対応付けを設定できます。JSONエディターは引き続き詳細設定で利用できます。", + "task-form-builder-title": "タスクフォームを視覚的に設計", "task-opened-by": "{{user}} が {{time}} に開始しました", "task-opened-this-incident": "{{user}} が {{time}} にこのインシデントを開始しました", "task-outcome-by-on": "{{date}} に {{user}} が{{status}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ko-kr.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ko-kr.json index ae9a1db2ab94..d0c3f88b5b2b 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ko-kr.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ko-kr.json @@ -4662,6 +4662,7 @@ "need-help-message": "도움이 필요하신가요? <0>{{doc}}.", "new-conversation": "새 대화를 시작하고 있습니다", "new-to-the-platform": "플랫폼이 처음이신가요?", + "new-version-available": "새 버전을 사용할 수 있습니다", "no-access-placeholder": "필요한 권한이 없습니다. 관리자에게 문의하여 <0>{{entity}} 권한을 받으세요.", "no-access-token-subtitle": "Generate a token to start making authenticated API calls. You can revoke it any time.", "no-access-token-title": "No personal access token yet", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "홈 페이지로 리디렉션 중", "refer-to-our-doc": "더 많은 도움이 필요하신가요? 자세한 정보는 <0>{{doc}}를 참조하세요.", "refresh-frequency-contract-description": "예상 데이터 업데이트 빈도", + "refresh-page-recommended": "원활한 사용을 위해 페이지를 새로고침하는 것이 좋습니다.", "relation-color-tooltip": "온톨로지 그래프에서 이 관계 유형을 시각화하는 데 사용되는 16진수 색상 코드(예: #1890ff).", "relation-type-in-use-count": "{{count}}개의 용어 관계에서 사용 중", "relation-type-not-in-use": "현재 사용되지 않음", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "{{user}}님이 인시던트를 해결했습니다", "task-event-rejected": "{{user}}님이 이 작업을 거부했습니다", "task-event-revoked": "{{user}}님이 이 요청을 철회했습니다", + "task-form-builder-description": "빌더에서 생성, 해결, 전환 양식과 단계 매핑을 설정하세요. JSON 편집기는 고급에서 계속 사용할 수 있습니다.", + "task-form-builder-title": "작업 양식을 시각적으로 설계", "task-opened-by": "{{user}}님이 {{time}}에 열었습니다", "task-opened-this-incident": "{{user}}님이 {{time}}에 이 사고를 열었습니다", "task-outcome-by-on": "{{date}}에 {{user}}님이 {{status}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/mr-in.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/mr-in.json index 5a1f0c14e267..a41cd0c46257 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/mr-in.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/mr-in.json @@ -4662,6 +4662,7 @@ "need-help-message": "मदत आवश्यक आहे? <0>{{doc}}.", "new-conversation": "तुम्ही नवीन संभाषण सुरू करत आहात", "new-to-the-platform": "प्लॅटफॉर्मवर नवीन?", + "new-version-available": "नवीन आवृत्ती उपलब्ध आहे", "no-access-placeholder": "तुमच्याकडे आवश्यक परवानग्या नाहीत. कृपया प्रशासकाशी संपर्क करा जेणेकरून तुम्हाला <0>{{entity}} ची परवानगी मिळेल.", "no-access-token-subtitle": "Generate a token to start making authenticated API calls. You can revoke it any time.", "no-access-token-title": "No personal access token yet", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "मुख्यपृष्ठावर पुनर्निर्देशित करत आहे", "refer-to-our-doc": "अजूनही मदत हवी आहे? अधिक माहितीसाठी आमच्या <0>{{doc}} चा संदर्भ घ्या.", "refresh-frequency-contract-description": "डेटा अद्ययावत करण्याची अपेक्षित वारंवारता", + "refresh-page-recommended": "सुरळीत अनुभवासाठी पृष्ठ रिफ्रेश करण्याची शिफारस करतो.", "relation-color-tooltip": "ऑन्टोलॉजी आलेखात या संबंध प्रकाराचे दृश्यमान करण्यासाठी वापरला जाणारा Hex रंग कोड (उदा., #1890ff).", "relation-type-in-use-count": "{{count}} संज्ञा संबंधांमध्ये वापरात आहे", "relation-type-not-in-use": "सध्या वापरात नाही", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "{{user}} यांनी घटना सोडवली", "task-event-rejected": "{{user}} यांनी हे कार्य नाकारले", "task-event-revoked": "{{user}} यांनी ही विनंती मागे घेतली", + "task-form-builder-description": "निर्मिती, निराकरण आणि संक्रमण फॉर्म तसेच टप्प्यांच्या मॅपिंगसाठी बिल्डर वापरा. JSON संपादक प्रगत पर्यायांत अजूनही उपलब्ध आहेत.", + "task-form-builder-title": "कार्य फॉर्म दृश्यरूपात तयार करा", "task-opened-by": "{{user}} यांनी {{time}} उघडले", "task-opened-this-incident": "{{user}} यांनी {{time}} ही घटना उघडली", "task-outcome-by-on": "{{date}} रोजी {{user}} यांनी {{status}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/nl-nl.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/nl-nl.json index c71f96cd3853..30de65b11a29 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/nl-nl.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/nl-nl.json @@ -4662,6 +4662,7 @@ "need-help-message": "Je hebt hulp nodig? <0>{{doc}}.", "new-conversation": "Je begint een nieuw gesprek", "new-to-the-platform": "Nieuw op het platform?", + "new-version-available": "Er is een nieuwe versie beschikbaar", "no-access-placeholder": "Je hebt niet de benodigde rechten. Neem contact op met de beheerder om toestemming voor <0>{{entity}} te krijgen.", "no-access-token-subtitle": "Genereer een token om geauthenticeerde API-aanroepen te starten. Je kunt het op elk moment intrekken.", "no-access-token-title": "Nog geen persoonlijk toegangstoken", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "Doorgaan naar de startpagina", "refer-to-our-doc": "Hulp nodig? Raadpleeg onze <0>{{doc}} voor meer informatie.", "refresh-frequency-contract-description": "Verwachte frequentie van gegevensupdates", + "refresh-page-recommended": "Voor een soepele ervaring raden we aan de pagina te vernieuwen.", "relation-color-tooltip": "Hexadecimale kleurcode voor de visualisatie van dit relatietype in de ontologiegraf (bijv. #1890ff).", "relation-type-in-use-count": "Gebruikt door {{count}} termrelatie(s)", "relation-type-not-in-use": "Momenteel niet in gebruik", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "{{user}} heeft het incident opgelost", "task-event-rejected": "{{user}} heeft deze taak geweigerd", "task-event-revoked": "{{user}} heeft dit verzoek ingetrokken", + "task-form-builder-description": "Gebruik de builder voor aanmaak-, afhandelings- en overgangsformulieren en fasekoppelingen. De JSON-editors blijven beschikbaar onder Geavanceerd.", + "task-form-builder-title": "Taakformulieren visueel ontwerpen", "task-opened-by": "Geopend door {{user}} {{time}}", "task-opened-this-incident": "{{user}} heeft dit incident {{time}} geopend", "task-outcome-by-on": "{{status}} door {{user}} op {{date}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pr-pr.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pr-pr.json index f76b515b4970..3683d80cd130 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pr-pr.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pr-pr.json @@ -4662,6 +4662,7 @@ "need-help-message": "آیا نیاز به کمک دارید؟ <0>{{doc}}.", "new-conversation": "شما در حال شروع یک مکالمه جدید هستید.", "new-to-the-platform": "جدید در این پلتفرم هستید؟", + "new-version-available": "نسخه جدیدی در دسترس است", "no-access-placeholder": "شما دسترسی‌های لازم را ندارید. لطفاً برای دریافت دسترسی <0>{{entity}} با مدیر سیستم تماس بگیرید.", "no-access-token-subtitle": "یک توکن تولید کنید تا شروع به انجام فراخوانی‌های احراز هویت‌شده API کنید. می‌توانید هر زمان آن را باطل کنید.", "no-access-token-title": "هنوز هیچ توکن دسترسی شخصی وجود ندارد", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "در حال انتقال به صفحه اصلی.", "refer-to-our-doc": "هنوز نیاز به کمک دارید؟ به <0>{{doc}} ما مراجعه کنید برای اطلاعات بیشتر.", "refresh-frequency-contract-description": "فرکانس مورد انتظار به‌روزرسانی داده‌ها", + "refresh-page-recommended": "برای تجربه‌ای روان، توصیه می‌کنیم صفحه را تازه‌سازی کنید.", "relation-color-tooltip": "کد رنگ Hex برای نمایش این نوع رابطه در نمودار هستی‌شناسی (مثلاً #1890ff).", "relation-type-in-use-count": "توسط {{count}} رابطه اصطلاح استفاده می‌شود", "relation-type-not-in-use": "در حال حاضر استفاده نمی‌شود", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "{{user}} حادثه را حل کرد", "task-event-rejected": "{{user}} این وظیفه را رد کرد", "task-event-revoked": "{{user}} این درخواست را لغو کرد", + "task-form-builder-description": "از سازنده برای فرم‌های ایجاد، حل و انتقال و نگاشت مراحل استفاده کنید. ویرایشگرهای JSON همچنان در بخش پیشرفته در دسترس هستند.", + "task-form-builder-title": "طراحی بصری فرم‌های وظایف", "task-opened-by": "باز شده توسط {{user}} {{time}}", "task-opened-this-incident": "{{user}} این حادثه را {{time}} باز کرد", "task-outcome-by-on": "{{status}} توسط {{user}} در {{date}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-br.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-br.json index d3acb2790922..19f9007cac64 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-br.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-br.json @@ -4662,6 +4662,7 @@ "need-help-message": "Precisa de ajuda? <0>{{doc}}.", "new-conversation": "Você está iniciando uma nova conversa", "new-to-the-platform": "Novo na plataforma?", + "new-version-available": "Uma nova versão está disponível", "no-access-placeholder": "Você não tem as permissões necessárias. Verifique com o administrador para obter a permissão de <0>{{entity}}.", "no-access-token-subtitle": "Gere um token para começar a fazer chamadas de API autenticadas. Você pode revogá-lo a qualquer momento.", "no-access-token-title": "Ainda não há token de acesso pessoal", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "Redirecionando para a página inicial", "refer-to-our-doc": "Ainda precisa de ajuda? Consulte nossa <0>{{doc}} para mais informações.", "refresh-frequency-contract-description": "Frequência esperada de atualizações de dados", + "refresh-page-recommended": "Para uma experiência fluida, recomendamos atualizar a página.", "relation-color-tooltip": "Código de cor hexadecimal usado para visualizar este tipo de relação no grafo de ontologia (por exemplo, #1890ff).", "relation-type-in-use-count": "Utilizado por {{count}} relação(ões) de termos", "relation-type-not-in-use": "Não está em uso atualmente", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "{{user}} resolveu o incidente", "task-event-rejected": "{{user}} rejeitou esta tarefa", "task-event-revoked": "{{user}} revogou esta solicitação", + "task-form-builder-description": "Use o construtor para formulários de criação, resolução e transição e mapeamentos de etapas. Os editores JSON continuam disponíveis em Avançado.", + "task-form-builder-title": "Crie formulários de tarefas visualmente", "task-opened-by": "Aberta por {{user}} {{time}}", "task-opened-this-incident": "{{user}} abriu este incidente {{time}}", "task-outcome-by-on": "{{status}} por {{user}} em {{date}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-pt.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-pt.json index 3a87e4402bf6..fc1c69e5b84f 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-pt.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/pt-pt.json @@ -4662,6 +4662,7 @@ "need-help-message": "Precisa de ajuda? <0>{{doc}}.", "new-conversation": "Você está iniciando uma nova conversa", "new-to-the-platform": "Novo na plataforma?", + "new-version-available": "Está disponível uma nova versão", "no-access-placeholder": "Não tem as permissões necessárias. Verifique com o administrador para obter a permissão de <0>{{entity}}.", "no-access-token-subtitle": "Gere um token para começar a fazer chamadas de API autenticadas. Pode revogá-lo a qualquer momento.", "no-access-token-title": "Ainda não há token de acesso pessoal", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "Redirecionando para a página inicial", "refer-to-our-doc": "Ainda precisa de ajuda? Consulte nossa <0>{{doc}} para mais informações.", "refresh-frequency-contract-description": "Frequência esperada de atualizações de dados", + "refresh-page-recommended": "Para uma experiência fluida, recomendamos atualizar a página.", "relation-color-tooltip": "Código de cor hexadecimal utilizado para visualizar este tipo de relação no grafo de ontologia (por exemplo, #1890ff).", "relation-type-in-use-count": "Utilizado por {{count}} relação(ões) de termos", "relation-type-not-in-use": "Não está em utilização atualmente", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "{{user}} resolveu o incidente", "task-event-rejected": "{{user}} rejeitou esta tarefa", "task-event-revoked": "{{user}} revogou este pedido", + "task-form-builder-description": "Utilize o construtor para formulários de criação, resolução e transição e mapeamentos de etapas. Os editores JSON continuam disponíveis em Avançado.", + "task-form-builder-title": "Crie formulários de tarefas visualmente", "task-opened-by": "Aberta por {{user}} {{time}}", "task-opened-this-incident": "{{user}} abriu este incidente {{time}}", "task-outcome-by-on": "{{status}} por {{user}} em {{date}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ru-ru.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ru-ru.json index 35c3c7a8fa48..8b6f6753fa49 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/ru-ru.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/ru-ru.json @@ -4662,6 +4662,7 @@ "need-help-message": "Нужна помощь? <0>{{doc}}.", "new-conversation": "Начать новое обсуждение", "new-to-the-platform": "Новичок на платформе?", + "new-version-available": "Доступна новая версия", "no-access-placeholder": "У вас нет доступа, обратитесь к администратору, чтобы получить разрешения", "no-access-token-subtitle": "Сгенерируйте токен, чтобы начать делать аутентифицированные вызовы API. Вы можете отозвать его в любой момент.", "no-access-token-title": "Персонального токена доступа пока нет", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "Перенаправление на главную страницу", "refer-to-our-doc": "Все еще нужна помощь? Дополнительную информацию см. по ссылке — <0>{{doc}}.", "refresh-frequency-contract-description": "Ожидаемая частота обновления данных", + "refresh-page-recommended": "Для корректной работы рекомендуем обновить страницу.", "relation-color-tooltip": "Шестнадцатеричный код цвета для визуализации этого типа отношения в графе онтологии (например, #1890ff).", "relation-type-in-use-count": "Используется в {{count}} связях терминов", "relation-type-not-in-use": "В настоящее время не используется", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "{{user}} решил(а) инцидент", "task-event-rejected": "{{user}} отклонил эту задачу", "task-event-revoked": "{{user}} отозвал этот запрос", + "task-form-builder-description": "Используйте конструктор для форм создания, решения и переходов, а также сопоставления этапов. Редакторы JSON по-прежнему доступны в разделе дополнительных настроек.", + "task-form-builder-title": "Визуальное создание форм задач", "task-opened-by": "Открыто пользователем {{user}} {{time}}", "task-opened-this-incident": "{{user}} открыл этот инцидент {{time}}", "task-outcome-by-on": "{{status}}: {{user}}, {{date}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/sv-se.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/sv-se.json index 95d3fa077475..d375ea00e755 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/sv-se.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/sv-se.json @@ -4662,6 +4662,7 @@ "need-help-message": "Behöver du hjälp? <0>{{doc}}.", "new-conversation": "Du startar en ny konversation", "new-to-the-platform": "Ny på plattformen?", + "new-version-available": "En ny version är tillgänglig", "no-access-placeholder": "Du har inte nödvändiga behörigheter. Kontakta administratören för att få behörigheten <0>{{entity}}.", "no-access-token-subtitle": "Generate a token to start making authenticated API calls. You can revoke it any time.", "no-access-token-title": "No personal access token yet", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "Omdirigerar till startsidan", "refer-to-our-doc": "Behöver du fortfarande hjälp? Se vår <0>{{doc}} för mer information.", "refresh-frequency-contract-description": "Förväntad frekvens för datauppdateringar", + "refresh-page-recommended": "För en smidig upplevelse rekommenderar vi att du uppdaterar sidan.", "relation-color-tooltip": "Hex-färgkod som används för att visualisera den här relationstypen i ontologigrafen (t.ex. #1890ff).", "relation-type-in-use-count": "Används av {{count}} termrelation(er)", "relation-type-not-in-use": "Används inte för närvarande", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "{{user}} löste incidenten", "task-event-rejected": "{{user}} avvisade denna uppgift", "task-event-revoked": "{{user}} återkallade denna begäran", + "task-form-builder-description": "Använd byggaren för formulär för skapande, lösning och övergångar samt etappmappningar. JSON-redigerarna finns fortfarande under Avancerat.", + "task-form-builder-title": "Utforma uppgiftsformulär visuellt", "task-opened-by": "Öppnad av {{user}} {{time}}", "task-opened-this-incident": "{{user}} öppnade denna incident {{time}}", "task-outcome-by-on": "{{status}} av {{user}} den {{date}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/th-th.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/th-th.json index 41b3e33f891c..ea48e4de1c94 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/th-th.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/th-th.json @@ -4662,6 +4662,7 @@ "need-help-message": "คุณต้องการความช่วยเหลือหรือไม่? <0>{{doc}}.", "new-conversation": "คุณกำลังเริ่มการสนทนาใหม่", "new-to-the-platform": "ใหม่ต่อแพลตฟอร์มหรือไม่?", + "new-version-available": "มีเวอร์ชันใหม่พร้อมใช้งาน", "no-access-placeholder": "คุณไม่มีสิทธิ์ที่จำเป็น โปรดติดต่อผู้ดูแลระบบเพื่อขอสิทธิ์ <0>{{entity}}.", "no-access-token-subtitle": "สร้างโทเค็นเพื่อเริ่มเรียกใช้ API ที่ยืนยันตัวตนแล้ว คุณสามารถเพิกถอนได้ทุกเมื่อ", "no-access-token-title": "ยังไม่มีโทเค็นการเข้าถึงส่วนบุคคล", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "กำลังเปลี่ยนเส้นทางไปยังหน้าแรก", "refer-to-our-doc": "ยังต้องการความช่วยเหลืออยู่ใช่ไหม? โปรดดูเอกสารของเรา <0>{{doc}} สำหรับข้อมูลเพิ่มเติม", "refresh-frequency-contract-description": "ความถี่ที่คาดว่าจะมีการอัปเดตข้อมูล", + "refresh-page-recommended": "เพื่อการใช้งานที่ราบรื่น เราแนะนำให้รีเฟรชหน้า", "relation-color-tooltip": "รหัสสี Hex ที่ใช้แสดงประเภทความสัมพันธ์นี้ในกราฟออนโทโลยี (เช่น #1890ff)", "relation-type-in-use-count": "ใช้อยู่ใน {{count}} ความสัมพันธ์ของคำศัพท์", "relation-type-not-in-use": "ยังไม่ได้ใช้งาน", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "{{user}} แก้ไขเหตุการณ์แล้ว", "task-event-rejected": "{{user}} ปฏิเสธงานนี้", "task-event-revoked": "{{user}} เพิกถอนคำขอนี้", + "task-form-builder-description": "ใช้ตัวสร้างสำหรับแบบฟอร์มสร้าง แก้ไข และเปลี่ยนสถานะ รวมถึงการจับคู่ขั้นตอน ตัวแก้ไข JSON ยังคงอยู่ในส่วนขั้นสูง", + "task-form-builder-title": "ออกแบบแบบฟอร์มงานด้วยภาพ", "task-opened-by": "เปิดโดย {{user}} {{time}}", "task-opened-this-incident": "{{user}} เปิดเหตุการณ์นี้ {{time}}", "task-outcome-by-on": "{{status}} โดย {{user}} เมื่อ {{date}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/tr-tr.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/tr-tr.json index 297ed47ffddd..2a2dc1e56fb0 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/tr-tr.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/tr-tr.json @@ -4662,6 +4662,7 @@ "need-help-message": "Yardıma mı ihtiyacınız var? <0>{{doc}}.", "new-conversation": "Yeni bir konuşma başlatıyorsunuz", "new-to-the-platform": "Platformda yeni misiniz?", + "new-version-available": "Yeni bir sürüm mevcut", "no-access-placeholder": "Gerekli izinlere sahip değilsiniz. Lütfen <0>{{entity}} iznini almak için yöneticiyle iletişime geçin.", "no-access-token-subtitle": "Generate a token to start making authenticated API calls. You can revoke it any time.", "no-access-token-title": "No personal access token yet", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "Ana sayfaya yönlendiriliyor", "refer-to-our-doc": "Hala yardıma mı ihtiyacınız var? Daha fazla bilgi için <0>{{doc}} bölümümüze bakın.", "refresh-frequency-contract-description": "Beklenen veri güncelleme sıklığı", + "refresh-page-recommended": "Sorunsuz bir deneyim için sayfayı yenilemenizi öneririz.", "relation-color-tooltip": "Ontoloji grafiklerinde bu ilişki türünü görselleştirmek için kullanılan on altılık renk kodu (örneğin, #1890ff).", "relation-type-in-use-count": "{{count}} terim ilişkisi tarafından kullanılıyor", "relation-type-not-in-use": "Şu anda kullanılmıyor", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "{{user}} olayı çözdü", "task-event-rejected": "{{user}} bu görevi reddetti", "task-event-revoked": "{{user}} bu talebi geri aldı", + "task-form-builder-description": "Oluşturma, çözüm ve geçiş formları ile aşama eşlemeleri için oluşturucuyu kullanın. JSON düzenleyicileri Gelişmiş bölümünde kullanılabilir.", + "task-form-builder-title": "Görev formlarını görsel olarak tasarlayın", "task-opened-by": "{{user}} tarafından {{time}} açıldı", "task-opened-this-incident": "{{user}} bu olayı {{time}} açtı", "task-outcome-by-on": "{{date}} tarihinde {{user}} tarafından {{status}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-cn.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-cn.json index f7036a1607db..04696767f362 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-cn.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-cn.json @@ -4662,6 +4662,7 @@ "need-help-message": "需要帮助吗?<0>{{doc}}.", "new-conversation": "您正在开始一次新的对话", "new-to-the-platform": "您是平台新用户?", + "new-version-available": "有新版本可用", "no-access-placeholder": "您没有所需的权限。请联系管理员以获取<0>{{entity}}的权限.", "no-access-token-subtitle": "生成一个令牌以开始进行经过身份验证的 API 调用。您可以随时撤销它。", "no-access-token-title": "尚无个人访问令牌", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "正在重定向到主页", "refer-to-our-doc": "仍需要帮助?请参考我们的相关<0>{{doc}}以获取更多信息。", "refresh-frequency-contract-description": "预期的数据更新频率", + "refresh-page-recommended": "为了获得流畅的体验,建议刷新页面。", "relation-color-tooltip": "用于在本体图中可视化此关系类型的十六进制颜色代码(例如:#1890ff)。", "relation-type-in-use-count": "被{{count}}个术语关系使用", "relation-type-not-in-use": "当前未使用", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "{{user}} 解决了该事件", "task-event-rejected": "{{user}} 拒绝了此任务", "task-event-revoked": "{{user}} 撤销了此请求", + "task-form-builder-description": "使用构建器配置创建、解决和转换表单,以及阶段映射。原始 JSON 编辑器仍可在高级选项中使用。", + "task-form-builder-title": "可视化设计任务表单", "task-opened-by": "由 {{user}} 于 {{time}} 打开", "task-opened-this-incident": "{{user}} 于 {{time}} 打开了此事件", "task-outcome-by-on": "{{user}} 于 {{date}} {{status}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-tw.json b/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-tw.json index a3428e06fc8f..8226d74bd302 100644 --- a/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-tw.json +++ b/openmetadata-ui/src/main/resources/ui/src/locale/languages/zh-tw.json @@ -4662,6 +4662,7 @@ "need-help-message": "需要協助嗎?<0>{{doc}}。", "new-conversation": "您正在開始一個新對話", "new-to-the-platform": "是平台新手嗎?", + "new-version-available": "有新版本可用", "no-access-placeholder": "您沒有必要的權限。請洽詢管理員以取得 <0>{{entity}} 權限。", "no-access-token-subtitle": "Generate a token to start making authenticated API calls. You can revoke it any time.", "no-access-token-title": "No personal access token yet", @@ -5125,6 +5126,7 @@ "redirecting-to-home-page": "正在重新導向到首頁", "refer-to-our-doc": "仍需要協助嗎?請參考我們的 <0>{{doc}} 以獲取更多資訊。", "refresh-frequency-contract-description": "預期資料更新頻率", + "refresh-page-recommended": "為了獲得流暢的體驗,建議重新整理頁面。", "relation-color-tooltip": "用於在本體圖中視覺化此關係類型的十六進位色碼(例如:#1890ff)。", "relation-type-in-use-count": "被{{count}}個術語關係使用", "relation-type-not-in-use": "目前未使用", @@ -5333,6 +5335,8 @@ "task-event-incident-resolved": "{{user}} 解決了該事件", "task-event-rejected": "{{user}} 拒絕了此任務", "task-event-revoked": "{{user}} 撤銷了此請求", + "task-form-builder-description": "使用建構器設定建立、解決和轉換表單,以及階段對應。原始 JSON 編輯器仍可在進階選項中使用。", + "task-form-builder-title": "視覺化設計任務表單", "task-opened-by": "由 {{user}} 於 {{time}} 開啟", "task-opened-this-incident": "{{user}} 於 {{time}} 開啟了此事件", "task-outcome-by-on": "{{user}} 於 {{date}} {{status}}", diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/AppearanceConfigSettingsPage/appearance-config-settings-page.less b/openmetadata-ui/src/main/resources/ui/src/pages/AppearanceConfigSettingsPage/appearance-config-settings-page.less index 230b918e2455..9452e2f30770 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/AppearanceConfigSettingsPage/appearance-config-settings-page.less +++ b/openmetadata-ui/src/main/resources/ui/src/pages/AppearanceConfigSettingsPage/appearance-config-settings-page.less @@ -35,13 +35,3 @@ padding: var(--om-space-8); border-radius: var(--om-radius-sm); } - -.custom-theme-beta-tag { - .ant-badge-count { - background-color: @primary-color; - color: var(--tw-color-text-white); - padding: 0 var(--om-space-4); - margin-left: var(--om-space-2); - font-size: var(--om-font-size-10); - } -} diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/AuditLogsPage/AuditLogsPage.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/AuditLogsPage/AuditLogsPage.tsx index c3dc5d2c50df..5f39472d7aa1 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/AuditLogsPage/AuditLogsPage.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/pages/AuditLogsPage/AuditLogsPage.tsx @@ -17,10 +17,11 @@ import { ButtonUtility, Card, Input, + ProgressBar, Typography, } from '@openmetadata/ui-core-components'; import { Search, XClose } from '@openmetadata/ui-core-components/icons'; -import { Modal, Progress } from 'antd'; +import { Modal } from 'antd'; import { AxiosError } from 'axios'; import { debounce, isString } from 'lodash'; import { DateTime } from 'luxon'; @@ -419,14 +420,13 @@ const AuditLogsPage = () => { const renderExportProgress = () => exportJob?.status === 'IN_PROGRESS' ? (
    - 0 ? Math.round(((exportJob.progress ?? 0) / exportJob.total) * 100) : 0 } - size="small" - status="active" /> {exportJob.message ?? t('message.exporting')} @@ -518,7 +518,7 @@ const AuditLogsPage = () => {
    {activeFilters.map((filter) => ( ({ describe('Test Data insight left panel', () => { it('Should render the menu items', async () => { - render(); + render( + + + + ); const menuContainer = await screen.findByTestId('data-insight-left-panel'); @@ -38,7 +43,11 @@ describe('Test Data insight left panel', () => { }); it('On clicking the menu item, route should change', async () => { - render(); + render( + + + + ); const appAnalytics = await screen.findByText('label.app-analytic-plural'); const kpi = await screen.findByText('label.kpi-uppercase-plural'); diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/DataInsightPage/DataInsightLeftPanel/DataInsightLeftPanel.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/DataInsightPage/DataInsightLeftPanel/DataInsightLeftPanel.tsx index 4ba967943e80..fe5459bc5f37 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/DataInsightPage/DataInsightLeftPanel/DataInsightLeftPanel.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/pages/DataInsightPage/DataInsightLeftPanel/DataInsightLeftPanel.tsx @@ -11,47 +11,41 @@ * limitations under the License. */ -import { Menu, MenuProps } from 'antd'; +import { NavItemBase } from '@openmetadata/ui-core-components'; import { useMemo } from 'react'; -import { useNavigate } from 'react-router-dom'; +import { useTranslation } from 'react-i18next'; import LeftPanelCard from '../../../components/common/LeftPanelCard/LeftPanelCard'; import { DataInsightTabs } from '../../../interface/data-insight.interface'; import { getDataInsightPathWithFqn } from '../../../utils/DataInsightPureUtils'; import { useRequiredParams } from '../../../utils/useRequiredParams'; import DataInsightClassBase from '../DataInsightClassBase'; + const DataInsightLeftPanel = () => { + const { t } = useTranslation(); const { tab } = useRequiredParams<{ tab: DataInsightTabs }>(); - - const navigate = useNavigate(); - - const menuItems: MenuProps['items'] = useMemo(() => { - const data = DataInsightClassBase.getLeftSideBar(); - - return data.map((value) => { - const SvgIcon = value.icon; - - return { - key: value.key, - label: value.label, - icon: , - }; - }); - }, []); - - const handleMenuClick: MenuProps['onClick'] = (e) => { - navigate(getDataInsightPathWithFqn(e.key as DataInsightTabs)); - }; + const menuItems = useMemo(() => DataInsightClassBase.getLeftSideBar(), []); return ( - + data-testid="data-insight-left-panel"> +
      + {menuItems.map((item) => ( +
    • + + {item.label} + +
    • + ))} +
    + ); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/DataInsightPage/data-insight.less b/openmetadata-ui/src/main/resources/ui/src/pages/DataInsightPage/data-insight.less index c8e7c6fbde14..6d9db2e18637 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/DataInsightPage/data-insight.less +++ b/openmetadata-ui/src/main/resources/ui/src/pages/DataInsightPage/data-insight.less @@ -90,36 +90,15 @@ } .data-insight-progress-bar { - .ant-progress-outer { - margin-right: 0; - padding-right: 0; - } - .ant-progress-inner, - .ant-progress-bg, - .ant-progress-success-bg { - border-radius: var(--om-radius-sm); - } - .ant-progress-text { - display: flex; - margin: 0; - position: absolute; - width: 100%; - justify-content: space-between; - align-items: center; - height: 100%; - top: 0px; - right: 2px; - left: 2px; - padding: 0 var(--om-space-16) 0 var(--om-space-8); - font-size: var(--om-font-size-xs); - color: @text-color; - } .data-insight-kpi-target { position: absolute; + top: 0; + height: 100%; left: 0; border-right: 2px solid @target-blue-color; .target-text { + color: var(--om-color-text-primary); position: relative; right: -12px; top: -14px; diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/EntityImport/BulkEntityImportPage/bulk-entity-import-page.less b/openmetadata-ui/src/main/resources/ui/src/pages/EntityImport/BulkEntityImportPage/bulk-entity-import-page.less index c518d8862f3c..e16190572fff 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/EntityImport/BulkEntityImportPage/bulk-entity-import-page.less +++ b/openmetadata-ui/src/main/resources/ui/src/pages/EntityImport/BulkEntityImportPage/bulk-entity-import-page.less @@ -368,16 +368,6 @@ font-weight: @font-semibold; } } - - .ant-alert { - background: var(--tw-color-bg-brand-primary); - border: 1px solid var(--tw-color-border-brand_alt); - border-radius: var(--om-radius-10); - color: var(--tw-color-text-brand-secondary); - font-size: var(--om-font-size-13); - margin-top: var(--om-space-18); - padding: var(--om-space-12) var(--om-space-14); - } } .csv-import-banner-stack { diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/LearningResourcesPage/LearningResourceForm.component.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/LearningResourcesPage/LearningResourceForm.component.tsx index 893b3d37002e..9b0fb179b1aa 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/LearningResourcesPage/LearningResourceForm.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/pages/LearningResourcesPage/LearningResourceForm.component.tsx @@ -12,11 +12,12 @@ */ import { CloseOutlined } from '@ant-design/icons'; -import { Box } from '@openmetadata/ui-core-components'; -import { Button, Drawer, Form, Input, Select } from 'antd'; +import { Box, SlideoutMenu } from '@openmetadata/ui-core-components'; +import { Button, Form, Input, Select } from 'antd'; import { AxiosError } from 'axios'; -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useCallback, useEffect, useId, useState } from 'react'; import { useTranslation } from 'react-i18next'; +import { DrawerPopupContainerProvider } from '../../components/common/DrawerPopupContainerProvider/DrawerPopupContainerProvider'; import { ResourceTypeIcon } from '../../components/Learning/ResourceTypeIcon/ResourceTypeIcon'; import { CATEGORIES, @@ -54,6 +55,8 @@ export const LearningResourceForm: React.FC = ({ resource, onClose, }) => { + const drawerTitleId = useId(); + const { t } = useTranslation(); const [form] = Form.useForm(); const [isSubmitting, setIsSubmitting] = useState(false); @@ -166,193 +169,212 @@ export const LearningResourceForm: React.FC = ({
    ); + // Popup portals belong to the drawer even though they render outside its DOM tree. return ( - + !element.closest('[data-react-aria-top-layer]') + } width={600} - onClose={onClose}> -
    - - - + onOpenChange={(nextOpen) => { + if (!nextOpen) { + onClose(); + } + }}> + + {drawerTitle} + + + + + + + - -