Skip to content

Dark-mode and contrast fixes, Classic mode deprecation notice, Insights tile padding - #35609

Merged
shah-harshit merged 32 commits into
mainfrom
shah-harshit/automations-icons-fix
Oct 17, 2026
Merged

shah-harshit merged 32 commits into
mainfrom
shah-harshit/automations-icons-fix

Conversation

@shah-harshit

@shah-harshit shah-harshit commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Describe your changes:

Fixes open-metadata/openmetadata-collate#7533

Dark-mode (AI mode) review fixes, plus the Classic mode deprecation notice and consistent Insights tab tile padding. Every fix lives in OSS (openmetadata-ui + core components), so Collate picks them up through the submodule, with no Collate PR needed:

  1. Connections composer bottom padding. The list page mounted its footer slot inside the padded PageLayout.Content, so the AI composer stopped 8px above the canvas edge and the list showed through below it. It now mounts on the page root, matching Home's footer slot (both measure 693→822px).
  2. Table header divider missing in dark. Core Table.Header draws its divider with border-secondary (8% white). Under the darker header band that resolves to the row surface below, so the edge vanished (Incident Manager, Data Quality, …). In dark only, it now uses border-primary. Light is unchanged.
  3. Solid icon tiles (AI Automations). Core FeaturedIcon theme="light" switched to a solid fill in dark; it now keeps the tinted tile Home uses (utility-*-50 / -600). Two caller workarounds for the old solid fill are removed or updated. Domain and data product avatars (Data Marketplace) intentionally stay solid in both themes: users pick those colors, and design will revisit them with custom colors. Recorded in ADR:2026-10-16-light-featured-icons-stay-tinted-in-dark.
  4. Entity tab counts. The active count was a solid primary fill. Counts now render as a core Badge: outlined brand pill when selected, gray otherwise. The antd LESS rule that repainted it solid is removed.
  5. Automation / ingestion status counts. The custom LESS tiles (faded green/red/yellow) are replaced by core Badge pills (success / error / warning), left-aligned.
  6. Classic mode deprecation. Classic shows a Deprecated badge (core Badge, warning) and a "Classic mode is being retired" card (core HoverCard, hover or keyboard focus) with a release-notes link. Per the product thread, it appears only where a user changes mode, never on the always-visible trigger:
    • the AI-shell mode switcher;
    • the classic navbar profile dropdown;
    • the admin Default App Mode setting: Platform Settings edit form and classic settings page, with a hint under Classic.
    • The removal version/date and the persona count from the design are not included. There is no API for the persona count, and the version is not decided yet; the copy says "an upcoming release" and links the docs release-notes index. New strings are translated in all 20 locales.
  7. Insights tab tile padding. The service Insights tiles and the Data Quality pie cards render their content in core Card.Content (24px inset) instead of caller padding: tw:p-3 on the Platform Insights KPI cards, a gray tw:p-4 box for Total Data Assets, and LESS padding on the DQ dashboard pie cards. The embedded (AI-mode) sections also drop their bg-surface slab, which showed as a lighter block in dark, and the extra header padding. The Collate-side layout (grid gaps, dark-only frames) is in open-metadata/openmetadata-collate#7535.
  8. Column detail drawer (dark). The title block, content wrappers and footer painted @grey-9 / @grey-50, which resolve to bg-secondary in dark: bands darker than the drawer's overlay surface. They are transparent in dark now. The key profile metric tiles use an outline instead of the darker fill in dark. The custom properties list uses tw:bg-surface instead of the page-colour tw:bg-primary, which also fixes the Explore summary panel. Light mode is unchanged.
  9. Contract result pill contrast. The header Contract Failed / Aborted / Running pill was a secondary Button recolored with ! classes, with 600 text: 2.70:1 in dark, failing AA. It is now a shared ContractLatestResultBadge (core Badge palette: utility-*-50 fill, -700 text, -200 outline), 4.67:1 in dark and 6.05:1 in light, measured in the app. It is a link to the Contract tab, on both data asset and data product headers. Core Badge fix: a linked badge no longer adds tw:text-inherit, which won the tailwind-merge conflict and dropped the badge's own text color; this also makes linked tags use their own text color like non-linked ones.
  10. Beta chip overlap. The Beta chip on tab labels (Knowledge Graph) was absolutely positioned over the next tab; it now sits inline after the label.
  11. Empty test-status chart overflow. TestCaseStatusAreaChartWidget puts its no-data placeholder in a core Tooltip whose trigger is w-max, so the placeholder SVG's width: 100% resolved to its intrinsic 313px and spilled across neighbouring cards (table Data Observability overview). The trigger now takes the card width. The matching dimension-bar collapse and the placeholder's dark colour are Collate code, fixed in open-metadata/openmetadata-collate#7535.
  12. Visual baseline refresh (CI). ai-explore.png predates the Lineage nav item that Fixes #33865: Inline lineage editing via node and column menus #34551 added to main (its own merge-queue visual run failed the same snapshot). The new baseline is CI's actual render from the pinned Playwright container. It is pixel-identical with and without this PR, so this PR changes nothing on that page.
  13. Decision record for the Classic deprecation: ADR:2026-10-16-classic-mode-is-deprecated.

Type of change:

  • Bug fix

High-level design:

Each fix goes in the shared layer every caller passes through, not in individual pages:

  • Core components: Table.Header divider and FeaturedIcon light theme in dark.
  • Shared app helpers: getCountBadge → core Badge, and IngestionStatusCount → core Badge.

Light mode changes only where the request covers it: tab counts, which are no longer solid. Table.Header and FeaturedIcon change only their dark classes.

Alternative rejected: restyling FeaturedIcon from callers via className would spread overrides across call sites and drift from core.

Tests:

Use cases covered

  • Selected vs unselected entity tab counts render brand vs gray badges.
  • Status counts render success / error / warning badges with the right values.
  • The Connections footer contribution renders outside the padded Content.

Unit tests

  • Added / updated:
    • UI: AppModeSwitcher.test.tsx, InterfaceModeMenuItem.test.tsx, DefaultAppModePage.test.tsx, AppModeSettings.test.tsx, IngestionStatusCount.test.tsx (new), EntityDisplayPureUtils.test.tsx, TabsLabel.test.tsx, ConnectionsPage.test.tsx
  • Ran (Jest): EntityDisplayPureUtils, TabsLabel, ActivityFeedTab, GlossaryTermUtils, IngestionListTable + IngestionStatusCount, TestSuitePipelineTab, IconUtils, DataMarketplace, HomeLandingPage, personal-space MyData, ConnectionsPage. All pass, including 132 and 142 across the larger groups.
  • Ran (Jest) for the deprecation: AppModeSwitcher, DefaultAppModePage, platform-settings, UserProfileIcon, ai-shell Sidebar — 40 suites / 305 tests pass; yarn check-i18n clean.
  • Ran (Jest) for the Insights padding: ServiceInsights, DataQuality ChartWidgets, DataQualityDashboard — 15 suites / 201 tests pass.
  • Ran (Jest) for the drawer: ColumnDetailPanel, CustomPropertiesSection — 4 suites / 72 tests pass.
  • Ran (Jest) for the contract pill: DataAssetsHeader, DataProductsDetailsPage, DataContract utils — 5 suites / 105 tests pass. Core Vitest badges: 10 / 10 (new linked-badge color test).
  • Ran (Jest): TestCaseStatusAreaChartWidget — 25 / 25 pass.
  • Ran (Vitest, core): avatar, badges, table — pass.
  • make ui-checkstyle-changed clean; tsc --noEmit clean.

Backend integration tests

  • Not applicable (UI only).

Ingestion integration tests

  • Not applicable (no ingestion changes).

Playwright (UI) tests

Local Playwright: partial run, stopped on request; remaining specs pending

  • Impact-mapped specs (make playwright_affected): 191 (189 + 2 --no-deps).
  • Environment: this branch's UI (Vite dev server, commit e7bda4048ea) against a local backend (2.0.0-SNAPSHOT), Chromium, 2 workers, no retries.
Spec Result
playwright/e2e/Pages/DataContractsSemanticRules.spec.ts (covers the new contract result badge) ✅ 44 passed, 0 failed, 0 flaky (7.6 min, incl. setup/teardown)

Interrupted: the next chunk (DataContracts, DataContractInheritance, DataContractSLAValidation, DataQualityDashboard) was stopped after setup at test 4/71, with no failures before the stop. It is counted as pending below.

Pending: 190 specs not yet run locally
  • playwright/e2e/Pages/DataContracts.spec.ts
  • playwright/e2e/Pages/DataContractInheritance.spec.ts
  • playwright/e2e/Pages/DataContractSLAValidation.spec.ts
  • playwright/e2e/Features/DataQuality/DataQualityDashboard.spec.ts
  • playwright/e2e/Features/DataQuality/Dimensionality.spec.ts
  • playwright/e2e/Features/IncidentManager.spec.ts
  • playwright/e2e/Features/IncidentManagerPagination.spec.ts
  • playwright/e2e/Features/AppMode/AppModeAiPersonaLandsAtRoot.spec.ts
  • playwright/e2e/Features/AppMode/AppModeAuthGating.spec.ts
  • playwright/e2e/Features/AppMode/AppModeCrossDevice.spec.ts
  • playwright/e2e/Features/AppMode/AppModePageSizeIsolation.spec.ts
  • playwright/e2e/Features/AppMode/AppModePrecedence.spec.ts
  • playwright/e2e/Features/AppMode/AppModePreferenceRoundTrip.spec.ts
  • playwright/e2e/Features/AppMode/AppModeResolver.spec.ts
  • playwright/e2e/Features/AppMode/AppModeRouteIsolation.spec.ts
  • playwright/e2e/Features/AppMode/AppModeSettings.spec.ts
  • playwright/e2e/Features/AppMode/AppModeUrlHandling.spec.ts
  • playwright/e2e/Features/ProfilePlatformSettings.spec.ts
  • playwright/e2e/Features/AIMode/PersonaSettings.spec.ts
  • playwright/e2e/Pages/DataMarketplace.spec.ts
  • playwright/e2e/Features/LandingPageWidgets/DomainDataProductsWidgets.spec.ts
  • playwright/e2e/Features/LandingPageWidgets/DomainWidgetFilter.spec.ts
  • playwright/e2e/Features/LandingPageWidgets/FollowingWidget.spec.ts
  • playwright/e2e/Features/LandingPageWidgets/LandingPage.spec.ts
  • playwright/e2e/Features/LandingPageWidgets/LandingPageContextCenter.spec.ts
  • playwright/e2e/Features/LandingPageWidgets/LandingPageCriticalAnnouncements.spec.ts
  • playwright/e2e/Features/LandingPageWidgets/LandingPageDataEstate.spec.ts
  • playwright/e2e/Features/LandingPageWidgets/LandingPagePlatformHealth.spec.ts
  • playwright/e2e/Features/LandingPageWidgets/LandingPageTopicWidgets.spec.ts
  • playwright/e2e/Flow/CustomizeLandingPage.spec.ts
  • playwright/e2e/Pages/Entity.spec.ts
  • playwright/e2e/Features/Table.spec.ts
  • playwright/e2e/Features/ActivityFeedTabBadge.spec.ts
  • playwright/e2e/Features/DataQuality/TestSuiteListAfterReindex.spec.ts
  • playwright/e2e/Features/DataQuality/TestSuiteSummaryAfterReindex.spec.ts
  • playwright/e2e/Features/TestSuiteMultiPipeline.spec.ts
  • playwright/e2e/Features/TestSuitePipelineRedeploy.spec.ts
  • playwright/e2e/Pages/TestSuite.spec.ts
  • playwright/e2e/Pages/TestSuiteDetailsPage.spec.ts
  • playwright/e2e/Pages/DataProducts.spec.ts
  • playwright/e2e/Features/DataQuality/Profiler.spec.ts
  • playwright/e2e/Features/DataQuality/TableLevelTests.spec.ts
  • playwright/e2e/Features/ServiceAgentsDeploymentSummary.spec.ts
  • playwright/e2e/Features/ServiceAgentsKillVisibility.spec.ts
  • playwright/e2e/Features/ServiceAgentsLiveProgress.spec.ts
  • playwright/e2e/Features/ServiceAgentsPauseResume.spec.ts
  • playwright/e2e/Features/ServiceAgentsRefresh.spec.ts
  • playwright/e2e/Features/ServiceAgentsStatusDegradation.spec.ts
  • playwright/e2e/Features/ActivityAPI.spec.ts
  • playwright/e2e/Features/ActivityFeed.spec.ts
  • playwright/e2e/Features/ActivityStream.spec.ts
  • playwright/e2e/Features/AdvancedSearch.spec.ts
  • playwright/e2e/Features/AdvancedSearchSuggestions.spec.ts
  • playwright/e2e/Features/AgentLogStreamHandover.spec.ts
  • playwright/e2e/Features/AutoPilot.spec.ts
  • playwright/e2e/Features/BulkImport.spec.ts
  • playwright/e2e/Features/Dashboards.spec.ts
  • playwright/e2e/Features/DataAssetRulesDisabled.spec.ts
  • playwright/e2e/Features/DataAssetRulesEnabled.spec.ts
  • playwright/e2e/Features/DataProductDomainMigration.spec.ts
  • playwright/e2e/Features/DataProductPersonaCustomization.spec.ts
  • playwright/e2e/Features/DataProductRename.spec.ts
  • playwright/e2e/Features/DataProductRenameConsolidation.spec.ts
  • playwright/e2e/Features/DataQuality/AddTestCaseNewFlow.spec.ts
  • playwright/e2e/Features/DataQuality/BundleSuiteBulkOperations.spec.ts
  • playwright/e2e/Features/DataQuality/CertificationFilter.spec.ts
  • playwright/e2e/Features/DataQuality/ColumnLevelTests.spec.ts
  • playwright/e2e/Features/DataQuality/ColumnProfileGraphsAfterReindex.spec.ts
  • playwright/e2e/Features/DataQuality/DataObservabilityGovernanceTab.spec.ts
  • playwright/e2e/Features/DataQuality/DataObservabilityTabsAfterReindex.spec.ts
  • playwright/e2e/Features/DataQuality/DataQuality.spec.ts
  • playwright/e2e/Features/DataQuality/DataQualityDashboardAfterReindex.spec.ts
  • playwright/e2e/Features/DataQuality/DataQualityListAfterReindex.spec.ts
  • playwright/e2e/Features/DataQuality/DataQualityPermissions.spec.ts
  • playwright/e2e/Features/DataQuality/FailureThreshold.spec.ts
  • playwright/e2e/Features/DataQuality/IncidentManagerAfterOwnerChange.spec.ts
  • playwright/e2e/Features/DataQuality/IncidentManagerAfterReindex.spec.ts
  • playwright/e2e/Features/DataQuality/IncidentManagerAfterSoftDelete.spec.ts
  • playwright/e2e/Features/DataQuality/IncidentManagerDateFilter.spec.ts
  • playwright/e2e/Features/DataQuality/IncidentManagerLocaleLayout.spec.ts
  • playwright/e2e/Features/DataQuality/IncidentManagerSqlQuery.spec.ts
  • playwright/e2e/Features/DataQuality/ProfilerIngestionForm.spec.ts
  • playwright/e2e/Features/DataQuality/ProfilerSettingsAfterReindex.spec.ts
  • playwright/e2e/Features/DataQuality/RunTestCase.spec.ts
  • playwright/e2e/Features/DataQuality/TableTestCasePagination.spec.ts
  • playwright/e2e/Features/DataQuality/TestCaseCrudAfterReindex.spec.ts
  • playwright/e2e/Features/DataQuality/TestCaseDetailsPage.spec.ts
  • playwright/e2e/Features/DataQuality/TestCaseImportExportBasic.spec.ts
  • playwright/e2e/Features/DataQuality/TestCaseImportExportE2eFlow.spec.ts
  • playwright/e2e/Features/DataQuality/TestCaseIncidentPermissions.spec.ts
  • playwright/e2e/Features/DataQuality/TestCaseResultPermissions.spec.ts
  • playwright/e2e/Features/DataQuality/TestCaseSoftDeleteRestore.spec.ts
  • playwright/e2e/Features/DataQuality/TestCaseStatusAfterReindex.spec.ts
  • playwright/e2e/Features/DataQuality/TestDefinitionFilters.spec.ts
  • playwright/e2e/Features/DataQuality/TestDefinitionPermissions.spec.ts
  • playwright/e2e/Features/DataQuality/TestDefinitionSortAndSearch.spec.ts
  • playwright/e2e/Features/DataQuality/TestLibrary.spec.ts
  • playwright/e2e/Features/DomainFilterQueryFilter.spec.ts
  • playwright/e2e/Features/DomainIsolation/DomainDropdownIsolation.spec.ts
  • playwright/e2e/Features/DomainIsolation/DomainIncidentIsolation.spec.ts
  • playwright/e2e/Features/DomainIsolation/DomainLineageIsolation.spec.ts
  • playwright/e2e/Features/DomainIsolation/DomainListingIsolation.spec.ts
  • playwright/e2e/Features/DomainIsolation/DomainSearchIsolation.spec.ts
  • playwright/e2e/Features/DomainIsolation/DomainTaskIsolation.spec.ts
  • playwright/e2e/Features/DomainNavFilter/PersistedDomainFilter.spec.ts
  • playwright/e2e/Features/DomainTierCertificationVoting.spec.ts
  • playwright/e2e/Features/ExploreColumnsSortLabel.spec.ts
  • playwright/e2e/Features/ExploreFilterComposition.spec.ts
  • playwright/e2e/Features/ExploreQueryBar.spec.ts
  • playwright/e2e/Features/ExploreQuickFilters.spec.ts
  • playwright/e2e/Features/ExploreSortOrderFilter.spec.ts
  • playwright/e2e/Features/ExploreUrlState.spec.ts
  • playwright/e2e/Features/GlobalSearchSuggestions.spec.ts
  • playwright/e2e/Features/Glossary/GlossaryAssets.spec.ts
  • playwright/e2e/Features/Glossary/GlossaryMutualExclusivityDataProductTree.spec.ts
  • playwright/e2e/Features/Pagination.spec.ts
  • playwright/e2e/Features/Permissions/DataProductPermissions.spec.ts
  • playwright/e2e/Features/Permissions/DomainPermissions.spec.ts
  • playwright/e2e/Features/Permissions/EntityPermissions.spec.ts
  • playwright/e2e/Features/Permissions/ServiceEntityPermissions.spec.ts
  • playwright/e2e/Features/PersonaAppLayout.spec.ts
  • playwright/e2e/Features/SampleDataDomainDataProduct.spec.ts
  • playwright/e2e/Features/SchemaSearch.spec.ts
  • playwright/e2e/Features/SearchExport.spec.ts
  • playwright/e2e/Features/SearchIndexNestedColumns.spec.ts
  • playwright/e2e/Features/SearchSeparation/ApiEndpoint.spec.ts
  • playwright/e2e/Features/SearchSeparation/Container.spec.ts
  • playwright/e2e/Features/SearchSeparation/Dashboard.spec.ts
  • playwright/e2e/Features/SearchSeparation/Database.spec.ts
  • playwright/e2e/Features/SearchSeparation/DatabaseSchema.spec.ts
  • playwright/e2e/Features/SearchSeparation/DomainRenamePrefixCascade.spec.ts
  • playwright/e2e/Features/SearchSeparation/ExploreFilterSeparation.spec.ts
  • playwright/e2e/Features/SearchSeparation/GlossaryRenameCascade.spec.ts
  • playwright/e2e/Features/SearchSeparation/GlossaryRenamePrefixCascade.spec.ts
  • playwright/e2e/Features/SearchSeparation/Metric.spec.ts
  • playwright/e2e/Features/SearchSeparation/MlModel.spec.ts
  • playwright/e2e/Features/SearchSeparation/Pipeline.spec.ts
  • playwright/e2e/Features/SearchSeparation/StoredProcedure.spec.ts
  • playwright/e2e/Features/SearchSeparation/Topic.spec.ts
  • playwright/e2e/Features/SettingsNavigationPage.spec.ts
  • playwright/e2e/Features/StorageMetadataAgentForm.spec.ts
  • playwright/e2e/Features/TableSearch.spec.ts
  • playwright/e2e/Features/Tasks/ActivityFeed.spec.ts
  • playwright/e2e/Features/Tasks/DomainFiltering.spec.ts
  • playwright/e2e/Features/TierWidget.spec.ts
  • playwright/e2e/Flow/CustomizeWidgets.spec.ts
  • playwright/e2e/Flow/ExploreAggregationCountsMatching.spec.ts
  • playwright/e2e/Flow/ExploreDiscovery.spec.ts
  • playwright/e2e/Flow/GlobalSearch.spec.ts
  • playwright/e2e/Flow/LineageSettings.spec.ts
  • playwright/e2e/Flow/MetricListSearch.spec.ts
  • playwright/e2e/Flow/MetricSearch.spec.ts
  • playwright/e2e/Flow/Navbar.spec.ts
  • playwright/e2e/Flow/NotificationAlerts.spec.ts
  • playwright/e2e/Flow/ObservabilityAlerts.spec.ts
  • playwright/e2e/Flow/SearchRBAC.spec.ts
  • playwright/e2e/Flow/ServiceCreationPermissions.spec.ts
  • playwright/e2e/Pages/DataProductAndSubdomains.spec.ts
  • playwright/e2e/Pages/DataProductCertificationFilter.spec.ts
  • playwright/e2e/Pages/DataProductODPS.spec.ts
  • playwright/e2e/Pages/DomainAdvanced.spec.ts
  • playwright/e2e/Pages/DomainDataProductsRightPanel.spec.ts
  • playwright/e2e/Pages/DomainUIInteractions.spec.ts
  • playwright/e2e/Pages/Domains.spec.ts
  • playwright/e2e/Pages/EntityDomainPropagation.spec.ts
  • playwright/e2e/Pages/ExploreBrowse.spec.ts
  • playwright/e2e/Pages/ExplorePageRightPanel.spec.ts
  • playwright/e2e/Pages/ExplorePageRightPanel_KnowledgeCenter.spec.ts
  • playwright/e2e/Pages/ExploreResilience.spec.ts
  • playwright/e2e/Pages/ExploreTree.spec.ts
  • playwright/e2e/Pages/Glossary.spec.ts
  • playwright/e2e/Pages/HealthCheck.spec.ts
  • playwright/e2e/Pages/Lineage/LineageControls.spec.ts
  • playwright/e2e/Pages/LogsViewer.spec.ts
  • playwright/e2e/Pages/ODCSImportExport.spec.ts
  • playwright/e2e/Pages/ODCSImportExportPermissions.spec.ts
  • playwright/e2e/Pages/OmdURLConfiguration.spec.ts
  • playwright/e2e/Pages/Policies.spec.ts
  • playwright/e2e/Pages/ProfilerConfigurationPage.spec.ts
  • playwright/e2e/Pages/Roles.spec.ts
  • playwright/e2e/Pages/SearchSettings.spec.ts
  • playwright/e2e/Pages/SubDomainPagination.spec.ts
  • playwright/e2e/Pages/TableCreationTime.spec.ts
  • playwright/e2e/Pages/Tags.spec.ts
  • playwright/e2e/Pages/TaskFormSettings.spec.ts
  • playwright/e2e/Search/ExploreSearchCounts.spec.ts
  • playwright/e2e/Search/SearchNightly.spec.ts
  • playwright/e2e/Search/SearchRelevance.spec.ts
  • playwright/e2e/Features/SystemCertificationTags.spec.ts (--no-deps)
  • playwright/e2e/Pages/IntakeForm.spec.ts (--no-deps)

Manual testing performed

  1. Ran this branch's UI (Vite dev server) against a local backend; logged in as admin; AI mode; dark and light.
  2. Table details page: selected tab count is an outlined brand pill, others gray.
  3. Observability → Incident Manager: header divider visible in dark (rgb(55, 58, 65)).
  4. Data Marketplace: data product / domain icons stay solid in both themes (unchanged from main, per design).
  5. Connections (Collate build): composer measured flush with the canvas edge after the move, matching Home.
  6. Column detail drawer: opened a column on a table page in dark, checked the Overview, Data Quality and Custom Property tabs, and confirmed light is unchanged.
  7. Classic deprecation: opened the AI-shell switcher (light + dark) and the classic profile dropdown, hovered Classic to see the card; opened Settings → Platform Settings → Default App Mode → Edit and the classic /settings/preferences/appMode page (not saved).

UI screen recording:

Not applicable: styling fixes. Before/after screenshots below.

  • Before: the local Collate build of current OSS.
  • After: this branch.
  • Connections and AI Automations: Collate-only pages, so their "after" shots apply this PR's change in the DOM of the Collate build (footer moved to the page root; light FeaturedIcon given the new dark tokens).
Before After
Tab counts — dark
Tab counts — light
Table header divider (Incident Manager) — dark
Connections composer — dark (after: simulated on Collate build)
AI Automations tiles — dark (after: simulated on Collate build)

Status counts (IngestionStatusCount): no ingestion pipelines on the local stack to render them live; covered by IngestionStatusCount.test.tsx.

Classic mode deprecation

AI switcher — light AI switcher — dark
Classic navbar dropdown Admin: Platform Settings edit

Admin: classic settings page

Contract result pill (seeded a failed contract locally)

Before After
Dark (2.70 → 4.67:1)
Light (→ 6.05:1)

Beta chip (Knowledge Graph tab), after

Dark Light

Empty test-status chart (before = current Collate build; after = this PR + openmetadata-collate#7535)

Before After
Dark
Light

Column detail drawer

Before After
Overview — dark
Custom Property — dark
Overview — light (unchanged)

Insights tab tile padding (before = current Collate build; after = this PR + openmetadata-collate#7535)

Before After
Top row — light
Data Quality — light
Top row — dark
Data Quality — dark

Checklist:

  • I have read the CONTRIBUTING document.

  • My PR title is Fixes <issue-number>: <short explanation>. Not used: issue references stay in the description.

  • My PR is linked to a GitHub issue via Fixes … above.

  • I have commented on my code, particularly in hard-to-understand areas.

  • For JSON Schema changes: not applicable.

  • For a UI feature or feature task: not applicable (styling fixes; screenshots attached).

  • I have added tests (unit / integration / Playwright as applicable) and listed them above.

  • Decision check: adds docs/decisions/2026-10-16-light-featured-icons-stay-tinted-in-dark.md.

  • I have added a test that covers the exact scenario we are fixing.


Summary by Gitar

  • New connector:
    • Added Neo4j database connector
  • Connector removal:
    • Removed DeltaLake connector and its ingestion schema entries
  • Lineage:
    • Added inline lineage editing from node and column menus
    • Stripped FQN quotes from schema, database, and table names in lineage view filters
  • Assets tab:
    • Each Assets tab edit now saves as its own PATCH request
  • Authentication:
    • Confidential OIDC browsers receive the identity provider's ID token
    • Password reset now lifts login lockout
  • Dark mode and UI polish:
    • Fixed contract result pill contrast with a shared ContractLatestResultBadge
    • Added Classic mode deprecation notice in AppModeSwitcher and InterfaceModeMenuItem
  • Insights:
    • Standardized tile padding via Card.Content in PlatformInsightsWidget and TotalDataAssetsWidget

This will update automatically on new commits.

RetriggerView in GreptileConfidence Score: 5/5

The PR appears safe to merge; no new actionable issues were found.

Summary

This PR updates dark-mode colors and contrast, adds Classic mode retirement notices, and makes Insights card spacing consistent.

  • Classic mode now carries a retirement notice wherever people choose an interface.
  • Dark tables and light-theme icon tiles stay distinct in dark mode.
  • Selected entity tabs show brand count badges and other tabs show gray ones.
  • Ingestion run counts use colored badges for each status.
  • Contract result labels become linked badges with stronger text contrast.
  • Insights and Data Quality cards use consistent inner spacing.
  • The column detail drawer blends into its dark overlay instead of forming darker bands.
  • The Connections composer footer now reaches the page canvas edge.
  • The empty test-status chart placeholder stays within its card.

Reviews (12) · Last reviewed commit: "Merge origin/main into shah-harshit/auto..." · Reviewed by Greptile

…ity icons

- Ingestion/automation status counts use core Badge pills, left-aligned
- Active tab counts use an outlined brand Badge instead of a solid fill
- Core Table header divider uses border-primary in dark so it stays visible
- FeaturedIcon light theme keeps its tinted tile in dark instead of going solid
- Avatar gains placeholderIconColor; entity avatars use the brand tint by default
…-icon decision

The Connections list footer sat inside the padded PageLayout.Content, so the
AI composer stopped 8px above the canvas edge; it now mounts on the page root
like Home's footer slot.
@shah-harshit shah-harshit added UI UI specific issues safe to test Add this label to run secure Github workflows on PRs skip-pr-checks Bypass PR metadata validation check labels Oct 16, 2026
@shah-harshit shah-harshit self-assigned this Oct 16, 2026
…etting

Classic shows a Deprecated badge with a retirement notice and release-notes
link only where a user changes mode (AI-shell switcher, classic profile
dropdown) and on the admin Default App Mode setting.
@shah-harshit shah-harshit changed the title Fix dark-mode composer padding, table header divider, icon tiles, tab counts and status counts Fix dark-mode composer, table header, icon tiles, tab and status counts; mark Classic mode deprecated Oct 16, 2026
Total Data Assets list, Platform Insights KPI cards and the Data Quality pie
widgets render their content in Card.Content instead of caller padding
(tw:p-3, a gray p-4 box, LESS padding on the DQ dashboard), and the embedded
Insights sections drop their surface slab and extra header padding.
@shah-harshit shah-harshit changed the title Fix dark-mode composer, table header, icon tiles, tab and status counts; mark Classic mode deprecated Dark-mode fixes, Classic mode deprecation notice and consistent Insights tile padding Oct 16, 2026
Users pick these colors, so design keeps the solid fill until custom colors
are reworked. Reverts getEntityAvatarProps and drops the now-unused
Avatar.placeholderIconColor; the decision record now covers FeaturedIcon only.
The title block, content wrappers and footer painted @grey-9/@grey-50, which
resolve to bg-secondary (darker than the drawer's overlay surface) in dark;
they are transparent there now. Key profile metric tiles use an outline instead
of the darker fill in dark, and the custom properties list uses bg-surface
instead of the page-colour bg-primary. Light mode is unchanged.
@shah-harshit shah-harshit changed the title Dark-mode fixes, Classic mode deprecation notice and consistent Insights tile padding Dark-mode fixes, Classic mode deprecation notice, Insights tile padding and column drawer Oct 16, 2026
shah-harshit and others added 2 commits October 16, 2026 14:20
…chip overlap

The header Contract Failed / Aborted / Running pill was a secondary Button
recolored with ! classes; its 600 text measured 2.7:1 in dark. It is now a
shared ContractLatestResultBadge (core Badge palette, 4.7:1 dark / 6.1:1
light) that links to the Contract tab, on both data assets and data products.

Core Badge: a linked badge no longer adds tw:text-inherit, which won the
tailwind-merge conflict and dropped the badge's own text color.

TabsLabel: the Beta chip is no longer absolutely positioned over the next tab.
@github-actions

Copy link
Copy Markdown
Contributor

🔄 Playwright impact map auto-refreshed

This PR touched specs or UI source that changed the source→spec routing map. I regenerated .github/playwright/impact-map.generated.json and pushed the diff to this branch.

- source entries: 937 → 938
- 1 added, 0 removed, 2 changed spec-list

New source→spec entries:
  openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractLatestResultBadge/ContractLatestResultBadge.tsx

Entries whose spec list changed:
  openmetadata-ui/src/main/resources/ui/src/components/DataAssets/DataAssetsHeader/DataAssetsHeader.component.tsx
  openmetadata-ui/src/main/resources/ui/src/components/DataProducts/DataProductsDetailsPage/DataProductsDetailsPage.component.tsx

What is this file? It is the auto-generated half of Playwright's PR planner. It routes "if source X changes, run specs Y" by walking spec imports and cross-referencing getByTestId strings. Hand-authored routing in impact-map.json always wins on conflict.

What if I want to regenerate locally instead? Run this before pushing your next change to skip the bot commit:

python3 .github/scripts/generate_playwright_impact_map.py
git add .github/playwright/impact-map.generated.json
git commit --amend --no-edit  # or a separate commit

@shah-harshit shah-harshit changed the title Dark-mode fixes, Classic mode deprecation notice, Insights tile padding and column drawer Dark-mode and contrast fixes, Classic mode deprecation notice, Insights tile padding Oct 16, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Generated Sources Auto-Updated

The generated TypeScript types (src/generated/) and dereferenced JSON
schemas (src/jsons/, public/jsons/) have been automatically updated
based on JSON schema changes in this PR.

@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

❌ UI Checkstyle Failed

❌ Bundle Runtime Check

A route chunk loads but one of its chunks still exports undefined: a chunking change broke module initialisation. Run yarn build && yarn bundle:runtime locally.

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

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

0 error(s), 29 warning(s) across 7 changed file(s).

Count Rule
19 openmetadata-imports/no-impure-pure-utils
7 react-hooks/exhaustive-deps
2 openmetadata-ui-patterns/no-non-adaptive-palette
1 openmetadata-imports/no-lower-layer-page-imports
All findings
Location Rule Message
🟡 src/components/AppModeSwitcher/AppModeSwitcher.tsx:276:19 openmetadata-ui-patterns/no-non-adaptive-palette Raw palette class "tw:bg-blue-600" is static — it does not flip in dark mode. Use the theme-adapting "utility-" variant (tw:bg-utility-blue-600) or a semantic t
🟡 src/components/AppModeSwitcher/InterfaceModeMenuItem.tsx:31:3 openmetadata-ui-patterns/no-non-adaptive-palette Raw palette class "tw:hover:bg-blue-50" is static — it does not flip in dark mode. Use the theme-adapting "utility-" variant (tw:bg-utility-blue-50) or a semant
🟡 src/components/DataProducts/DataProductsDetailsPage/DataProductsDetailsPage.component.tsx:883:6 react-hooks/exhaustive-deps React Hook useMemo has missing dependencies: 'getEntityFeedCount', 'isVersionsView', and 'openAssetDrawer'. Either include them or remove the dependency array.
🟡 src/components/DataProducts/DataProductsDetailsPage/DataProductsDetailsPage.component.tsx:922:6 react-hooks/exhaustive-deps React Hook useEffect has missing dependencies: 'fetchActiveAnnouncement', 'fetchActivityCount', 'fetchDataProductAssets', 'fetchDataProductContract', and 'fetch
🟡 src/components/DataProducts/DataProductsDetailsPage/DataProductsDetailsPage.component.tsx:935:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 'tabs'. Either include it or remove the dependency array.
🟡 src/components/DataProducts/DataProductsDetailsPage/DataProductsDetailsPage.component.tsx:935:6 react-hooks/exhaustive-deps React Hook useMemo has a complex expression in the dependency array. Extract it to a separate variable so it can be statically checked.
🟡 src/components/DataQuality/ChartWidgets/DataAssetsCoveragePieChartWidget/DataAssetsCoveragePieChartWidget.component.tsx:22:1 openmetadata-imports/no-lower-layer-page-imports Pages are route-level composition modules. Move the shared implementation/type to a lower layer instead of importing a page from here.
🟡 src/components/DataQuality/ChartWidgets/DataAssetsCoveragePieChartWidget/DataAssetsCoveragePieChartWidget.component.tsx:102:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array.
🟡 src/components/DataQuality/ChartWidgets/EntityHealthStatusPieChartWidget/EntityHealthStatusPieChartWidget.component.tsx:90:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array.
🟡 src/components/DataQuality/ChartWidgets/TestCaseStatusPieChartWidget/TestCaseStatusPieChartWidget.component.tsx:91:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array.
🟡 src/utils/EntityDisplayPureUtils.tsx:14:1 openmetadata-imports/no-impure-pure-utils Pure utilities must not depend on React, UI, state, hooks, pages, or REST clients. Move orchestration/rendering out or move shared types to a lower layer.
🟡 src/utils/EntityDisplayPureUtils.tsx:18:1 openmetadata-imports/no-impure-pure-utils Pure utilities must not depend on React, UI, state, hooks, pages, or REST clients. Move orchestration/rendering out or move shared types to a lower layer.
🟡 src/utils/EntityDisplayPureUtils.tsx:33:7 openmetadata-imports/no-impure-pure-utils Pure utilities must not render JSX. Move this code to a component or renderer and keep PureUtils as a .ts module.
🟡 src/utils/EntityDisplayPureUtils.tsx:44:5 openmetadata-imports/no-impure-pure-utils Pure utilities must not render JSX. Move this code to a component or renderer and keep PureUtils as a .ts module.
🟡 src/utils/EntityDisplayPureUtils.tsx:49:7 openmetadata-imports/no-impure-pure-utils Pure utilities must not render JSX. Move this code to a component or renderer and keep PureUtils as a .ts module.
🟡 src/utils/EntityDisplayPureUtils.tsx:52:9 openmetadata-imports/no-impure-pure-utils Pure utilities must not render JSX. Move this code to a component or renderer and keep PureUtils as a .ts module.
🟡 src/utils/EntityDisplayPureUtils.tsx:62:5 openmetadata-imports/no-impure-pure-utils Pure utilities must not render JSX. Move this code to a component or renderer and keep PureUtils as a .ts module.
🟡 src/utils/EntityDisplayPureUtils.tsx:63:7 openmetadata-imports/no-impure-pure-utils Pure utilities must not render JSX. Move this code to a component or renderer and keep PureUtils as a .ts module.
🟡 src/utils/EntityDisplayPureUtils.tsx:73:3 openmetadata-imports/no-impure-pure-utils Pure utilities must not render JSX. Move this code to a component or renderer and keep PureUtils as a .ts module.
🟡 src/utils/EntityDisplayPureUtils.tsx:75:5 openmetadata-imports/no-impure-pure-utils Pure utilities must not render JSX. Move this code to a component or renderer and keep PureUtils as a .ts module.
🟡 src/utils/EntityDisplayPureUtils.tsx:75:54 openmetadata-imports/no-impure-pure-utils Pure utilities must not render JSX. Move this code to a component or renderer and keep PureUtils as a .ts module.
🟡 src/utils/EntityDisplayPureUtils.tsx:86:5 openmetadata-imports/no-impure-pure-utils Pure utilities must not render JSX. Move this code to a component or renderer and keep PureUtils as a .ts module.
🟡 src/utils/EntityDisplayPureUtils.tsx:88:34 openmetadata-imports/no-impure-pure-utils Pure utilities must not render JSX. Move this code to a component or renderer and keep PureUtils as a .ts module.
🟡 src/utils/EntityDisplayPureUtils.tsx:95:10 openmetadata-imports/no-impure-pure-utils Pure utilities must not render JSX. Move this code to a component or renderer and keep PureUtils as a .ts module.
🟡 src/utils/EntityDisplayPureUtils.tsx:106:7 openmetadata-imports/no-impure-pure-utils Pure utilities must not render JSX. Move this code to a component or renderer and keep PureUtils as a .ts module.
🟡 src/utils/EntityDisplayPureUtils.tsx:109:11 openmetadata-imports/no-impure-pure-utils Pure utilities must not render JSX. Move this code to a component or renderer and keep PureUtils as a .ts module.
🟡 src/utils/EntityDisplayPureUtils.tsx:134:7 openmetadata-imports/no-impure-pure-utils Pure utilities must not render JSX. Move this code to a component or renderer and keep PureUtils as a .ts module.
🟡 src/utils/EntityDisplayPureUtils.tsx:135:9 openmetadata-imports/no-impure-pure-utils Pure utilities must not render JSX. Move this code to a component or renderer and keep PureUtils as a .ts module.
🟡 src/utils/EntityDisplayPureUtils.tsx:136:11 openmetadata-imports/no-impure-pure-utils Pure utilities must not render JSX. Move this code to a component or renderer and keep PureUtils as a .ts module.

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

make ui-checkstyle-changed

shah-harshit and others added 4 commits October 16, 2026 17:58
A rebase flattened earlier merges of main into this branch, replaying copies
of 13 main commits (e.g. #35291, #34551) under new SHAs. This merge restores
main as an ancestor and resolves the tree to current main plus only this PR's
changes, so the PR diff is back to its own files.
They were generated from the branch before the replayed main commits were
dropped; this PR changes no schemas, and CI regenerates the impact map.
@github-actions

Copy link
Copy Markdown
Contributor

🔄 Playwright impact map auto-refreshed

This PR touched specs or UI source that changed the source→spec routing map. I regenerated .github/playwright/impact-map.generated.json and pushed the diff to this branch.

- source entries: 936 → 938
- 2 added, 0 removed, 13 changed spec-list

New source→spec entries:
  openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractLatestResultBadge/ContractLatestResultBadge.tsx
  openmetadata-ui/src/main/resources/ui/src/components/Database/Profiler/TableProfiler/QualityTab/QualityTab.component.tsx

Entries whose spec list changed:
  openmetadata-ui/src/main/resources/ui/playwright/e2e/fixtures/pages.ts
  openmetadata-ui/src/main/resources/ui/playwright/support/entity/TableClass.ts
  openmetadata-ui/src/main/resources/ui/playwright/support/entity/service/DatabaseServiceClass.ts
  openmetadata-ui/src/main/resources/ui/playwright/utils/admin.ts
  openmetadata-ui/src/main/resources/ui/playwright/utils/apiResponse.ts
  openmetadata-ui/src/main/resources/ui/playwright/utils/common.ts
  openmetadata-ui/src/main/resources/ui/playwright/utils/entity.ts
  openmetadata-ui/src/main/resources/ui/playwright/utils/scopedLocators.ts
  openmetadata-ui/src/main/resources/ui/playwright/utils/testCases.ts
  openmetadata-ui/src/main/resources/ui/playwright/utils/waitHelpers.ts
  … and 3 more

What is this file? It is the auto-generated half of Playwright's PR planner. It routes "if source X changes, run specs Y" by walking spec imports and cross-referencing getByTestId strings. Hand-authored routing in impact-map.json always wins on conflict.

What if I want to regenerate locally instead? Run this before pushing your next change to skip the bot commit:

python3 .github/scripts/generate_playwright_impact_map.py
git add .github/playwright/impact-map.generated.json
git commit --amend --no-edit  # or a separate commit

@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Jest test Coverage

UI tests summary

Lines Statements Branches Functions
Coverage: 78%
78.57% (129858/165266) 65.32% (82562/126396) 66.67% (27590/41382)

@shah-harshit
shah-harshit added this pull request to the merge queue Oct 17, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 17, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🚦 Removed from the merge queue — failed_checks (2026-10-17T05:58:16Z)

Blocked the queue: ui-checkstyle

Keep main's banner layout without its FeaturedIcon dark override (core now tints the light theme in dark).
Take main's ai-explore baseline. Translate this PR's keys in the new it-it locale.
Comment on lines 137 to 142
// 12px padding + the 1px antd border that the core ::after outline no longer
// takes; not-last:-mr-px keeps antd's `.ant-btn + .ant-btn` 1px overlap with
// the next group button.
const CONTRACT_RESULT_BUTTON_BASE_CLASS = [
'tw:h-10 tw:gap-2 tw:rounded-xl tw:px-3.25 tw:py-1.5 tw:text-sm tw:font-semibold tw:not-last:-mr-px',
'tw:shadow-[0px_2px_2px_-1px_var(--om-legacy-color-10-13-18-0-04),0px_4px_6px_-2px_var(--om-legacy-color-10-13-18-0-04),0px_12px_16px_-4px_var(--om-legacy-color-10-13-18-0-04)]!',
].join(' ');

const CONTRACT_RESULT_BUTTON_BORDER_CLASS: Partial<
Record<ContractExecutionStatus, string>
> = {
[ContractExecutionStatus.Failed]: 'tw:after:outline-utility-error-200!',
[ContractExecutionStatus.Aborted]:
'tw:after:outline-(--om-legacy-color-f9dbaf)! tw:dark:after:outline-utility-orange-200!',
[ContractExecutionStatus.Running]: 'tw:after:outline-utility-brand-200!',
};

// Extracted from DataProductsDetailsPage's render to keep the component's
// complexity down. Builds the "Manage" dropdown menu content from the
// permission flags and the modal/action toggles the page owns.

@gitar-bot gitar-bot Bot Oct 17, 2026 •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Quality: Orphaned comment left over from the removed contract button constants

This commit deleted CONTRACT_RESULT_BUTTON_BASE_CLASS and CONTRACT_RESULT_BUTTON_BORDER_CLASS, but kept the comment above them ("12px padding + the 1px antd border … not-last:-mr-px keeps antd's .ant-btn + .ant-btn 1px overlap"). That comment now runs straight into the getManageButtonContent doc comment, so it reads as if it describes the Manage menu builder. It refers to classes that no longer exist in the file. Delete lines 137-139.

Drop the stale comment and keep only the getManageButtonContent comment:

// Extracted from DataProductsDetailsPage's render to keep the component's
// complexity down. Builds the "Manage" dropdown menu content from the
// permission flags and the modal/action toggles the page owns.

Was this helpful? React with 👍 / 👎

@gitar-bot

gitar-bot Bot commented Oct 17, 2026

Copy link
Copy Markdown
Code Review 👍 Approved with suggestions 2 closed / 3 findings

🔴 High risk · Changing OIDC token delivery and password-reset lockout behavior alters authentication controls and could enable unintended access if token handling or lockout reset is misapplied.

Contract result pill, Classic mode deprecation notice, Insights tile padding, and dark-mode fixes across tabs, table headers, and the column drawer are in place. One open minor issue: an orphaned comment in DataProductsDetailsPage.component.tsx (lines 137-142) still refers to the removed contract button constants and should be deleted. Resolved this session: the Classic-mode retirement and auto-migration rule now has a decision record.

💡 Quality: Orphaned comment left over from the removed contract button constants

📄 openmetadata-ui/src/main/resources/ui/src/components/DataProducts/DataProductsDetailsPage/DataProductsDetailsPage.component.tsx:137-142

This commit deleted CONTRACT_RESULT_BUTTON_BASE_CLASS and CONTRACT_RESULT_BUTTON_BORDER_CLASS, but kept the comment above them ("12px padding + the 1px antd border … not-last:-mr-px keeps antd's .ant-btn + .ant-btn 1px overlap"). That comment now runs straight into the getManageButtonContent doc comment, so it reads as if it describes the Manage menu builder. It refers to classes that no longer exist in the file. Delete lines 137-139.

Drop the stale comment and keep only the getManageButtonContent comment
// Extracted from DataProductsDetailsPage's render to keep the component's
// complexity down. Builds the "Manage" dropdown menu content from the
// permission flags and the modal/action toggles the page owns.
✅ 2 closed
✅ Quality: Classic-mode retirement and auto-migration rule has no decision record

📄 openmetadata-ui/src/main/resources/ui/src/locale/languages/en-us.json:4024-4026 📄 openmetadata-ui/src/main/resources/ui/src/constants/appMode.constants.ts:70-72 📄 openmetadata-ui/src/main/resources/ui/src/components/AppModeSwitcher/ClassicDeprecationNotice.tsx:35-49
This commit announces a product decision across the UI but adds no record of it in docs/decisions/. The only new ADR in the PR (2026-10-16 light featured icons) covers icon tinting, and the existing records (2026-10-12 dark-mode-targets-ai-mode, 2026-10-13 classic-forms-reuse) treat Classic as a supported mode. The new copy says "Classic mode retires in an upcoming release. Organizations and personas still set to Classic will move to AI automatically" (message.classic-mode-retiring-admin). It also says "Classic will be removed in an upcoming release. After that, AI mode will be the only interface. You can switch now and keep your settings." That is a cross-component promise: the backend or migration has to rewrite defaultAppMode/persona values of Classic to AI, and user settings have to carry over. Nothing in the tree states it. The record would assert: "Classic mode is deprecated as of 2026-10; in the release that removes it, any organization defaultAppMode or persona app mode set to Classic is migrated to AI, user preferences are preserved, and the UI marks Classic as Deprecated with a link to the release notes until then." Add docs/decisions/2026-10-<dd>-classic-mode-is-deprecated.md with that rule, and link the 2026-10-12 dark-mode record, whose revisit condition depends on whether Classic is kept.

Closed: Bug: Release-notes link inside RadioButton hint won't open; it selects Classic

📄 openmetadata-ui/src/main/resources/ui/src/components/AppModeSwitcher/ClassicDeprecationNotice.tsx:19-33 📄 openmetadata-ui/src/main/resources/ui/src/components/AppModeSwitcher/ClassicDeprecationNotice.tsx:55-63 📄 openmetadata-ui/src/main/resources/ui/src/pages/Settings/DefaultAppModePage/DefaultAppModePage.tsx:143-147 📄 openmetadata-ui/src/main/resources/ui/src/components/discovery/personal-space/Profile/tabs/platform-settings/AppModeSettingsForm.tsx:134-138
ClassicDeprecationHint puts an <a target="_blank"> (ReleaseNotesLink) into the hint of a core RadioButton. RadioButton renders react-aria-components' Radio, which wraps label and hint in a <label> that spreads useRadio's labelProps. Those labelProps include usePress handlers that select the radio, plus an onClick that calls e.preventDefault() (react-spectrum#5525). The link's click bubbles up to that label, so on both the admin Default App Mode page and the profile App Mode form, clicking "Read the release notes" does not navigate. It also changes the selection to Classic, which makes the form dirty and enables Save. The new test only checks the target attribute, so it does not catch this. Fix: render the hint (or just the link) outside the RadioButton, e.g. one line under the radio group. Alternatively, stop the press and click from reaching the label, keeping in mind that the parent's preventDefault will still cancel navigation unless the link sits outside the <label>.

🤖 Prompt for agents
Code Review: Contract result pill, Classic mode deprecation notice, Insights tile padding, and dark-mode fixes across tabs, table headers, and the column drawer are in place. One open minor issue: an orphaned comment in `DataProductsDetailsPage.component.tsx` (lines 137-142) still refers to the removed contract button constants and should be deleted. Resolved this session: the Classic-mode retirement and auto-migration rule now has a decision record.

1. 💡 Quality: Orphaned comment left over from the removed contract button constants
   Files: openmetadata-ui/src/main/resources/ui/src/components/DataProducts/DataProductsDetailsPage/DataProductsDetailsPage.component.tsx:137-142

   This commit deleted `CONTRACT_RESULT_BUTTON_BASE_CLASS` and `CONTRACT_RESULT_BUTTON_BORDER_CLASS`, but kept the comment above them ("12px padding + the 1px antd border … not-last:-mr-px keeps antd's `.ant-btn + .ant-btn` 1px overlap"). That comment now runs straight into the `getManageButtonContent` doc comment, so it reads as if it describes the Manage menu builder. It refers to classes that no longer exist in the file. Delete lines 137-139.

   Fix (Drop the stale comment and keep only the getManageButtonContent comment):
   // Extracted from DataProductsDetailsPage's render to keep the component's
   // complexity down. Builds the "Manage" dropdown menu content from the
   // permission flags and the modal/action toggles the page owns.

Verification

Rules No rules evaluated

Functional validation Not enabled

Set up

Auto-approval Not enabled

Set up

For more verification details, comment gitar display:verbose.

Options

Display: compact → Showing compact verification results.

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

Compact
gitar display:verbose         

Was this helpful? React with 👍 / 👎 | Powered by Gitar — free for open source

@sonarqubecloud

Copy link
Copy Markdown

@shah-harshit
shah-harshit added this pull request to the merge queue Oct 17, 2026
Merged via the queue into main with commit ca57b64 Oct 17, 2026
83 checks passed
@shah-harshit
shah-harshit deleted the shah-harshit/automations-icons-fix branch October 17, 2026 10:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

safe to test Add this label to run secure Github workflows on PRs skip-pr-checks Bypass PR metadata validation check UI UI specific issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.