Skip to content

Migrate display, navigation, selection and numeric components to core - #35253

Merged
shah-harshit merged 56 commits into
mainfrom
shah-harshit/7300-antd-display-components
Oct 15, 2026
Merged

shah-harshit merged 56 commits into
mainfrom
shah-harshit/7300-antd-display-components

Conversation

@shah-harshit

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

Copy link
Copy Markdown
Contributor

Describe your changes:

Fixes open-metadata/openmetadata-collate#7300
Fixes open-metadata/openmetadata-collate#7301
Fixes open-metadata/openmetadata-collate#7302
Fixes open-metadata/openmetadata-collate#7303
Part of open-metadata/openmetadata-collate#6884.

Combines the former stacked pair (#35253 display/navigation + #35262 selection/numeric forms, now closed) into one PR.

Display, containers and navigation. Replace the remaining Ant Design display components, containers, navigation menus and trees with core components, including standalone selection indicators that share these screens. The overlapping sidebar, search settings, application logs and entity panel changes are grouped to avoid competing edits.

Selection, upload, numeric, autocomplete and time controls. Migrate them to core components (TreeSelect, Checkbox, Radio, Slider, AutoComplete, TimePicker, Upload). Remove the unused legacy ParameterForm and its test. The parent profiler, KPI, policy, lineage, login, user-creation and alert forms now come from main (see below).

Affix, Empty, Image, Result and Spin were migrated by #35339, now on main; this PR doesn't touch them.

Already migrated on main. The merge with main keeps main's versions where another PR already moved a file to core, and drops this branch's copy: the Data Contract SLA form and view switch (#35217), Add Assets selection and TableDataCardV2 (#35242), and the Applications log viewer and ReindexFailures (#35179). The SLA serializer helpers (ContractSLAFormTab.utils) and AppLogsViewer.utils went with them; the numeric ADR now points at ContractSLAFormTab.test.tsx, whose form keeps the same HH:mm and cleared-value contract. Elsewhere this branch keeps its migration and adopts main's core Button changes.

Merged with #35280 / #35190 / #35339 (latest main merge, 9aefa72f5ee). Those PRs moved many of the same forms to core and React Hook Form on their own, so where main's version is already antd-free this PR takes it whole, specs included: profiler settings slideout and CustomRangeWidget / SliderWithInput, QualityTab, lineage config modal and page, login configuration, KPI add/edit, add policy / add rule / edit rule (the shared RuleForm is gone), profiler configuration page, create user, admin permission debugger, alert recent events and AlertsUtil. The core NumberInput is now main's react-aria NumberField version, so this branch's nullable/decimal NumberInput, its ADR and the KPI date utils were dropped. Where main still used antd for a component this PR migrates (search settings Collapse / Slider / InputNumber, Tree, Collapse in user permissions, Drawer in the learning-resource form, Checkbox, Alert, Table), this PR's core version is kept on top of main's form changes; search settings use main's FieldValueBoostDialog and TermBoostList.

Type of change:

  • Improvement

High-level design:

Use core components directly. Existing domain components retain pagination state, gallery autoplay, record-count formatting, routing and table behavior. Modal drawers use SlideoutMenu; the permanently embedded query panel stays inline. Accordion header actions remain separate from toggle buttons, and collapsed SSO fields stay mounted so validation continues to see them. Core progress components expose chart/status colors, and slideout headers expose accessible title and close-control options.

TreeSelect adds visible-chip limits, parent display condensation, loading and focus callbacks. Tree utilities preserve schema values and expand synthetic All selections; SLA serialization retains wall-clock HH:mm and distinguishes zero from a cleared duration. Nested forms receive their form instance explicitly. Profiler field arrays retain stable row IDs and unwrap partition rows to the API's string arrays. KPI date normalization clears an incompatible loaded end date instead of restoring it.

Migrated components adopt core styling (ADR:2026-10-11-migrated-antd-components-adopt-core-styling), including file drop zones and view-switch buttons.

Twenty-two components reach zero root, subpath and type imports and are frozen in ESLint: Alert, Avatar, Badge, Carousel, Collapse, Drawer, Layout, List, Menu, Pagination, Progress, Steps, Tree, Table, AutoComplete, Checkbox, InputNumber, Radio, Slider, TimePicker, TreeSelect and Upload. After the latest main merge, the pinned antd suppression count is 148.

The independent Modal/Button migrations remain separate. Provider/package removal in open-metadata/openmetadata-collate#7304 must wait for the remaining Modal, Button, Input, Select and Form consumers.

DateRangePicker now passes the clicked preset's key to onApply and exports getDateRangePresets, so a caller can store the preset rather than its frozen bounds and re-derive the range from the key (open-metadata/openmetadata-collate#7457, Part of open-metadata/openmetadata-collate#7439). Presets are built from today on each mount instead of at module load. date-range-picker.test.tsx covers the key on Apply and its reset on Cancel.

Visual follow-ups also restore the name-column row header in learning resources, constrain KPI numeric fields so their sliders remain visible, and keep async permission-search options open while loading.

Tests:

Use cases covered

  • Pagination totals and controlled/uncontrolled page changes.
  • Gallery autoplay, pause, focus/hover handoff, and changing screenshot lists.
  • Failure-alert dismissal and reappearance; bounded and missing application-log counters.
  • Empty summary progress, status colors, drawer naming, and retained accordion form values.
  • Navigation hierarchy moves, including invalid self/descendant drops.
  • Decimal stepping, bounds, clearing, and duplicate numeric notifications.
  • Tree selection payloads, synthetic All, visible-chip limits, selectable team branches, and clearing.
  • SLA wall-clock round trips, zero durations, and omitted cleared/invalid values.
  • Profiler sampling and partitioning round trips, SQL-only edits, minimum values, and legacy stored zero samples.
  • KPI date normalization and invalid date-range clearing.
  • Existing display, container, sidebar, selection, application-history, user creation, policy, upload, lineage, search settings, and data-contract behavior.

Unit tests

  • Full UI Jest suite on the combined branch, rebased on main cc33564c31b: 1,924 suites / 22,212 tests; the one failing suite (EntityImport, upload input moved to core) is fixed and passes 45/45.
  • After merging main (eff55f09ca2): full src + Playwright ESLint 0 errors; test:eslint-rules 191/191; changed-file checkstyle clean; Jest on tests related to every merged file: 1,593/1,601 suites pass. The 8 failures (7 Data Contract suites and ApplicationsClassBase) come from a local core-components build that predates main's new Card colors and app icons; they don't exercise this branch's code. tsc shows no new errors in PR files.
  • After handing Affix/Empty/Image/Result/Spin to Fixes 7300: migrate antd Affix, Image, Result, Empty and Spin to core UI #35339: the 19 suites covering the 11 affected files pass (104 tests); full src ESLint has 0 errors; test:eslint-rules 191/191 pass.
  • Migrated-component tests rewritten to assert core behavior: ContractViewSwitchTab (ButtonGroup selection), CustomRangeWidget / ProfilerSettings (NumberInput suffix, native range min), EntityImport (core file input).
  • Core tree/numeric tests: 5 suites, 51 passed, 0 failed. Core library build passes.
  • Changed-file ESLint/Prettier/import organization, Playwright lint, and the production vite build pass. Full-app tsc reports only pre-existing diagnostics (stale generated types and the existing onPress-on-ButtonUtility pattern), none new in the migration code.
  • After the visual-regression fixes (ac143176e6c): Jest on the touched areas passes 20 suites / 97 tests plus TeamsSelectable/UserProfile/SearchSettings (7 suites, 34 tests). With a core-components build from this branch, the Data Contract and ApplicationsClassBase suites pass 22/22 (429 tests). UI checkstyle on changed files: 0 errors; core lint, i18n sync and bundle budget pass.
  • Scoped application coverage: 70.54% lines (2,053/2,910), 69.32% statements (tracked changed production modules, not whole-app).

Backend integration tests

Not applicable: no backend or API changes.

Ingestion integration tests

Not applicable: no ingestion changes.

Playwright (UI) tests

Not run locally: Playwright runs on CI for this PR, at the author's request. The playwright-visual-regression baselines that include the classic sidebar (landing page, landing page with collapsed sidebar, glossary, applications, metric list desktop/narrow) are refreshed from CI's own run on 3c7ba3bebf9 (a9a21d894d1). The only change is this PR's core sidebar styling; every diff was reviewed.

Manual testing performed

Setup. Local backend (Collate 2.0 server on :8585 with sample data), admin user. main (77bcbfa8eee) on :3002 and this branch on :3000, each with its own core-components build. Pages were driven with a scripted browser (not the Playwright e2e suite) and captured at 1440×900.

Modes. AI mode is checked in light and dark; classic mode in light only. Classic-shell scenarios (left sidebar, top navbar, notifications, user menu) apply to classic mode only, since AI mode has its own shell.

Visual regression. 61 page/component states compared side by side with main: 61 in classic light, 56 in AI light and 56 in AI dark, 173 pairs in total. Every pair was reviewed. Findings:

Finding (this branch vs main) Mode Cause Fix
Header lost its height and padding; content moved up 40px Classic antd Layout.Header (80px, 20px 24px, gray-blue bg) became a plain <header> Header box restored from the same LESS variables (c04d9b05b22)
Sidebar links and groups had different row heights, icon sizes and indents; long group labels wrapped Classic Links used NavItemBase sm; groups used a hand-made AccordionHeader Groups use core's collapsible NavItemBase and links its collapsible child, all at the default size (c04d9b05b22)
New-version alert rendered inline instead of floating Classic Its fixed-position LESS was deleted with the antd styles Placement only (fixed, bottom-centre) restored (c04d9b05b22)
Forms lost the vertical gap between fields (KPI add/edit, lineage settings, add policy, add/edit rule, profiler settings slideout) All antd Form.Item margin gone; core HookForm adds no spacing by design HookForm laid out with tw:flex tw:flex-col tw:gap-4, the convention main's core forms use (ac143176e6c)
Profile Teams edit showed "No data found" All Core TreeSelect fetches once on open; the picker opened before the teams request returned and cached an empty tree fetchData awaits the shared teams request; same for the Create-user teams picker (ac143176e6c)
Teams tree opened ~120px below its input Classic UserProfileTeams grew its popover by the tree list's height (leftover from antd's inline dropdown) Fixed popover height; the tree is its own overlay (ac143176e6c)
Learning-resource table header showed through the slideout All Slideout overlay had no z-index; the sticky table header is z-10 Slideout overlay gets tw:z-50, matching the core Modal overlay (ac143176e6c)
Term/field-value boost Save/Add hugged the title instead of the row end All flex-1 lands on the header button inside its heading Action group pushed to the end with tw:ms-auto (ac143176e6c)
Profiler sample input showed 10( % (3-digit value clipped) All Input, suffix and clear button shared a 128px legacy column Core Box row with a 160px input column; the slider column stays full width (3c7ba3bebf9, a9a21d894d1)
Rule form Resources / Operations lost their placeholders All placeholder dropped in the TreeSelect migration "Select Resources / Select Operations" restored (3c7ba3bebf9)
Current item nearly invisible in the collapsed sidebar rail Classic Core NavItemButton used a faint neutral active state Core NavItemButton uses the same current-page brand treatment as NavItemBase (3c7ba3bebf9)

Accepted core styling (per ADR:2026-10-11-migrated-antd-components-adopt-core-styling, no caller overrides):

  • Accordions keep the core frame: search settings, entity search fields, user permissions, summary lists, SSO groups, app install.
  • The collapsed sidebar uses core NavItemButton (40px buttons; current item in brand tint rather than antd's solid blue tile).
  • Core table sm row height (API endpoint schema, data asset rules).
  • ButtonGroup view switches, slider thumbs and the core accordion chevron (down when collapsed).
  • Tree item icon colour in persona navigation.

Seen on main too, so not from this PR: white ranking-detail cards on the entity search settings page in dark mode; the disabled core Select looks light in dark mode.

On these pages main shows antd's static light surfaces in dark mode, and this branch fixes them: data asset rules and API schema table headers, the data insights menu selection, app install step labels.

Manual test guide. 40 numbered checks, run on this branch at 3c7ba3bebf9 (all 40 re-run after the review fixes); #9 and #39 re-checked on a9a21d894d1 after the slider width fix. Nothing saved permanently: lineage settings were set and restored, the other forms were filled and cancelled.

# Mode Page Control Steps Expected Status
1 Classic · light /my-data Left sidebar (expanded) group + link Click Observability, then Data Quality Group opens with its links in line with top-level items; Data Quality page opens and its link is marked current ✅ Pass
2 Classic · light /my-data Left sidebar (collapsed) hover menu Collapse the sidebar, hover Govern, click Glossary; expand the sidebar again Icon-only rail; hover menu lists Govern links; Glossary opens; sidebar expands back ✅ Pass
3 Classic · light Any page, navbar Notification box (tabs, list, dot) Click the bell, switch Tasks → Mentions, then View all Dot shows on the bell when there are unread items; list renders per tab; View all opens the activity feed ✅ Pass — tabs switch
4 Classic · light Any page, navbar User menu (persona/roles, User Interface switch) Open the avatar menu Profile, persona, roles and Classic/AI options render; current mode is checked ✅ Pass — menu open
5 Classic · light Any page New-version alert (Alert) Make /api/v1/system/version return a newer revision than the UI build, reload Brand alert floats bottom-centre over the page with a Refresh action ✅ Pass — alert at y=796 of 900, x-centre 720
6 Classic · light /explore → dim_address Summary panel schema (SummaryList accordion) Search dim_address, open Schema in the summary panel Columns list renders; nested columns expand ✅ Pass — columns listed
7 Classic · light /explore/api_endpoint → addPet API endpoint Request/Response switch (Radio → ButtonGroup) Open Schema, switch Request → Response Schema fields swap; selected segment is highlighted ✅ Pass — switched
8 Classic · light /table/sample_data.ecommerce_db.shopify.dim_address/schema Column detail panel (Drawer → SlideoutMenu) Click a column name, use the next arrow, close Slideout opens over the page, pages to the next column, closes with ✕ ✅ Pass — paged 1→2
9 Classic · light /table/sample_data.ecommerce_db.shopify.dim_address/profiler/table-profile Profiler settings slideout (NumberInput, Slider, TreeSelect) Open settings, type 50 in the sample %, open Include columns, Cancel Fields are spaced; slider follows the input; column picker opens; Cancel closes without saving ✅ Pass — sample=50
10 Classic · light /table/sample_data.ecommerce_db.shopify.dim_address/lineage Lineage config modal (NumberInput) Open lineage settings, clear Upstream depth and press OK; enter 3, OK Empty value shows a required error; 3 is accepted and the modal closes ✅ Pass — error then saved
11 Classic · light /topic/sample_kafka.customer_events/sample_data Message cards (Collapse → Accordion) Expand the first message, collapse it JSON editor shows the message; header switches to the Value badge and back ✅ Pass — expand/collapse
12 Classic · light /pipeline/sample_airflow.dim_address_etl/executions Executions tree view (Tree) Switch List → Tree Task tree renders expanded with status icons per run; empty range shows the no-runs placeholder ✅ Pass — tree shown
13 Classic · light /databaseSchema/sample_data.ecommerce_db.shopify Schema profiler settings (CustomRangeWidget) ⋮ → Profiler Settings, change the sample % in the input Slider and input stay in sync; Cancel closes ✅ Pass — value=40
14 Classic · light /data-insights/data-assets Data insights menu + progress (Menu, Progress) Click KPIs in the left panel KPI page opens; KPI latest result shows a progress bar with target ✅ Pass
15 Classic · light /data-insights/kpi/add-kpi Add KPI (NumberInput + Slider, spacing) Pick a Percentage chart, type 120 in Metric Value, blur Fields are evenly spaced; value is clamped/rejected above 100; Cancel discards ✅ Pass — value=100
16 Classic · light /settings/preferences/search-settings Term / field-value boosts (Accordion, Slider) Expand Term Boost, click Add; expand Field Value Boost → Add, drag Impact, Cancel Save/Add sit at the right of the header; new boost card appears; modal slider updates Impact; Cancel closes; reload discards ✅ Pass — impact=0.2
17 Classic · light /settings/preferences/search-settings/tables Entity search field config (Accordion, Toggle, Slider) Expand Matching Fields → a field, toggle Highlight, move Weight Field panel opens with core frame; toggle and weight update; delete icon sits top-right ✅ Pass — toggled + weight
18 Classic · light /settings/preferences/profiler-configuration Profiler configuration (Accordion, TreeSelect, Toggle) Add New Field, pick a data type and metrics, toggle Disable, remove the row Row added with spaced controls; metric tree opens; row removed; Cancel leaves config unchanged ✅ Pass — row added/removed
19 Classic · light /settings/preferences/lineageConfig Lineage settings (NumberInput, spacing) Change Upstream Depth 2 → 3, Save, reload; restore 2 Fields spaced; value persists after reload; restored ✅ Pass — 2→3→2
20 Classic · light /settings/preferences/loginConfiguration Login configuration (NumberInput) Edit, change Max login fail attempts, Cancel Number fields editable; Cancel restores the read view ✅ Pass — edit/cancel
21 Classic · light /settings/preferences/learning-resources Learning resource drawer (SlideoutMenu) + table pagination Add Resource, pick a Type option, Cancel; go to page 2 of the list Drawer overlays the table (header no longer bleeds through); picking an option keeps it open; pagination moves to page 2 ✅ Pass — overlay above header; page 2
22 Classic · light /settings/governance/task-forms Task form builder (Alert, Checkbox, Empty) Open a schema, toggle Required on a field Brand alert explains the builder; checkbox toggles ✅ Pass — checkbox toggled
23 Classic · light /settings/access/permission-debugger Permission debugger (ComboBox search) Type admin in Search User, pick the user Async results stay open while loading; picking a user shows the evaluation panel ✅ Pass — user picked
24 Classic · light /settings/access/policies/add-policy Add policy + rule (TreeSelect, ComboBox, spacing) Fill name, open Resources and pick All, open Operations; type isOwner in Condition; Cancel Fields spaced; trees open; condition is validated ✅ Pass — filled, not saved
25 Classic · light /settings/access/policies/DataConsumerPolicy/edit-rule/DataConsumerPolicy-EditRule Edit rule (prefilled RuleForm) Open the rule Name, resources (All), operations chips and effect prefilled; spacing consistent ✅ Pass — prefilled
26 Classic · light /create-user Create user Teams (TeamsSelectable TreeSelect) Open Teams straight after load, pick a team Team tree lists teams (no empty state); chip added ✅ Pass — team picked
27 Classic · light /users/admin Profile Teams edit (TeamsSelectableNew) Click the Teams edit icon Popover opens with the team tree (fixed: was "No data found"); ✕ closes ✅ Pass — tree listed
28 Classic · light /users/admin/permissions User permissions (Accordion, Spin) Expand a policy under Direct Roles Rules list opens; the toggle is announced as " Details" ✅ Pass — toggle "Application Bot Policy Details"
29 Classic · light /settings/members/users Pagination (PaginationComponent) Next page, change page size Page 2 loads; page size changes the row count ✅ Pass — page 2
30 Classic · light /customize-page/mt-persona-a/navigation Customize navigation (Tree) Collapse/expand Observability, toggle an item, Reset Tree expands/collapses; toggle flips; Reset restores; nothing saved ✅ Pass — toggle + reset
31 Classic · light /settings/sso → SAML SSO grouped fields (Accordion) + metadata upload Pick SAML, Configure; expand a grouped section Grouped fields expand; collapsed fields stay mounted for validation; SAML metadata drop zone renders ✅ Pass — form shown (not saved)
32 Classic · light /observability/alert/vv-observability-alert/recentEvents Alert recent events (Table, Accordion) Open Recent Events, expand an event Events table renders; failed events expand to their details ✅ Pass — events listed, row expanded
33 Classic · light /marketplace/apps/CacheWarmupApplication/install App install stepper + verify card (Steps, Avatar, Accordion) Expand All Metadata, Cancel Progress steps render; permissions accordion expands ✅ Pass — expanded
34 Classic · light /bulk/import/table/sample_data.ecommerce_db.shopify.dim_address CSV upload drop zone (Upload → FileUpload) Upload a CSV via click to browse File is accepted and the import moves to Preview/Validate ✅ Pass — file accepted (not imported)
35 Classic · light /service/databaseServices/sample_data/add-ingestion/metadata Ingestion form (ObjectFieldTemplate, FilterPattern) Expand an advanced/grouped section Sections expand/collapse; field values retained ✅ Pass — form renders
36 Classic · light /table/sample_data.ecommerce_db.shopify.dim_address/schema Activity thread panel (Drawer → SlideoutMenu) Click the description conversation icon, close Thread slideout opens with title and close control ✅ Pass — opened/closed
37 AI · light /settings/preferences/search-settings AI mode, light: search settings Repeat #16 in AI mode Same behaviour inside the AI shell ✅ Pass — ok
38 AI · dark /settings/preferences/learning-resources AI mode, dark: slideout over table Repeat #21 in dark mode Drawer readable in dark; header does not bleed through ✅ Pass — ok
39 AI · dark /table/sample_data.ecommerce_db.shopify.dim_address/profiler/table-profile AI mode, dark: profiler settings slideout Repeat #9 in dark mode Readable, spaced fields in dark ✅ Pass — ok
40 AI · dark /users/admin AI mode, dark: profile teams edit Repeat #27 in dark mode Team tree lists teams ✅ Pass — ok

Screenshots. Left: main, right: this PR. Full-size images with an HTML index are in the archives: Classic · light (part 1) + part 2 · AI · light · AI · dark.

Classic mode · light — 61 states

1. Home: left sidebar (expanded), navbar, version alert · 2. Left sidebar collapsed + hover menu · 3. Left sidebar group expanded (Govern)

classic-light-00

4. Navbar notification box (List, Badge, Tabs) · 5. Navbar user profile menu (persona radio) · 6. Settings landing (SettingItemCard badges)

classic-light-01

7. Settings → Preferences (SettingItemCard) · 8. Explore summary panel: table columns (SummaryList accordion) · 9. Explore summary panel: API endpoint (schema toggle + SummaryList)

classic-light-02

10. Table schema: tabs labels, column filter · 11. Table schema: column filter dropdown (ColumnFilter Menu → Dropdown) · 12. Table schema: column detail panel (Drawer → SlideoutMenu)

classic-light-03

13. Table queries: right panel · 14. Table profiler settings slideout (NumberInput, TreeSelect, SliderWithInput) · 15. Table data quality tab (QualityTab)

classic-light-04

16. Activity thread panel (Drawer → SlideoutMenu) · 17. Lineage config modal (NumberInput in HookForm) · 18. Topic sample data: message cards

classic-light-05

19. Pipeline executions: tree view (Tree, Empty) · 20. Database schema profiler settings (CustomRangeWidget) · 21. Explore summary: glossary term (SummaryList)

classic-light-06

22. Service insights: agents status widget (Collapse → Accordion) · 23. Data insights: left panel (Menu), summary progress · 24. Data insights KPI list + latest results (Progress)

classic-light-07

25. Add KPI (NumberInput + Slider) · 26. Search settings (Accordion, term/field-value boosts) · 27. Search settings: term boost panel open

classic-light-08

28. Field value boost modal (Slider) · 29. Entity search settings: field accordion + config · 30. Entity search settings: field config expanded (Slider, Toggle, Select)

classic-light-09

31. Profiler configuration page (Accordion, TreeSelect, Toggle) · 32. Lineage configuration page (NumberInput, ButtonGroup) · 33. Login configuration (NumberInput)

classic-light-10

34. Data asset rules (Table) · 35. Learning resources list · 36. Learning resource drawer (SlideoutMenu)

classic-light-11

37. Task form settings (core Alert) · 38. Audit logs (ProgressBar) · 39. Permission debugger (ComboBox, Spin)

classic-light-12

40. Add policy + rule form (TreeSelect, ComboBox) · 41. Add rule to policy (RuleForm) · 42. Edit rule (RuleForm prefilled)

classic-light-13

43. Create user (TeamsSelectable TreeSelect, RHF) · 44. Create bot (token expiry Select) · 45. User profile → permissions (Accordion, Spin)

classic-light-14

46. User profile teams edit (TeamsSelectableNew) · 47. Team details (Avatar) · 48. Users list pagination (PaginationComponent)

classic-light-15

49. Persona details · 50. Persona customize navigation (Tree) · 51. SSO configuration (grouped fields Accordion, FileUpload)

classic-light-16

52. Alert details: recent events (Table, Accordion) · 53. Observability alert: recent events · 54. Applications list

classic-light-17

55. Marketplace · 56. Marketplace app details (Carousel → AppScreenshots, Alert) · 57. App install stepper (Steps → ProgressSteps, Avatar, Accordion)

classic-light-18

58. Bulk import (UploadFile drop zone, stepper) · 59. Add metadata ingestion (ObjectFieldTemplate, ManifestJsonWidget) · 60. Data quality page (PageHeader)

classic-light-19

61. Services list (ColumnFilter, PageHeader)

classic-light-20
AI mode · light — 56 states

1. Settings landing (SettingItemCard badges) · 2. Settings → Preferences (SettingItemCard) · 3. Explore summary panel: table columns (SummaryList accordion)

ai-light-00

4. Explore summary panel: API endpoint (schema toggle + SummaryList) · 5. Table schema: tabs labels, column filter · 6. Table schema: column filter dropdown (ColumnFilter Menu → Dropdown)

ai-light-01

7. Table schema: column detail panel (Drawer → SlideoutMenu) · 8. Table queries: right panel · 9. Table profiler settings slideout (NumberInput, TreeSelect, SliderWithInput)

ai-light-02

10. Table data quality tab (QualityTab) · 11. Activity thread panel (Drawer → SlideoutMenu) · 12. Lineage config modal (NumberInput in HookForm)

ai-light-03

13. Topic sample data: message cards · 14. Pipeline executions: tree view (Tree, Empty) · 15. Database schema profiler settings (CustomRangeWidget)

ai-light-04

16. Explore summary: glossary term (SummaryList) · 17. Service insights: agents status widget (Collapse → Accordion) · 18. Data insights: left panel (Menu), summary progress

ai-light-05

19. Data insights KPI list + latest results (Progress) · 20. Add KPI (NumberInput + Slider) · 21. Search settings (Accordion, term/field-value boosts)

ai-light-06

22. Search settings: term boost panel open · 23. Field value boost modal (Slider) · 24. Entity search settings: field accordion + config

ai-light-07

25. Entity search settings: field config expanded (Slider, Toggle, Select) · 26. Profiler configuration page (Accordion, TreeSelect, Toggle) · 27. Lineage configuration page (NumberInput, ButtonGroup)

ai-light-08

28. Login configuration (NumberInput) · 29. Data asset rules (Table) · 30. Learning resources list

ai-light-09

31. Learning resource drawer (SlideoutMenu) · 32. Task form settings (core Alert) · 33. Audit logs (ProgressBar)

ai-light-10

34. Permission debugger (ComboBox, Spin) · 35. Add policy + rule form (TreeSelect, ComboBox) · 36. Add rule to policy (RuleForm)

ai-light-11

37. Edit rule (RuleForm prefilled) · 38. Create user (TeamsSelectable TreeSelect, RHF) · 39. Create bot (token expiry Select)

ai-light-12

40. User profile → permissions (Accordion, Spin) · 41. User profile teams edit (TeamsSelectableNew) · 42. Team details (Avatar)

ai-light-13

43. Users list pagination (PaginationComponent) · 44. Persona details · 45. Persona customize navigation (Tree)

ai-light-14

46. SSO configuration (grouped fields Accordion, FileUpload) · 47. Alert details: recent events (Table, Accordion) · 48. Observability alert: recent events

ai-light-15

49. Applications list · 50. Marketplace · 51. Marketplace app details (Carousel → AppScreenshots, Alert)

ai-light-16

52. App install stepper (Steps → ProgressSteps, Avatar, Accordion) · 53. Bulk import (UploadFile drop zone, stepper) · 54. Add metadata ingestion (ObjectFieldTemplate, ManifestJsonWidget)

ai-light-17

55. Data quality page (PageHeader) · 56. Services list (ColumnFilter, PageHeader)

ai-light-18
AI mode · dark — 56 states

1. Settings landing (SettingItemCard badges) · 2. Settings → Preferences (SettingItemCard) · 3. Explore summary panel: table columns (SummaryList accordion)

ai-dark-00

4. Explore summary panel: API endpoint (schema toggle + SummaryList) · 5. Table schema: tabs labels, column filter · 6. Table schema: column filter dropdown (ColumnFilter Menu → Dropdown)

ai-dark-01

7. Table schema: column detail panel (Drawer → SlideoutMenu) · 8. Table queries: right panel · 9. Table profiler settings slideout (NumberInput, TreeSelect, SliderWithInput)

ai-dark-02

10. Table data quality tab (QualityTab) · 11. Activity thread panel (Drawer → SlideoutMenu) · 12. Lineage config modal (NumberInput in HookForm)

ai-dark-03

13. Topic sample data: message cards · 14. Pipeline executions: tree view (Tree, Empty) · 15. Database schema profiler settings (CustomRangeWidget)

ai-dark-04

16. Explore summary: glossary term (SummaryList) · 17. Service insights: agents status widget (Collapse → Accordion) · 18. Data insights: left panel (Menu), summary progress

ai-dark-05

19. Data insights KPI list + latest results (Progress) · 20. Add KPI (NumberInput + Slider) · 21. Search settings (Accordion, term/field-value boosts)

ai-dark-06

22. Search settings: term boost panel open · 23. Field value boost modal (Slider) · 24. Entity search settings: field accordion + config

ai-dark-07

25. Entity search settings: field config expanded (Slider, Toggle, Select) · 26. Profiler configuration page (Accordion, TreeSelect, Toggle) · 27. Lineage configuration page (NumberInput, ButtonGroup)

ai-dark-08

28. Login configuration (NumberInput) · 29. Data asset rules (Table) · 30. Learning resources list

ai-dark-09

31. Learning resource drawer (SlideoutMenu) · 32. Task form settings (core Alert) · 33. Audit logs (ProgressBar)

ai-dark-10

34. Permission debugger (ComboBox, Spin) · 35. Add policy + rule form (TreeSelect, ComboBox) · 36. Add rule to policy (RuleForm)

ai-dark-11

37. Edit rule (RuleForm prefilled) · 38. Create user (TeamsSelectable TreeSelect, RHF) · 39. Create bot (token expiry Select)

ai-dark-12

40. User profile → permissions (Accordion, Spin) · 41. User profile teams edit (TeamsSelectableNew) · 42. Team details (Avatar)

ai-dark-13

43. Users list pagination (PaginationComponent) · 44. Persona details · 45. Persona customize navigation (Tree)

ai-dark-14

46. SSO configuration (grouped fields Accordion, FileUpload) · 47. Alert details: recent events (Table, Accordion) · 48. Observability alert: recent events

ai-dark-15

49. Applications list · 50. Marketplace · 51. Marketplace app details (Carousel → AppScreenshots, Alert)

ai-dark-16

52. App install stepper (Steps → ProgressSteps, Avatar, Accordion) · 53. Bulk import (UploadFile drop zone, stepper) · 54. Add metadata ingestion (ObjectFieldTemplate, ManifestJsonWidget)

ai-dark-17

55. Data quality page (PageHeader) · 56. Services list (ColumnFilter, PageHeader)

ai-dark-18

Separate fixes: visual verification

Fixes added on top of the migration after review. Same local stack as above (backend :8585 with sample data). Left: main (:3002), right: this PR (:3000), same viewport, unless marked after only.

# Fix Commit Mode Result
S1 Entity tabs drop the outer left-panel frame card, so Description and the schema table sit directly on the page (as on the governance pages) 653f573693e Classic light, AI light + dark Pass
S2 Every header field uses the shared core EditIconButton: Retention Period, service header row (domain, owner, tier), Context Center article header, workflow title fed79816249 AI light Pass. Article header and workflow title are covered by unit tests only (no article locally; system workflows hide the title edit)
S3 Explore search and quick filters stay centred but grow with the screen: at least 56rem (the old 800px search) and 55% of the header row beyond that. AI mode only, since classic has no search card 7b97f28662c, 5e8538801b7 AI light at 1512px (unchanged, 896px column) and about 3024px (page zoomed to 50%; 1466px column, centred) Pass
S4 Owners edit icon matches Domains: already fixed on main by #35226, re-checked here (none) AI light Pass, after only
S5 Data Contract Previous/Next buttons are not cut off on the Semantics step (none) AI light Pass, after only; the cut-off was seen on an older Collate build
S6 Tag tooltip keeps the FQN bold when the tag description is HTML with a list (getTagTooltip no longer prepends markdown **fqn** to the description) 7c4fd445031 AI light, PII.Sensitive given an HTML description with a list for the capture, then restored Pass. main shows **PII.Sensitive** literally; this PR shows it bold. On both builds the tooltip stays open while hovered (checked 1s and 5s after hover)
S7 Header Tier chip shows its description tooltip again and keeps it open while hovered. Lost in #32557 (TagsV1 → ClassificationTag); restored with the shared chip tooltip. It flickered because the tooltip flips below the chip and, for one frame while positioned, sat under the cursor and fired pointerleave; core Tooltip now ignores the pointer only while it enters (pointer-events: none during the entering phase), so a settled tooltip stays hoverable and clickable (links, "view more") 1b98e58d80d, 6a82daffb21 AI light, shopify.work (Tier1), Chrome tab in front so animations run Pass. main: no tooltip. Branch without the core fix: opens, then closes under a still cursor. With it: still open at 6s; moving the cursor onto the settled tooltip keeps it open; unit tests cover the header wiring, the chip tooltip staying open, and a settled tooltip's button staying clickable
S1: entity tab without the outer frame (classic light · AI light · AI dark) 01-table-classic-light 02-table-ai-light 03-table-ai-dark
S2: header edit icons (top: main, bottom: this PR)

Table header: Retention Period now matches the other fields.

07-table-header-edit-icons

Service header row (Connections → sample_data): domain, owner and tier.

06-service-header-row
S3: Explore search width, AI mode (~3024px, top: main, bottom: this PR)

At 1512px the column is unchanged from main (896px). On wider screens it grows to 55% of the header row and stays centred.

09-explore-ai-wide-centred
S6: tag tooltip with an HTML description (top: main, bottom: this PR; left 1s, right 5s after hover) 10-tag-tooltip-before-after

The tooltip closing in the original report was on the header Tier chip; see S7.

S7: header Tier tooltip (rows: main · branch without the core fix · this PR; left 1s, right 6s after hover) 11-header-tier-tooltip
S5: Data Contract Semantics step footer (after only) 08-contract-buttons-after

UI screen recording:

Not applicable: component/form migration refactor. The before/after screenshots and full-size archives above cover classic (light) and AI (light and dark).

Checklist:

  • Linked issues describe the migration scope and sequence.
  • Non-obvious state, numeric, tree, field-array, and serialization constraints are documented.
  • Tests cover the migrated behavior and API payloads.
  • Durable numeric/API decisions are recorded in the tree.
  • JSON Schema migrations are not applicable.
  • Visual regression vs main: classic (light) and AI (light + dark) screenshots for every migrated page/component, with full-size archives.
  • Numbered manual test guide run on the final commit; every row passes.
  • Playwright: runs on CI (local run skipped at the author's request).
  • Branch merged with current main (no conflicts).

Playwright CI run

Postgresql PR Playwright E2E Tests, run 38495192267 (on ff2c0356c09) failed 3 tests, one per shard. All three are fixed in de2ec226b7a (spec-only changes):

Shard Test Cause Fix
chromium-10 Features/Topic.spec.ts › Copy nested field link should include full hierarchical path The expand-icon locator matched the toolbar's Expand All icon first, so the nested row never opened and the copy button picked belonged to a top-level row Scope the locator to table rows
chromium-13 Features/SettingsNavigationPage.spec.ts › should persist a reordered sub-item after reload Dropped on the middle of the target row, which the core tree treats as a drop onto it Drop on the target row's bottom edge
chromium-20 Pages/DataInsight.spec.ts › Verifying App analytics tab The left panel entries are nav links since the core migration, not menu items Open App Analytics by link role

🤖 Generated with Claude Code

@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
@shah-harshit
shah-harshit force-pushed the shah-harshit/7300-antd-display-components branch from 11dec04 to 7220b68 Compare October 12, 2026 13:14
…eftovers

Main added CustomizeAppModeSidebarPage importing the antd-tree LESS file this branch deletes; the page renders the core Tree, so the import is dead. The rebase also truncated alert-recent-events-tab.less into an unterminated comment; its antd Collapse styles are unused after the Accordion swap, so remove it. Strip empty className props and string-concat classNames left by the Collapse codemod, and lower the pinned no-positional-locator suppression count.
@shah-harshit
shah-harshit force-pushed the shah-harshit/7300-antd-display-components branch from 11cb9a1 to c302948 Compare October 12, 2026 15:57
…ize and row height

Collapsed leaf links enlarged NavItemButton through className, so their icons rendered larger than the ButtonUtility group triggers. Use NavItemButton's own size and match the group row height with wrapper layout instead.
#35339 migrates every remaining Affix, Empty,
Image, Result and Spin import. Drop this branch's copies of those swaps so
the two PRs don't conflict, keeping the Tree, Accordion, Alert, Checkbox
and ComboBox migrations in the same files. Restore the matching
suppressions and keep the five components off the migrated list until
#35339 lands.
@shah-harshit shah-harshit changed the title Fixes #6884: migrate display and navigation components to core Migrate display, navigation, selection and numeric components to core Oct 13, 2026
Resolve conflicts with the Modal/Button freeze (#35226), the Data Contract
(#35217), Add Assets (#35242) and Applications settings (#35179) migrations.
Where main already migrated a file, keep main's version and drop this
branch's duplicate (DataContract SLA/view switch, AssetSelectionContentBody,
TableDataCardV2, AppLogsViewer, ReindexFailures). Elsewhere keep this
branch's migration and port main's core Button changes onto it.
…ld panels

antd Collapse never rendered an unopened panel; the core AccordionPanel keeps
collapsed content mounted unless unmountOnCollapse is set. Set it on alert
recent events and Kafka sample message cards, which each mount a CodeMirror
editor, and use it for search field configurations instead of gating the
body by hand.
getTagTooltip prefixed the description with markdown **fqn**. A description
holding a list or table is treated as HTML, so markdown was skipped and the
asterisks showed literally. Render the FQN as its own element instead.
Entity pages (table, topic, dashboard, ...) wrapped their widgets in a
left-panel frame card, so the Description and schema cards rendered as
cards inside a card. The governance pages already dropped that frame
through GenericTab's flat variant; every GenericTab now renders flat, so
the variant prop goes away. The customize page grid keeps its frame.
@github-actions

Copy link
Copy Markdown
Contributor

Hi there 👋 Thanks for your contribution!

The OpenMetadata team will review the PR shortly! Once it has been labeled as safe to test, the CI workflows
will start executing and we'll be able to make sure everything is working as expected.

Let us know if you need any help!

shah-harshit and others added 8 commits October 14, 2026 07:27
The search and quick filters were capped at max-w-4xl (800px usable) and
centred in the space beside the title, so on large screens they looked
small and off-centre. Drop the cap so the column grows with the row.
Retention Period, the service header row (domain, owner, tier), the
Context Center article header (domain, owner) and the workflow title each
hand-built their edit trigger from legacy SVG assets (edit-new.svg,
action-icons/edit.svg) on ButtonUtility or a restyled Button, so their
pencil glyph, box and border differed from the other header fields.
They now render EditIconButton (newLook, small) like Domains, Owners,
Tier and Certification, keeping their test ids.
Filling the whole header row made the search too wide on large screens.
Centre it again with a fluid cap: at least 56rem (the previous 800px
usable width) and 55% of the header row beyond that.
…y-link specs

- Data Insight: the left panel entries are nav links since the core
  migration, so open App Analytics by link role, as the KPIs steps do.
- Settings navigation: the persist-after-reload test still dropped on the
  middle of the target row, which the core tree treats as a drop onto it;
  drop on the bottom edge so the item is reordered after it.
- Topic: the expand-icon locator matched the toolbar's Expand All icon
  first, so the nested row never opened and the copy button picked was a
  top-level row's. Scope the locator to table rows.
…d-hover

The header Tier chip lost its description tooltip when #32557 swapped
TagsV1 for ClassificationTag. Wrap it in the chip tooltip TagsViewer
already uses, moved to its own TagChipTooltip module so both share it.

That tooltip flickered: the chip sits near the top of the page, so the
tooltip flips from top to bottom, and for one frame while it is being
positioned it lands under the cursor. Taking the pointer fired
pointerleave on the chip and react-aria closed the tooltip. Core
Tooltip now has pointer-events: none; react-aria tooltips close once the
cursor leaves the trigger, so they were never hoverable anyway.
Blocking pointer events on every tooltip broke tooltips that hold links or
"view more" buttons: react-aria keeps a tooltip open while it is hovered,
so its content is meant to be reachable. The flicker only needs the pointer
ignored for the frames where the tooltip is still being positioned (it can
flip under the cursor then), so scope pointer-events: none to the entering
phase.
Export getDateRangePresets so callers can re-derive a preset's range
from its key, and hand onApply the clicked preset's key so a caller can
store the preset rather than its frozen bounds. Presets are also built
from today on each mount instead of at module load.

Part of open-metadata/openmetadata-collate#7439

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…it on dismiss

- Below the md breakpoint presets are picked through RangeCalendar's own
  buttons, whose setValue went through the picker's onChange and cleared
  the key, so Apply reported no preset. RangeCalendar now reports the
  picked preset through onPresetSelect, called after the value change.
- The key outlived a dismissed picker (Escape, outside click), so a later
  Apply without edits could report a preset the range no longer matched.
  Clear it whenever the popover closes; Apply reads it before closing.
@github-actions

Copy link
Copy Markdown
Contributor

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

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

shah-harshit and others added 6 commits October 14, 2026 21:15
…roles

The core NumberInput main now ships is a react-aria NumberField: its input is
a textbox that commits on blur, not an antd spinbutton. The core TreeSelect
search input is a combobox.
…ines

After merging main, these pages render this PR's core sidebar next to main's
updated navbar; take the CI renders as the new baselines.
The baseline still showed main's previous icon rail; it sat just under the
diff threshold and tipped over when the sample record count shifted.
The core TreeSelect's search input is a combobox in this branch, not a plain
textbox.
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ UI Checkstyle passed — lint findings in changed files

🔍 ESLint findings in this PR's files — 0 error(s), 114 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), 114 warning(s) across 34 changed file(s).

Count Rule
80 react-hooks/exhaustive-deps
10 openmetadata-imports/no-circular-imports
9 openmetadata-imports/no-lower-layer-page-imports
7 openmetadata-ui-patterns/no-non-adaptive-palette
3 openmetadata-imports/review-sequential-api-calls
3 openmetadata-imports/no-cross-page-imports
2 openmetadata-imports/no-api-calls-in-iteration
All findings
Location Rule Message
🟡 src/components/AppContainer/AppContainer.tsx:80:6 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'appPreferences', 'setAppPreferences', 'setConfig', and 'setLineageConfig'. Either include them or remove the d
🟡 src/components/AppContainer/AppContainer.tsx:86:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'fetchAppConfigurations'. Either include it or remove the dependency array.
🟡 src/components/AppContainer/AppContainer.tsx:94:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'location'. Either include it or remove the dependency array.
🟡 src/components/Customization/GenericTab/GenericTab.tsx:23: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/Customization/GenericTab/GenericTab.tsx:24:1 openmetadata-imports/no-circular-imports This runtime import participates in a circular dependency. Extract the shared type/constant/utility or invert the dependency.
🟡 src/components/Customization/GenericTab/GenericTab.tsx:65:6 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 'handleHeightChange'. Either include it or remove the dependency array.
🟡 src/components/DataAssetRules/DataAssetRules.component.tsx:80:6 react-hooks/exhaustive-deps React Hook useCallback has a missing dependency: 't'. Either include it or remove the dependency array.
🟡 src/components/DataAssetRules/DataAssetRules.component.tsx:84:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'fetchSemanticsRules'. Either include it or remove the dependency array.
🟡 src/components/DataAssetRules/DataAssetRules.component.tsx:119:5 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'fetchSemanticsRules' and 't'. Either include them or remove the dependency array.
🟡 src/components/DataAssetRules/DataAssetRules.component.tsx:392:5 react-hooks/exhaustive-deps React Hook useMemo has an unnecessary dependency: 't'. Either exclude it or remove the dependency array. Outer scope values like 't' aren't valid dependencies b
🟡 src/components/DataAssetRules/DataAssetRules.component.tsx:412:6 react-hooks/exhaustive-deps React Hook useMemo has missing dependencies: 'addEditSemanticsRule' and 'deleteSemanticsRule'. Either include them or remove the dependency array.
🟡 src/components/Database/ColumnDetailPanel/ColumnDetailPanel.component.tsx:632:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'activeColumn'. Either include it or remove the dependency array.
🟡 src/components/Database/ColumnDetailPanel/ColumnDetailPanel.component.tsx:751:24 openmetadata-ui-patterns/no-non-adaptive-palette Raw palette class "tw:text-gray-400" is static — it does not flip in dark mode. Use the theme-adapting "utility-" variant (tw:text-utility-gray-400) or a semant
🟡 src/components/Database/ColumnDetailPanel/ColumnDetailPanel.component.tsx:810:17 openmetadata-ui-patterns/no-non-adaptive-palette Raw palette class "tw:text-gray-400" is static — it does not flip in dark mode. Use the theme-adapting "utility-" variant (tw:text-utility-gray-400) or a semant
🟡 src/components/Database/ColumnDetailPanel/ColumnDetailPanel.component.tsx:821:27 openmetadata-ui-patterns/no-non-adaptive-palette Raw palette class "tw:text-gray-400" is static — it does not flip in dark mode. Use the theme-adapting "utility-" variant (tw:text-utility-gray-400) or a semant
🟡 src/components/Database/ColumnDetailPanel/ColumnDetailPanel.component.tsx:871:19 openmetadata-ui-patterns/no-non-adaptive-palette Raw palette class "tw:text-gray-400" is static — it does not flip in dark mode. Use the theme-adapting "utility-" variant (tw:text-utility-gray-400) or a semant
🟡 src/components/Database/SampleDataWithMessages/MessageCard.tsx:66:6 react-hooks/exhaustive-deps React Hook useEffect has missing dependencies: 'message' and 't'. Either include them or remove the dependency array. If 'setHeader' needs the current value of
🟡 src/components/Explore/EntitySummaryPanel/APIEndpointSummary/APIEndpointSummary.tsx:89:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'fetchApiEndpointDetails'. Either include it or remove the dependency array.
🟡 src/components/Glossary/GlossaryDetails/GlossaryDetails.component.tsx:210:6 react-hooks/exhaustive-deps React Hook useMemo has missing dependencies: 'feedCount', 'getEntityFeedCount', 'glossary.childrenCount', 'glossary.id', 'glossary.owners', 'glossary.reviewers'
🟡 src/components/Glossary/GlossaryDetails/GlossaryDetails.component.tsx:221:6 react-hooks/exhaustive-deps React Hook useEffect has missing dependencies: 'fetchActivityCount' and 'fetchTaskCounts'. Either include them or remove the dependency array.
🟡 src/components/Glossary/GlossaryDetails/GlossaryDetails.component.tsx:225:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 'tabs'. Either include it or remove the dependency array.
🟡 src/components/Glossary/GlossaryDetails/GlossaryDetails.component.tsx:225: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/MyData/Widgets/CuratedAssetsWidget/CuratedAssetsWidget.tsx:45: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/MyData/Widgets/CuratedAssetsWidget/CuratedAssetsWidget.tsx:216:6 react-hooks/exhaustive-deps React Hook useCallback has an unnecessary dependency: 'curatedAssetsConfig'. Either exclude it or remove the dependency array.
🟡 src/components/MyData/Widgets/CuratedAssetsWidget/CuratedAssetsWidget.tsx:461:5 react-hooks/exhaustive-deps React Hook useMemo has an unnecessary dependency: 'curatedAssetsWidth'. Either exclude it or remove the dependency array.
🟡 src/components/NavBar/NavBar.tsx:212:5 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'activeTab' and 'hasMentionNotification'. Either include them or remove the dependency array.
🟡 src/components/NavBar/NavBar.tsx:367:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'location.pathname'. Either include it or remove the dependency array.
🟡 src/components/NavBar/NavBar.tsx:457:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'showBrowserNotification'. Either include it or remove the dependency array.
🟡 src/components/NavBar/NavBar.tsx:461:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'fetchOMVersion'. Either include it or remove the dependency array.
🟡 src/components/NavBar/NavBar.tsx:476:5 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'navigate' and 'updateActiveDomain'. Either include them or remove the dependency array.
🟡 src/components/NavBar/NavBar.tsx:481:5 react-hooks/exhaustive-deps React Hook useMemo has an unnecessary dependency: 't'. Either exclude it or remove the dependency array.
🟡 src/components/NotificationBox/NotificationBox.component.tsx:231:5 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'onMarkMentionsNotificationRead' and 'onMarkTaskNotificationRead'. Either include them or remove the dependency
🟡 src/components/NotificationBox/NotificationBox.component.tsx:243:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'getTaskNotificationData'. Either include it or remove the dependency array.
🟡 src/components/SearchSettings/EntitySeachSettings/EntitySearchSettings.tsx:56: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/SearchSettings/EntitySeachSettings/EntitySearchSettings.tsx:166:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 'entityType'. Either include it or remove the dependency array.
🟡 src/components/SearchSettings/EntitySeachSettings/EntitySearchSettings.tsx:622:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'fetchSearchConfig'. Either include it or remove the dependency array.
🟡 src/components/SearchSettings/EntitySeachSettings/EntitySearchSettings.tsx:634:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'fetchCustomProperties'. Either include it or remove the dependency array.
🟡 src/components/Settings/Applications/MarketPlaceAppDetails/MarketPlaceAppDetails.component.tsx:129:6 react-hooks/exhaustive-deps React Hook useCallback has a missing dependency: 'navigate'. Either include it or remove the dependency array.
🟡 src/components/Settings/Applications/MarketPlaceAppDetails/MarketPlaceAppDetails.component.tsx:304:6 react-hooks/exhaustive-deps React Hook useMemo has missing dependencies: 'installApp', 'isAppDisabled', 'onBrowseAppsClick', and 't'. Either include them or remove the dependency array.
🟡 src/components/Settings/Applications/MarketPlaceAppDetails/MarketPlaceAppDetails.component.tsx:309:6 react-hooks/exhaustive-deps React Hook useEffect has missing dependencies: 'fetchAppDetails' and 'fetchInstalledAppDetails'. Either include them or remove the dependency array.
🟡 src/components/Settings/Team/TeamDetails/TeamDetailsV1.tsx:72: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/Settings/Team/TeamDetails/TeamDetailsV1.tsx:73: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/Settings/Team/TeamDetails/TeamDetailsV1.tsx:234:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array.
🟡 src/components/Settings/Team/TeamDetails/TeamDetailsV1.tsx:334:5 react-hooks/exhaustive-deps React Hook useCallback has a missing dependency: 't'. Either include it or remove the dependency array.
🟡 src/components/Settings/Team/TeamDetails/TeamDetailsV1.tsx:556:6 react-hooks/exhaustive-deps React Hook useEffect has a missing dependency: 'isOrganization'. Either include it or remove the dependency array.
🟡 src/components/Settings/Team/TeamDetails/TeamDetailsV1.tsx:583:6 react-hooks/exhaustive-deps React Hook useCallback has a missing dependency: 'showModal'. Either include it or remove the dependency array.
🟡 src/components/Settings/Team/TeamDetails/TeamDetailsV1.tsx:594:6 react-hooks/exhaustive-deps React Hook useCallback has missing dependencies: 'currentTeam.name' and 'navigate'. Either include them or remove the dependency array.
🟡 src/components/Settings/Team/TeamDetails/TeamDetailsV1.tsx:633:6 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array.
🟡 src/components/Settings/Team/TeamDetails/TeamDetailsV1.tsx:688:5 react-hooks/exhaustive-deps React Hook useMemo has missing dependencies: 'IMPORT_EXPORT_MENU_ITEM', 'handleOpenToJoinToggle', 'handleReactiveTeam', 'isGroupType', and 't'. Either include t
🟡 src/components/Settings/Team/TeamDetails/TeamDetailsV1.tsx:783:6 react-hooks/exhaustive-deps React Hook useMemo has missing dependencies: 't' and 'teamAssetCounts'. Either include them or remove the dependency array.

… and 64 more. Run make ui-checkstyle-changed locally for the full list.


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

make ui-checkstyle-changed

@gitar-bot

gitar-bot Bot commented Oct 14, 2026

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

🟡 Medium risk · Migrating navigation, selection, upload, and numeric controls across many screens could disrupt submitted values or user workflows if core behavior differs.

Migrates display, navigation, selection and numeric components (TreeSelect, Checkbox, Radio, Slider, AutoComplete, TimePicker, Upload, Tree, Table and others) to core components, and adds a preset key to DateRangePicker onApply. Resolved this session: the .refresh-alert hardcoded px offsets and width, the uncached-failure retry on the teams request, the unused selectedTeamChips breaking the Playwright tsc build, mobile preset buttons not reporting a key, and the preset key going stale after dismiss or external value changes.

Four items were closed without a fix in this PR: call sites stripping core Accordion borders, a duplicate expand arrow on the agents status header, unlabeled policy/summary toggle buttons, and collapsed event panels mounting a CodeMirror editor per event. No open findings remain.

✅ 9 closed
✅ Quality: New .refresh-alert rule hardcodes px offsets and width

📄 openmetadata-ui/src/main/resources/ui/src/components/NavBar/nav-bar.less:82-89
This commit adds the .refresh-alert rule with bottom: 30px and width: 470px. The styling rules say .less files must not use raw px spacing, and that a missing token belongs in tokens.css (Layers 1 and 2), not in the component. The z-index on the next line already uses a token, so these two values are the only hardcoded ones in the rule. Fix: use existing --om-* spacing and size tokens, or add tokens for them to tokens.css, so yarn token-audit passes.

✅ Edge Case: Failed teams request stays cached, so it never retries and toasts twice

📄 openmetadata-ui/src/main/resources/ui/src/components/Settings/Team/TeamsSelectable/TeamsSelectable.tsx:69-79 📄 openmetadata-ui/src/main/resources/ui/src/components/Settings/Team/TeamsSelectable/TeamsSelectable.tsx:81-94 📄 openmetadata-ui/src/main/resources/ui/src/components/Settings/Team/TeamsSelectable/TeamsSelectableNew.tsx:79-93
teamsRequest.current ??= getTeamsHierarchy(...) keeps the promise in the ref even after it rejects. If getTeamsHierarchy fails, the mount effect shows showErrorToast. When the user opens the picker, fetchData awaits the same rejected promise, and useTreeSelectData shows a second, generic toast.error because no onFetchError is passed. Nothing clears the ref, so the picker can't recover until the component remounts. The ref is also never reset when filterJoinable changes, so loadTeams keeps returning the tree fetched with the old filter. Fix: clear the ref when the request rejects (and when filterJoinable changes), and pass onFetchError so the user sees one toast.

✅ Quality: selectedTeamChips is declared but never used, so playwright tsc fails

📄 openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/TeamsHierarchy.spec.ts:132-136 📄 openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/TeamsHierarchy.spec.ts:148-152 📄 openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/TeamsHierarchy.spec.ts:175-177
In TeamsHierarchy.spec.ts, the old .ant-select-selection-item chip locator became selectedTeamChips = teamSelect.getByRole('button', { name: /^Remove / }). Neither step uses it, though: both now build their own teamSelect.getByRole('button', { name: 'Remove …' }) locator inline. playwright/tsconfig.json sets noUnusedLocals: true, so type-checking the Playwright sources reports TS6133 on this declaration. The fix is to filter the shared locator in both steps, or to delete the declaration.

✅ Bug: Mobile preset buttons never report a preset key to onApply

📄 openmetadata-ui-core-components/src/main/resources/ui/src/components/application/date-picker/date-range-picker.tsx:143-146 📄 openmetadata-ui-core-components/src/main/resources/ui/src/components/application/date-picker/date-range-picker.tsx:181-189 📄 openmetadata-ui-core-components/src/main/resources/ui/src/components/application/date-picker/date-range-picker.tsx:198-202
Below the lg breakpoint the sidebar presets are hidden (tw:hidden … tw:lg:flex). Users there pick a preset through RangeCalendar's MobilePresetButton, which calls context.setValue(value) (range-calendar.tsx:81-83). That fires the picker's onChange, and onChange now runs setPresetKey(undefined). So on small screens, picking "Last week", "Last month" or "Last year" and pressing Apply calls onApply(undefined), while the same choice on desktop calls onApply('lastMonth'). Any consumer that relies on the key, for example to store a relative range, will behave differently depending on screen width. The fix is to have RangeCalendar accept an onPresetSelect(key) callback that MobilePresetButton calls after setValue, and pass setPresetKey from DateRangePicker. The callback has to run after onChange so the key isn't cleared again. A test with matchMedia returning matches: false should cover the mobile path.

✅ Edge Case: Preset key goes stale after dismiss or an external value change

📄 openmetadata-ui-core-components/src/main/resources/ui/src/components/application/date-picker/date-range-picker.tsx:135 📄 openmetadata-ui-core-components/src/main/resources/ui/src/components/application/date-picker/date-range-picker.tsx:138-146 📄 openmetadata-ui-core-components/src/main/resources/ui/src/components/application/date-picker/date-range-picker.tsx:215-228
presetKey is cleared only by the picker's onChange and by the Cancel button. It is still set after a successful Apply, when the popover is closed with Escape or an outside click, and when a controlled parent replaces value (for example a "clear filters" reset, which doesn't go through onChange). If the user then reopens the picker and presses Apply without editing anything, onApply gets the old preset key even though the displayed range is no longer that preset. The fix is to reset the key when the popover closes without Apply, using onOpenChange={(open) => !open && setPresetKey(undefined)} after the Apply handler has read it, or to reset it whenever valueProp changes from outside.

...and 4 more closed from earlier reviews

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