Skip to content

refactor(ui): remove antd from classic-mode Observability - #35190

Merged
harsh-vador merged 24 commits into
mainfrom
ShaileshParmar11/classic-observability-antd-free
Oct 14, 2026
Merged

harsh-vador merged 24 commits into
mainfrom
ShaileshParmar11/classic-observability-antd-free

Conversation

@ShaileshParmar11

@ShaileshParmar11 ShaileshParmar11 commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #35189
Part of open-metadata/openmetadata-collate#6826

Summary

Classic Observability uses @openmetadata/ui-core-components in place of Ant Design, preserving saved payloads, validation, permissions and selection behavior. Covers alert lists/details/forms/destinations, test-case and quality filters, test-suite owners, data-quality parameter forms, custom metrics, incident SQL actions and profiler configuration.

Shared alert widgets use controlled values, while the Classic notification form registers the saved input/template/draft fields. The shared initial-values mapper lives in Alerts utilities. See the controlled-widget decision record.

Behavior and review fixes

  • Disabled FQN fields prevent removal. Long FQNs use the same core Autocomplete chips as AI mode, remain contained on narrow screens, and persist their full value; multi-source search and wildcard handling remain intact.
  • The entire profiler section uses the default core Card surface in light/dark modes. Add Test Cases uses the standard scrolling Dialog body and visible, aligned footer actions in Classic and AI modes.
  • Data Quality Manage actions retain their permission gates. Filtered Select popups remain interactive inside modals; large-list keyboard behavior has browser coverage.
  • Supported Select/ComboBox APIs and default ButtonUtility diagnostic help resolve the Sonar findings and the confirmed missing keyboard-focus outline. The preceding Sonar analysis completed with zero annotations.
  • Static inline styles use existing core props and token classes. Six inherited runtime/passthrough styles remain; no new inline styles or style elements remain.
  • The full OSS/Collate PR diffs were checked for adjacent filter/map chains and string/number guards. All 15 introduced occurrences now use typed single-pass reducers or named Lodash guards, preserving order, duplicate handling and profiler payload semantics. Inherited unrelated chains remain unchanged.
  • Suppression baselines/counts and generated token/spec references are synchronized with the migrated implementation.

Validation

Latest main merge: 1,640 application Jest tests passed (122 OSS suites / 1,559 tests; 6 Collate suites / 81 tests), plus 46 core-component tests and 191 ESLint-rule tests. Both production application builds and the core build passed. Both branches contain their latest fetched main commits: OSS 9b5f77e0d8a, Collate 36d04e269.

16 existing Playwright cases passed without retries against the combined Collate instance and real APIs: multi-source alerts, both notification/observability permission lifecycles, pipeline alerts including diagnostic keyboard focus, custom metrics and large Select keyboard navigation, SQL-query validation/save, test-case modal filters/selection/footer, template saves, and Spark create/edit/delete with persisted extra configuration.

The original profiler configuration spec is blocked in its beforeAll API fixture by a 409 when creating a test-case result, before exercising the UI. A separate real-browser check on a fresh owned table passed the full profiler save payload and reload round trip, including sampling, include/exclude columns, query and partition settings; the table was cleaned up afterwards.

Conflicts retain the migrated controlled forms/core components and upstream's unreadable-event handling. Generated impact maps were regenerated; suppression counts are synchronized at 459 Ant Design symbols / 581 positional locators. Upstream's dark brand-400 link token is retained, its contract assertion updated, and unused generated tokens/reference rows pruned. Complete PR changed-file imports/lint/format, full source suppression pruning (zero errors), token drift, rule-table freshness and all applicable commit/push hooks passed. Collate builds use the local smoke aliases to canonical OSS source/core.

Full application type checking remains non-green: 569 diagnostics on this merge. The resolved CustomMetric prop error matches the preceding baseline; unrelated type cleanup is outside this merge. A fresh full AUT/CAIP run and completed CI checks remain necessary before merge.

Earlier broader validation covered 723 OSS Jest tests and 13 browser cases, including custom metrics, SQL-query validation/save and keyboard selection with more than 100 options. Core build/type checking, 191 ESLint-rule tests and rule-table/impact-map freshness also passed in the preceding validation. Desktop/narrow layout comparisons at 1500px/1024px matched 96 layout nodes per viewport.

Remaining validation limits

A fresh full AUT/CAIP run is still needed for these heads. Prior nightly run 38133117590 predates the current changes. Earlier CAIP 38155420513 reported 122 passed, 4 failed, 3 flaky and 7 skipped; the credits-banner conversation-loading failures also occur in an unrelated merge-queue run, while Explore attribution remains unconfirmed.

Spark configuration CRUD is now validated against real Collate ingestion-runner APIs. Argo deployment and the complete Spark profiler workflow were not exercised locally. Full source lint retains an unrelated Ant Design Table import in AppRunsHistory.merge.test.tsx, unchanged from main. Existing application type errors are outside this migration. CI for the latest commits must finish before merge.

Merge order

Door: two-way. Blast radius: Classic Observability and shared alert/profiler/select components.

Merge OSS first, then Collate #7276. After OSS merges, restore Collate's OpenMetadata submodule branch to main, update it to merged OSS and rerun its build before merging Collate.

Current OSS head: 307c919823e. Companion Collate head: c0e99c079.

Review round 2 (7ad258d680d, 629e713906e)

All 21 review threads are answered and resolved. Behaviour-relevant changes:

  • Alert widget updates use setValue per key (applyAlertValueChanges), not a full reset, so the alert form keeps the loaded alert's defaults. Typing no longer re-renders the whole form: sections watch only their fields, each Collate widget has its own <Watch>, and validation errors come from useWatch({ compute }).
  • An added filter row mounts once with its final key; rule argument labels are hidden through isLabelHidden (with aria-label), not a descendant selector.
  • Profiler configuration no longer drops metrics outside the client's MetricType enum.
  • Tier and dimension filters are marked searchable in their descriptors; FilterChip passes onSearch through, so 2.0 chips for those filters now show a search box.
  • Kept intentionally (rationale on the threads): the Dropdown section-header styling, which matches the other callers because core is unstyled, and the layout-* gutter classes, a candidate for a cross-form layout follow-up.

Validation: 161 Jest suites / 2,167 tests, core select 22 tests, 191 ESLint-rule tests, changed-file ESLint (0 errors) and Prettier, and token drift regenerated. Playwright against Collate running this head: Observability/Notification alerts, AlertSeveralSources and ProfilerConfigurationPage 22/23; the miss passed 4/4 on rerun. Main merged as 86a81d6c6e8 (suppression baselines remeasured: 426 antd symbols, 579 positional locators). Fresh AUT 38360065314.

Screenshots and recording (629e713906e, classic mode)

Classic notification alert: source picker with section headers, then two filter rows added (each row mounts once; labels hidden through isLabelHidden).

pr35190-alert-form.mp4
Source picker Filter rows
Alert source dropdown Alert filter rows
Profiler configuration Test case filters
Profiler configuration Test case filters
Incident Manager filters and date trigger
Incident manager

@github-actions

github-actions Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

✅ SSO Login Nightly — PASSED

View workflow run · Commit 4d14e49

Provider Status Pass Fail Flaky Skip Duration
basic ✅ pass 28 0 0 0 6m 50s
ldap ✅ pass 7 0 0 0 1m 05s
keycloak-oidc-confidential ✅ pass 12 0 0 0 1m 55s
keycloak-oidc-public ✅ pass 11 0 0 0 1m 34s
msal-mock ✅ pass 7 0 0 0 0m 59s
auth0-mock ✅ pass 6 0 0 0 0m 42s
okta ⏩ skipped - - - - -
keycloak-azure-saml ✅ pass 23 0 0 0 5m 53s
keycloak-azure-saml-crosssite ⏩ skipped - - - - -

Totals: 94 passed · 0 failed · 0 flaky · 0 skipped · duration 19m 02s

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@shah-harshit shah-harshit left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Two-axis review (Standards / Spec) of the classic Observability antd → core migration.

Standards: 1 raw --om-* colour (--om-grey-1 on a core Card). Raw div/span and an inline style colour remain in the migrated tooltips. Legacy text utilities (font-medium, text-grey-muted, tw:text-secondary) are passed through className where Typography already has weight/color props. Several caller-side restyles of core components remain (Dropdown.SectionHeader, AccordionHeader, Card.Content padding, the [&_label] descendant selector). There are also whole-form form.watch() subscriptions and duplicated source-change/onValuesChange logic. Worst: the --om-grey-1 override of the core Card surface.

Spec (#35189: remove antd, no behaviour change): AddNotificationPage still imports antd Form/Input. Profiler configuration save now drops unknown metric values, where it used to send them unchanged. A minor remount on adding a rule comes from effect-based row keys. Worst: the metrics-dropping change in getProfilerConfigurationPayload.

No --om-* colours elsewhere: the rest of the --om- hits are --om-space-* layout gutters (see the comment on ObservabilityAlertForm.tsx).

A template draft calls onValuesChange on every keystroke, and a full
reset also replaced the alert form's default values each time. setValue
per key keeps the defaults and still re-syncs the destinations field
array when a source change clears it.
…sic-observability-antd-free

# Conflicts:
#	openmetadata-ui/src/main/resources/ui/eslint-rules/openmetadata-antd.test.mjs
#	openmetadata-ui/src/main/resources/ui/playwright/eslint-rules/tests/corpus.test.mjs
- Use core component props instead of caller classes: Typography
  size/weight/color in the test summary and heatmap tooltips, recent
  events tab and quality filters; default Card surface and padding in
  the test suite pipeline; Box instead of raw divs; Typography ellipsis
  in the date picker trigger; no !important link override.
- Alert forms: subscribe only to the fields each section reads, give
  Collate widgets and extra buttons their own Watch, and compute
  validation errors with useWatch so typing no longer re-renders the
  whole form.
- Rule rows get their key in the same render as the rule, so an added
  row mounts once; rule argument fields hide their label through an
  isLabelHidden prop instead of a descendant selector.
- Notification page reuses getAlertSourceChanges and keeps its rule
  validator free of state updates.
- Profiler configuration keeps metrics the client enum does not know.
- Test case filters mark tier and dimension searchable in their
  descriptors; FilterChip passes the descriptor's onSearch through.
- Document the react-aria top-layer marker on Select listboxes with the
  upstream issues and guard it with a Select-in-modal test.
- Regenerate the design-token block and reference after the removed
  Less rules dropped their last uses.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actions

Copy link
Copy Markdown
Contributor

🚦 Removed from the merge queue — manual (2026-10-13T08:39:45Z)

The entry left the queue before it was built, so no checks ran against it.

…sic-observability-antd-free

# Conflicts:
#	openmetadata-ui/src/main/resources/ui/eslint-rules/openmetadata-antd.test.mjs
#	openmetadata-ui/src/main/resources/ui/eslint-suppressions.json
#	openmetadata-ui/src/main/resources/ui/playwright/eslint-rules/tests/corpus.test.mjs
#	openmetadata-ui/src/main/resources/ui/specs/tokens/token-reference.md
#	openmetadata-ui/src/main/resources/ui/src/components/Alerts/AlertDetails/AlertRecentEventsTab/AlertRecentEventsTab.test.tsx
#	openmetadata-ui/src/main/resources/ui/src/components/Alerts/AlertDetails/AlertRecentEventsTab/AlertRecentEventsTab.tsx

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

The aria-label replaced the button's accessible name, so screen readers
heard only "Filters" after a filter was applied. Include the applied
filter text in the name so it matches what is shown.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actions

Copy link
Copy Markdown
Contributor

🚦 Removed from the merge queue — manual (2026-10-14T07:05:34Z)

The entry left the queue before it was built, so no checks ran against it.

…sic-observability-antd-free

# Conflicts:
#	openmetadata-ui/src/main/resources/ui/eslint-rules/openmetadata-antd.test.mjs

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actions

Copy link
Copy Markdown
Contributor

🚦 Removed from the merge queue — merge_conflict (2026-10-14T10:16:09Z)

The entry left the queue before it was built, so no checks ran against it.

Conflicts with the latest main — rebase, then re-queue.

…sic-observability-antd-free

Conflict in ProfilerSettingsModal.tsx with #35370 (keep include-column and
metrics dropdowns outside the scroll wrapper): kept this branch's core
react-hook-form version. #35370 fixed antd getPopupContainer, which no longer
exists here; the core pickers open in a react-aria popover outside the
include-column scroll box. Its three antd popup-container tests are replaced
by one test asserting that on the core version.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

…hange

main's #35348 dropped the xxs Button size (sizes are now xs-xl) and moved
its own call sites to xs. The xxs Buttons this branch adds (number input
steppers, slider reset, profiler and date picker menu actions) reached the
merge unchanged, and core Button throws on an unknown size, failing the
profiler, slider and date picker suites. Move them to xs as #35348 did.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@gitar-bot

gitar-bot Bot commented Oct 14, 2026

Copy link
Copy Markdown
Code Review ✅ Approved 2 closed / 2 findings

🟡 Medium risk · Replacing Ant Design forms across alert, data-quality, and profiler workflows changes saved-value mapping, which could persist unintended filters or profiler settings.

Migrates Classic Observability from Ant Design to core components across alerts, test-case and quality filters, profiler configuration, and related forms. Resolved this session: the diagnostic info icon is now keyboard-focusable with a visible focus ring, and the Recent Events filter button's accessible name now includes the applied filter text (Filters : Successful), fixing the Label in Name issue. No open findings remain.

✅ 2 closed
✅ Quality: Diagnostic info icon is now tabbable but has no visible focus ring

📄 openmetadata-ui/src/main/resources/ui/src/components/Alerts/AlertDetails/AlertDiagnosticInfo/AlertDiagnosticInfoTab.tsx:86-93
The commit drops excludeTriggerFromTabOrder and wraps InfoCircle in core TooltipTrigger. That component renders an AriaButton with tw:outline-hidden and puts nothing in its place (tooltip.tsx:338-342). Every diagnostic row now adds a Tab stop, and a keyboard user who lands on it sees no focus indicator, which breaks the repo's "never remove the focus ring" rule. Give the trigger a visible focus style, such as className="tw:rounded-sm tw:focus-visible:outline-2 tw:focus-visible:outline-focus-ring". Or keep excludeTriggerFromTabOrder if the description should only show on hover.

✅ Quality: Filter button aria-label hides the applied filter from screen readers

📄 openmetadata-ui/src/main/resources/ui/src/components/Alerts/AlertDetails/AlertRecentEventsTab/AlertRecentEventsTab.tsx:415-427
The new aria-label={t('label.filter-plural')} on the filter Button replaces its accessible name. Once a filter is selected, the button also shows the text : <filter label> (the applied-filter-text Typography), but screen readers still only hear "Filters", so they never learn which filter is active. This also fails WCAG 2.5.3 Label in Name and goes against the repo rule that aria-label should be used only when there is no visible label. Fix: set aria-label only when there is no visible text (the ALL filter), or put the applied filter label into the name.

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

safe to test Add this label to run secure Github workflows on PRs UI UI specific issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Remove antd from classic-mode Observability

5 participants