Skip to content

Migrate antd Form, Select and Input to core components - #35280

Merged
shah-harshit merged 50 commits into
mainfrom
shah-harshit/antd-select-input-standalone
Oct 14, 2026
Merged

shah-harshit merged 50 commits into
mainfrom
shah-harshit/antd-select-input-standalone

Conversation

@shah-harshit

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

Copy link
Copy Markdown
Contributor

Describe your changes:

Part of open-metadata/openmetadata-collate#6893 and open-metadata/openmetadata-collate#6894 (epic open-metadata/openmetadata-collate#6884).

Moves antd Form, Select and Input onto @openmetadata/ui-core-components (react-hook-form + HookForm / FormField / FormFields, Select, Select.ComboBox, Autocomplete, Input, PasswordInput). This single PR combines the three parts that were opened separately, to go through the merge queue once:

  1. Standalone controls — every antd Select / Input not bound to an antd Form (this PR's original scope).
  2. Settings and admin forms — previously Migrate settings and admin forms from antd Form to core HookForm #35285.
  3. Remaining form controls — previously Migrate the remaining antd form controls to core components #35347.

Out of scope (in flight elsewhere): Data Quality, Observability / Alerts and Profiler forms are migrated by #35190 (OSS) and open-metadata/openmetadata-collate#7276 (Collate), including AddTestSuitePipeline, SliderWithInput, CustomRangeWidget, AsyncSelect in alerts and FQNListSelect. Once #35190 lands, a follow-up removes the legacy antd field renderer in utils/formUtils.tsx and freezes Form / Select / Input in MIGRATED_ANTD_COMPONENTS.

Type of change:

  • Improvement

High-level design:

Part 1 — standalone controls

antd usage Core replacement
Plain single select Select (selectedKey / value + onChange)
Searchable single select Select.ComboBox (caller filters items; empty input clears the value like allowClear)
Multi / async / server-search select Autocomplete (multiple, filterOption={() => true}, onSearchChange)
mode="tags" Autocomplete with allowsCreation + hideDropdown (CSV split and paste kept)
Input / Input.Password Input (inputDataTestId) / PasswordInput

Files:

  • Lineage: LineageSearchSelect (Autocomplete, virtualizes >200 items, so the manual scroll paging and its constants are gone), NodeSuggestions, NodeChildren, AddPipeLineModal, PlatformLineage + EntitySuggestionOption (now plain option content; selection is handled by the combobox instead of a button nested in an option).
  • Search: GlobalSearchBar, SearchPreview, EntitySearchSettings, FieldConfiguration, GlobalSettingsItem (core Input has no min/max, so the value is clamped on save).
  • Users / roles / personas / bots: PersonaSelectableList, UserProfileRoles, RolesCard, BotDetails, AuthMechanism, TeamsHeadingLabel, AddAttributeModal, OnlineUsersPage, SampleDataTable, SchemaTable.
  • RJSF: legacy SelectWidget, PasswordWidget, LdapRoleMappingWidget, WorkflowArrayFieldTemplate, SsoConfigurationFormArrayFieldTemplate, SsoRolesSelectField.
  • Deleted: CustomUnitSelect (no importers) and antd-only LESS overrides.
  • Core fix: chips in Autocomplete, MultiSelect and TreeSelect no longer overflow narrow fields — the chip row can shrink and each chip is capped at the field width with an ellipsis.
  • Fix: NavBar Cmd+K now focuses the global search (its InputRef was never attached, so the shortcut did nothing).

Behaviour notes:

  • Single-select personas (default persona) use the same pattern as the AI-mode profile: remove the chip to pick another.
  • allowClear on single selects maps to a "None" / "All" item where clearing means something (constraint, entity-type filter, search index).
  • AlertsUtil, BotsUtils and ProfilerSettingsModal are form-bound: bots move with Part 2, alerts and profiler with refactor(ui): remove antd from classic-mode Observability #35190.

Part 2 — settings and admin forms

Where AI mode already had a core version of a form, the classic page now reuses it instead of keeping a second antd copy:

  • AccessControlRuleForm for add/edit rule (classic RuleForm deleted)
  • AI email-settings mappers in EmailConfigForm
  • FieldValueBoostDialog in classic search settings (classic FieldValueBoostModal deleted)
  • AccessControlDebuggerPanel in the classic permission debugger page
  • Shared CustomPropertyFormFields + payload utils (extracted from the AI add page) for the classic add-custom-property drawer/page
  • Shared useLearningResourceFields for the classic learning-resource drawer

Migrated in place:

  • Modals: ProfileEditModal, LineageConfigModal, TestEmail, ChangePasswordForm, ModalWithQueryEditor, ModalWithFunctionEditor
  • Settings pages: login/URL configuration, policies, roles, theme (AppearanceConfigSettingsPage), data asset rules
  • Users/teams/bots: CreateUser, AddTeamForm, AuthMechanismForm, team email + subscription, AddEditPersonaForm (its unreachable edit branch dropped)
  • AddQueryPage, AddKPIPage / EditKPIPage (shared KPIFormFields), LineageConfigPage, TableConstraintsModal (foreign-key field array; parsing in TableConstraintsModal.utils), TaskFormSettingsPage + TaskFormBuilderSection

Core:

  • inputDataTestId added to FieldPropsMap; PasswordInput forwards it.
  • HookForm defaults to react-aria validationBehavior="aria", so a native required no longer blocks submit before react-hook-form can show inline errors (covered by hook-form.test.tsx).

Playwright helpers move from antd class selectors to role-based locators for the touched forms; antd/positional suppression baselines shrink accordingly.

Part 3 — remaining form controls

  • TeamTypeSelect → core Select, core Check / XClose icons on its icon-only buttons (now with accessible names).

  • ColorPicker: hex text on core Input, swatch kept as a native colour input (core has no swatch control, and inside a core Input the swatch collapses to a thin stripe); reports a plain string and takes the field label so each theme colour has distinct accessible names. The core COLOR_PICKER field is a fixed palette, so it cannot replace this free-hex picker for theme colours. Its LESS file goes; the unused legacy COLOR_PICKER case in formUtils is dropped.

  • QueryUsedByOtherTable → core DataAssetAsyncSelectList (table index, multiple), reporting entity references; QueryCard no longer maps antd options to references.

  • Classic search settings reuse the AI-mode TermBoostCard in TermBoostList; the antd TermBoost copy, its LESS and the per-caller card width overrides are removed.

Follow-up after #35190 (adds the core NumberInput and moves the last AsyncSelect / legacy-field callers):

  • EntitySearchSettings: its two antd InputNumbers → core NumberInput
  • AsyncSelect removal once alerts no longer use it
  • remove the legacy getField / generateFormFields and the wrappers only it uses (SanitizedInput, FilterPattern, UserTeamSelectableListSearchInput, legacy FormItemLabel, FormUtils.interface), then freeze Form / Select / Input

Behaviour changes:

Standalone controls: see "Behaviour notes" in Part 1 above.

Forms:

  • Inline validation: errors show under each field on submit (react-hook-form) instead of antd's form-level validation.
  • KPI target: the slider loses its 0/100% marks; a percentage target above 100 is rejected inline (the antd InputNumber max used to clamp it).
  • Multi-selects (roles, policies, categories, contexts, …) have no clear-all button; chips are removed one at a time.
  • Task form settings: options are added one per Enter.
  • Table constraints: the related column is picked from a plain FQN list.
  • Learning resource drawer no longer closes on a mask click, so picking a select option cannot dismiss it.

Remaining controls:

  • Query "used by other tables" options show the entity type under the name instead of the table FQN (the shared core DataAssetAsyncSelectList layout). Picks now persist across re-renders of the query card.
  • Classic term boost cards use the AI-mode card at its fixed width instead of stretching to the panel.
  • Team type cancel / save are core xs icon buttons with accessible names.

Tests:

Use cases covered

  • Lineage: search a node/column and centre on it; add-edge search; edit-mode node suggestions; platform lineage entity search.
  • Global search index selector and search box; search settings match/boost/score modes; search preview.
  • Persona (multi + default) and role editing on the profile; bot display name / roles / token field.
  • SSO: LDAP role mapping, auth-reassign roles, URL/principal tag fields; RJSF select/password widgets.
  • Settings/admin forms: create user / bot (token expiry), add role / policy / rule conditions, team email / subscription / type, persona, custom properties, KPI add / edit (percentage cap), table constraints (PK / FK), task form builder, theme colours, learning resources, login / URL / lineage config, data asset rules, add query.
  • Query "used by other tables" picker; classic term boosts.

Unit tests

  • Rebased stack on current main: every changed test file — 33 suites / 520 tests pass; core vitest run — 77 files / 800 tests pass.
  • Per part, before combining: Part 1 jest --findRelatedTests 872 suites / 11,301 tests; Part 2 883 suites / 11,393 tests; Part 3 affected suites pass.
  • Regression tests added for review findings: query picker keeps picks across re-renders, ColorPicker accessible names, KPI percentage target above 100 rejected, HookForm aria validation default, bot form token-expiry field.

Backend integration tests

  • Not applicable (no backend API changes).

Ingestion integration tests

  • Not applicable (no ingestion changes).

Playwright (UI) tests

  • Updated for the core DOM: Users, UserDetails, PersonaFlow, SSOConfiguration, SearchSettings, CustomProperties, OnlineUsers, SampleDataTableOperations, PlatformLineage, Navbar, MetricSearch, ExploreQuickFilters + helpers navbar, entityPanel, lineage, customizeLandingPage.
  • selectSettingOption helper (search settings): expanding a panel smooth-scrolls it and react-aria closes a select popover whose trigger scrolls, so the open-and-pick retries until the value sticks.
  • Persona/SSO specs press Escape on the combobox before touching chips or Save: while the list is open react-aria hides the chips from the accessibility tree, and removing a chip refocuses the field and reopens the list.
  • Forms: helpers and specs for users / bots (token expiry), roles / policies, persona, custom properties, learning resources, query entity, search settings and table constraints move from antd class selectors to role-based locators.

CI full suite: Postgresql PR Playwright E2E Tests, run 38572427900 (manual dispatch on 1b79b4e4791, the merge with main after #35190) passed: all 42 jobs green, 3 skipped. It replaces the three failed merge-queue runs from 2026-10-13 (persona customization, Data Product / Glossary persona, Data Contracts, Description visibility, Lineage controls, Data Quality filters), which the later spec commits fixed. The only commit after it, d736686678e, refreshes seven visual-regression baselines and changes no code.

Local runs (chromium, local OSS backend on :8585, --workers=3):

Part 1 (commit f43c19b038e):
Local run against this branch's UI (Vite, PLAYWRIGHT_TEST_BASE_URL=http://localhost:3000) on a local OSS backend, commit f43c19b038e, --workers=3:

Specs Result
Flow/Navbar, Features/OnlineUsers, Features/SampleDataTableOperations 43 passed
Pages/Users, Pages/UserDetails, Flow/PersonaFlow (persona / role tests) 58 passed, 4 failed → fixed, re-run 14/14 passed
Features/SSOConfiguration, Pages/SearchSettings, Pages/SearchIndexApplication 56 passed, 4 failed → fixed; re-run: SearchSettings 15/15, SSO + SearchIndex edit passed
Lineage/PlatformLineage, Lineage/LineageFilters, Features/TableConstraint, Flow/GlobalSearch, Flow/MetricSearch, Flow/SchemaTable 31 passed
CustomProperties (search-settings tests), ExploreQuickFilters (metric), DomainWidgetFilter 9 passed, 1 unrelated failure (custom-property Edit menu)

Not yet run: Teams (team name), Bots, CustomizeLandingPage, a DataAssetLineage slice — the local Docker stack went down mid-run. SearchIndexApplication › Run application timed out waiting for the shared backend's reindex job (environmental).

Part 2 (this branch's forms):

Specs Result
Users (incl. token generation / expiry), Teams, Roles, Policies, Bots, PersonaFlow pass after fixing the token-expiry helpers; Teams › Export team passed on re-run (CSV export job was slow locally); PersonaFlow filter tests flaky
TableConstraint, QueryEntity, DataInsight, TaskFormSettings, CustomThemeConfig, LearningResources, LineageSettings pass (LearningResources fixed: drawer closed on option pick; LineageSettings flaky once)
DataInsightSettings (Data Insight project) 7 passed
CustomProperties not completed (run hit the local time limit)

Part 3: SearchSettings passes; QueryEntity timed out on a too-strict table-search wait, loosened in 0952b50f48a and not re-run.

Manual testing performed

Local stack, admin user, scripted with Playwright against main (:3002, antd) and this branch (:3000, core):

  1. Navbar search-index selector opens, marks the selection, filters Explore.
  2. Profile → Persona / Roles popovers: list opens with the popover, options add chips, chips remove, Save persists.
  3. Online users time window, search settings (global number inputs, preview search, match/score/boost modes).
  4. Table lineage search (nodes + columns) and platform lineage entity search navigate to the picked entity.
  5. Bot details: display name input, roles autocomplete, token field.
  6. SSO → LDAP: role mapping DN input + roles autocomplete, auth-reassign roles, tag fields (alice,bob + Enter → two chips).

Found and fixed during verification: the SSO form's capture-phase Enter guard only exempted antd tag selects, so core tag fields could not add values with Enter (createFormKeyDownHandler now exempts [role="combobox"]).

Parts 2 and 3: scripted Playwright captures of main and this branch side by side (light, classic mode) for every form below; the theme-colour swatch regression and the learning-resource drawer closing on option pick were found and fixed this way.

Manual test guide

Log in as admin on a local stack with sample data. For every form: required fields show an inline error under the field on Save; a valid submit saves and the change shows up after a reload.

Part 1 — standalone controls

# Batch Page Control Steps Expected Status
1 1 Any page, top nav Search index select Open the index dropdown next to the global search, pick Tables, search dim Selected index is marked; Explore opens filtered to tables. ⌘K / Ctrl+K focuses the search box ✅ Pass
2 1 /table/sample_data.ecommerce_db.shopify.dim_address/lineage Lineage search Type a node or column name in the lineage search, pick a result Graph centres on the picked node; lists over 200 items scroll smoothly ✅ Pass
3 1 Same lineage page, Edit mode Node suggestions / add edge Add a node via the suggestion search; open an edge's pipeline modal and search a pipeline Suggestions load as you type; picked pipeline is saved on the edge ✅ Pass — pipeline picked, edge not saved (keeps sample lineage)
4 1 /lineage (platform lineage) Entity search Search an entity and pick it Navigates to that entity's lineage ✅ Pass
5 1 /users/admin Personas, default persona, roles Edit personas: add two chips, remove one, Save. Default persona: remove the chip, pick another. Edit roles likewise Chips add / remove; Save persists after reload ✅ Pass
6 1 /settings/bots → open a bot Display name, roles, token Edit display name, add a long role name, regenerate the token with an expiry Long role chip ends in an ellipsis inside the card; values persist ✅ Pass
7 1 /settings/members/teams → a team Team name Edit the team name and save Name updates ✅ Pass
8 1 /settings/members/online-users Time window Change the time window Table refreshes for the window ✅ Pass
9 1 /settings/preferences/search-settings Global number inputs, preview Change a global setting, use the preview search Value saved (out-of-range values are clamped on save); preview returns results ✅ Pass
10 1 /settings/preferences/search-settings/tables Field match type, score mode, boost Change a matching field's match type and the score mode, Save Values persist after reload ✅ Pass
11 1 /settings/sso → LDAP Role mapping, auth-reassign roles, tag fields Add a DN → roles mapping; type alice,bob + Enter in a tag field Mapping saved; two chips alice, bob created (Enter does not submit the form) ✅ Pass — form filled, not saved (would change local auth)
12 1 A table → Sample Data / Schema Sample data row limit; column constraint select Change the sample-data row limit; on Schema, edit a column and set its constraint type Row count follows the limit; the column shows the constraint icon after save ✅ Pass

Part 2 — settings and admin forms

# Batch Page Control Steps Expected Status
13 2 /create-user Create user Save empty, then fill email, roles, teams, personas, toggle Admin, Create Inline errors first; user created with the picked roles / teams ✅ Pass
14 2 /create-user/bot Create bot Fill email, pick Token Expiration, toggle Allow Impersonation, Create Bot created; long impersonation hint wraps under the toggle ✅ Pass — found + fixed: toggle track squeezed by the long hint (e422669)
15 2 /settings/access/roles/add-role Add role Name, description, pick policies, Save Role created with the policies ✅ Pass
16 2 /settings/access/policies/add-policy Add policy + rule Add a rule with resources, operations and a condition typed free-hand (e.g. isOwner()), Save Rule saved with its condition (free text is kept) ✅ Pass
17 2 Policy page → Add Rule Add / edit rule Same as above on an existing policy; edit the rule after Edits persist ✅ Pass
18 2 /settings/access/permission-debugger Permission debugger Pick a user, resource and operation Evaluation result is shown ✅ Pass
19 2 /settings/members/teams → Add Team Add team Fill name, type, email, Save Team created ✅ Pass — Teams list takes ~80s to settle with 811 teams (per-row rich-text previews; pre-existing, not in this PR)
20 2 Team page Email, subscription Edit the team email; set a webhook subscription Values persist ✅ Pass
21 2 /settings/persona → Add Persona Add persona Name, description, users, Save Persona created ✅ Pass
22 3 /settings/customProperties/tables → Add Add custom property Try each type (enum, entity reference, date-time format, table) Type-specific fields appear; property created ✅ Pass
23 3 /settings/preferences/learning-resources → Add Resource Learning resource drawer Pick type, categories, contexts, status; fill URL, Save Picking options does not close the drawer; resource created ✅ Pass
24 3 /data-insights/kpi/add-kpi Add KPI Chart, Percentage metric, set 120, dates, description, Save "between 0 and 100" error for 120; saves with a valid value. Repeat Edit KPI on an existing KPI ✅ Pass
25 3 Table page → Schema → table constraints Table constraints modal Add a primary key; add a foreign key with a related column from another table Constraints saved and shown on the schema ✅ Pass — reverted after
26 3 /settings/governance/task-forms Task form settings Add a field, type options pressing Enter after each, Save One option per Enter; form saved ✅ Pass — category is not required client-side, server rejects with 400 (same on main)
27 3 /settings/preferences/appearance Theme Change logo URL and a theme colour (hex or swatch), Save; Reset Preview updates; Reset restores defaults ✅ Pass
28 3 /settings/preferences/loginConfiguration Login configuration Change max login attempts / block time, Save Values persist ✅ Pass — restored after
29 4 /settings/preferences/om-url-config OpenMetadata URL Edit the base URL, Save URL persists ✅ Pass — restored after
30 4 /settings/preferences/email Email config + test email Edit SMTP fields, Save; Send test email Settings persist; test-email modal validates the address ✅ Pass — test email validated, not sent; settings restored
31 4 /settings/preferences/lineageConfig Lineage config Change upstream / downstream depth and layer, Save Values persist ✅ Pass — restored after
32 4 /settings/preferences/dataAssetRules Data asset rules Add / edit a rule Rule saved ✅ Pass — add modal only shows with no rules (same on main); tested by clearing rules, then restored
33 4 Table → Queries → Add Add query SQL, description, Query used in tables, Save Query created ✅ Pass
34 4 /users/admin Profile edit / change password Edit display name; change password with a mismatched confirm, then a valid one Inline mismatch error; then saved ✅ Pass — display name on own profile (reverted); password via admin reset on a test user

Part 3 — remaining controls

# Batch Page Control Steps Expected Status
35 5 /settings/preferences/appearance Theme colour pickers Pick a colour from a swatch, then type a hex in the box next to it Swatch and hex stay in sync; screen reader names are "Select Primary Color" / "Primary Color" ✅ Pass
36 5 Team page (non-organization team) Team type Click the edit icon by Type, pick another type, ✓ Type updates; ✗ cancels. Group is not offered where it is not allowed ✅ Pass
37 5 Table → Queries → ⋮ → Edit Query used by other tables Remove a table chip, add two tables, Save Both picks stay in the field while editing; saved list matches ✅ Pass
38 5 /settings/preferences/search-settings/tables → Term Boost → Add Term boost Pick a tag, drag the boost slider, Save; delete a boost Boost saved; delete removes it ✅ Pass — added, saved, then deleted

UI screen recording:

Part 1 — standalone controls

Before / after screenshots (left: main with antd, right: this PR). Core components are used as designed, so their default styling differs from the old antd look.

Navbar search index
navbar

Profile roles
roles

Online users time window
online-users

Search settings match type
match-type

Platform lineage search
platform-lineage

Bot roles + token — a long role chip used to overflow the narrow card; fixed in core (d85ca71a6d7): Autocomplete, MultiSelect and TreeSelect chips are now capped at the field width and end in an ellipsis, for every usage (screenshot: "Auto Classif…").
bot-roles

SSO LDAP role mapping
sso-ldap-mapping

SSO tag field (alice,bob + Enter)
sso-tags

Table lineage search (this PR)
table-lineage

Team name edit (this PR)
team-name

Part 2 — settings and admin forms (light, classic mode — before = main, after = this branch)

Form Before (main) After
Create user create-user-before create-user-after
Create bot create-bot-before create-bot-after
Add role add-role-before add-role-after
Add policy add-policy-before add-policy-after
Add custom property add-custom-property-before add-custom-property-after
Add KPI add-kpi-before add-kpi-after
Learning resource drawer learning-resource-before learning-resource-after

Part 3 — remaining controls (light, classic mode — before = main, after = this branch)

Control Before (main) After
Theme colours (ColorPicker) appearance-colors-before appearance-colors-after
Team type select team-type-select-before team-type-select-after
Query used by other tables query-used-in-before query-used-in-after
Classic term boost term-boost-before term-boost-after

Checklist:

  • I have read the CONTRIBUTING document.
  • My PR is linked to GitHub issues above.
  • I have commented on my code, particularly in hard-to-understand areas.
  • I have added tests that prove my fix is effective or that my feature works.
  • UI checkstyle (src + Playwright) clean; yarn test:eslint-rules and generate-playwright-rule-table.mjs --check pass; ESLint suppressions pruned against current main (antd 509 → 346, positional locators 578 → 572).

@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 12, 2026
@shah-harshit shah-harshit self-assigned this Oct 12, 2026
Base automatically changed from shah-harshit/antd-modal-to-core to main October 13, 2026 02:59
@shah-harshit
shah-harshit force-pushed the shah-harshit/antd-select-input-standalone branch from b9c9ea4 to 5ac272f Compare October 13, 2026 03:11
@shah-harshit shah-harshit changed the title Part of open-metadata/openmetadata-collate#6893, #6894: Migrate standalone antd Select and Input to core components Migrate standalone antd Select and Input to core components Oct 13, 2026
@shah-harshit
shah-harshit marked this pull request as ready for review October 13, 2026 03:12
@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: 923 → 922
- 0 added, 1 removed, 7 changed spec-list

Removed source→spec entries:
  openmetadata-ui/src/main/resources/ui/src/components/SearchSettings/GlobalSettingsItem/GlobalSettingsItem.tsx

Entries whose spec list changed:
  openmetadata-ui/src/main/resources/ui/src/components/GlobalSearchBar/GlobalSearchBar.tsx
  openmetadata-ui/src/main/resources/ui/src/components/SearchSettings/SearchPreview/SearchPreview.tsx
  openmetadata-ui/src/main/resources/ui/src/components/Settings/CustomProperty/CustomPropertyEditForm/CustomPropertyEditForm.tsx
  openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/CreateUser/CreateUser.component.tsx
  openmetadata-ui/src/main/resources/ui/src/pages/KPIPage/AddKPIPage.tsx
  openmetadata-ui/src/main/resources/ui/src/pages/KPIPage/EditKPIPage.tsx
  openmetadata-ui/src/main/resources/ui/src/pages/RolesPage/AddAttributeModal/AddAttributeModal.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

@github-actions

github-actions Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Jest test Coverage

UI tests summary

Lines Statements Branches Functions
Coverage: 77%
77.57% (125075/161221) 64.18% (78771/122722) 65.37% (26291/40218)

@shah-harshit
shah-harshit added this pull request to the merge queue Oct 13, 2026
@shah-harshit
shah-harshit removed this pull request from the merge queue due to a manual request Oct 13, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🚦 Removed from the merge queue — manual (2026-10-13T04:29:19Z)

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

@shah-harshit
shah-harshit added this pull request to the merge queue Oct 13, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 13, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🚦 Removed from the merge queue — merge_conflict (2026-10-13T05:42:42Z)

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

@shah-harshit
shah-harshit force-pushed the shah-harshit/antd-select-input-standalone branch from fb64f1b to 96ef64a Compare October 13, 2026 05:54
@shah-harshit
shah-harshit added this pull request to the merge queue Oct 13, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 13, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🚦 Removed from the merge queue — merge_conflict (2026-10-13T07:02:49Z)

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

@shah-harshit
shah-harshit added this pull request to the merge queue Oct 13, 2026
shah-harshit and others added 17 commits October 13, 2026 20:26
Percentage KPI targets are validated to 0-100 again, as the antd InputNumber max
did. Two decision records capture rules the PR description stated only in prose:
classic forms reuse the AI-mode core form when one exists, and inside HookForm
react-hook-form rules are the only validation that blocks submit.
TeamTypeSelect uses the core Select and core icons. ColorPicker keeps its
free-hex swatch + text pair on core Input and reports a plain string; the
core COLOR_PICKER field is a fixed palette, so it cannot replace it for theme
colours.
QueryUsedByOtherTable picks tables with the core DataAssetAsyncSelectList
and reports entity references, so QueryCard no longer maps antd options.
The classic search settings reuse the AI-mode TermBoostCard instead of the
antd TermBoost copy.
The query table picker is controlled, so it now follows the user's picks
instead of being reset to the saved tables on every parent re-render.
ColorPicker takes the field label, so the hex box and the swatch of each
theme colour get their own accessible names.
Callers keep the modal mounted and only toggle visibility, so the form now
resets from the current config on open instead of keeping the first-render
values or a cancelled edit.
- SelectWidget keeps saved values that are no longer in the enum, visible
  and untouched, instead of hiding them or rewriting them to undefined.
- GlobalSettingItem treats a cleared number as a cancelled edit.
- Core Plus / Trash01 icons replace antd icons with inline styles in the
  persona, user, team and table constraint forms.
- KPI, custom property, persona, node suggestion and query picker layout uses
  core Grid gaps, Box and Typography instead of layout shims and raw divs.
- Name rules share one limit, regex and message set across both rule shapes.
- Persona popover cancel / save accessible names were swapped.
The UI Checkstyle workflow fails when yarn i18n changes the locale files or
core-components' check-i18n-all fails, but the local target ran neither, so
the failure only showed up in CI. The target now runs both; unlike CI it keeps
the synced files so the new placeholders can be translated and committed.
…anged"

Not part of this PR: the I18n Sync failure was on the Collate PR, not here.
- LineageSettings picks the pipeline view mode from the core Select instead of
  the antd option title.
- The custom property helper only presses Escape while the enum / table /
  entity-reference list is open: the add form is a dismissable drawer, so an
  Escape with no open list closed it and detached the description editor.
The toggle root became a w-max flex row so long hints wrap, which let the
track shrink: Allow Impersonation on Create Bot rendered a 20px track with
only the knob visible. The track no longer shrinks.
@github-actions

Copy link
Copy Markdown
Contributor

🚦 Removed from the merge queue — manual (2026-10-14T01:13:23Z)

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

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

Copy link
Copy Markdown
Contributor

🚦 Removed from the merge queue — manual (2026-10-14T05:52:39Z)

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

# 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/src/components/Settings/Users/AdminPermissionDebugger/AdminPermissionDebugger.component.tsx
#	openmetadata-ui/src/main/resources/ui/src/components/Settings/Users/AdminPermissionDebugger/AdminPermissionDebugger.style.less
#	openmetadata-ui/src/main/resources/ui/src/pages/TableDetailsPageV1/TableConstraints/TableConstraintsModal/TableConstraintsModal.component.tsx
#	openmetadata-ui/src/main/resources/ui/src/pages/TaskFormSettingsPage/TaskFormSettingsPage.tsx
#	openmetadata-ui/src/main/resources/ui/src/pages/TaskFormSettingsPage/components/TaskFormBuilderSection.tsx
The antd Select had allowClear; the core Select that replaced it ignores
null keys and has no empty item, so once a category was set it was saved
again on every edit. Add a None item that maps to an unset category,
following the NO_CONSTRAINT_KEY convention in SchemaTable.
…ect-input-standalone

Conflicts with #35190 (classic-mode Observability off antd):
- autocomplete.tsx: keep this branch's ellipsis comment and main's
  remove-button label.
- DataQuality.spec.ts: take main's listbox locator; #35190 moved the
  test-type filter to core and this branch does not touch it.
- eslint-suppressions.json: pruned against the merged tree; antd pin set
  to the real total (246) and the positional-locator pin to 568.
@github-actions

Copy link
Copy Markdown
Contributor

🚦 Removed from the merge queue — manual (2026-10-14T13:47:49Z)

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

The merge of main (#35190 and earlier main changes) moved seven pages off
their stored baselines; main's own merge-queue runs fail the same pages.
Take the CI screenshots from run 38571094796 as the new baselines:
ai-explore, metric-list-narrow, glossary, landing-page,
landing-page-sidebar-collapsed, settings and users.
@gitar-bot

gitar-bot Bot commented Oct 14, 2026

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

🔴 High risk · Migrating role and policy rule editors could submit changed authorization conditions, potentially granting users access to resources they should not reach.

Migrates antd Form, Select and Input across lineage, search, settings, admin and RJSF forms to core ui-core-components, with inline validation and role-based test locators. Lineage config modal no longer keeps stale or cancelled values, which was resolved in this session. No open issues remain.

✅ 3 closed
✅ Bug: Lineage config modal keeps stale or cancelled values

📄 openmetadata-ui/src/main/resources/ui/src/components/Entity/EntityLineage/LineageConfigModal.tsx:41-47 📄 openmetadata-ui/src/main/resources/ui/src/components/Entity/EntityLineage/LineageConfigModal.tsx:108
useForm lives in LineageConfigModal, and CustomControls and PlatformLineage keep that component mounted the whole time. They only toggle visible. defaultValues is read once on the first render, and nothing calls form.reset afterwards. That causes two problems. First, lineageConfig is filled in later by setLineageConfig (AppContainer / Lineage.tsx), so the modal can open showing the initial store values instead of the loaded config. Second, onCancel doesn't reset the form, so values a user typed and then cancelled show up again the next time the modal opens. Before this change, the antd Form sat inside the modal and re-read initialValues each time it mounted. The fix is to reset the form from config whenever the modal opens or config changes.

Closed: Bug: Platform lineage search loses the current entity FQN on blur

📄 openmetadata-ui/src/main/resources/ui/src/pages/PlatformLineage/PlatformLineage.tsx:91 📄 openmetadata-ui/src/main/resources/ui/src/pages/PlatformLineage/PlatformLineage.tsx:210-216 📄 openmetadata-ui/src/main/resources/ui/src/pages/PlatformLineage/PlatformLineage.tsx:286-300 📄 openmetadata-ui/src/main/resources/ui/src/components/Entity/EntityLineage/NodeSuggestions.component.tsx:200-208
In PlatformLineage.tsx the ComboBox is controlled with selectedKey={null} and inputValue={searchText}, and searchText starts out as the current entity's FQN. It does not set allowsCustomValue. When a react-aria ComboBox like this loses focus, it resets the input to the selected item's text. With no selected item that text is '', so handleSearchInputChange('') runs. That clears searchText, so the header stops showing the current entity, and it also fires an extra empty search. The old antd value={defaultValue} kept the FQN visible. A fix is to add allowsCustomValue so typed or preset text is kept on blur, or to put searchText back to defaultValue when the dropdown closes. NodeSuggestions uses the same controlled selectedKey={null} + inputValue pattern and will also re-run an empty search on blur.

Closed: Bug: Task Category can no longer be cleared once set

📄 openmetadata-ui/src/main/resources/ui/src/pages/TaskFormSettingsPage/TaskFormSettingsPage.tsx:347-350 📄 openmetadata-ui/src/main/resources/ui/src/pages/TaskFormSettingsPage/TaskFormSettingsPage.tsx:1174-1188
The antd Select for Task Category had allowClear, so an admin could unset the optional category. The core Select that replaces it drops null keys in onSelectionChange (key !== null && field.onChange(...)) and has no empty item. After a category is picked, or comes in from a loaded schema or template, there is no way to set it back to undefined. Because handleSave spreads ...values into the payload, the old category is always saved again. The PR's own convention for this case is a "None" item that maps to undefined, and this field needs one.

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 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.

3 participants