Skip to content

feat(ui): Needs you now slot on the home page, and the landing page design review - #35462

Merged
shrabantipaul-collate merged 18 commits into
mainfrom
feat/landing-page-needs-you-now-slot
Oct 15, 2026
Merged

shrabantipaul-collate merged 18 commits into
mainfrom
feat/landing-page-needs-you-now-slot

Conversation

@shrabantipaul-collate

@shrabantipaul-collate shrabantipaul-collate commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Describe your changes:

oss-impacted-passed-p5 oss-impacted-passed-p1 oss-impacted-passed-p2 oss-impacted-passed-p3 oss-impacted-passed-p4 oss-customizewidgets-rerun
Screen.Recording.2026-10-14.at.6.18.17.PM.mov

No OpenMetadata issue, as with #34770: the work is tracked in the Collate epic
(open-metadata/openmetadata-collate#6790).

Adds a Needs you now slot to the home landing page and applies the landing page design review
to the announcements and topic widgets. Pairs with open-metadata/openmetadata-collate#7488,
which fills the slot — merge this PR first.

  • Slot. CustomizeMyDataPageClassBase.getNeedsYouNowSection() returns null, so a plain
    OpenMetadata home is unchanged. A deployment with a ranked inbox returns a component, and
    HomeLandingPage renders it between the announcements rail and the topic widgets, in its own
    Suspense boundary. It is the same class-base seam as getPlatformHealthInsight, so it reaches
    both the Classic and the AI-mode mount of the page.
  • Sizing. Card titles 14px medium; body text, rows and footers 12px; section headings 14px;
    card buttons and links xs; 40px between the home sections. All from the design-system scale.
  • Announcements. The type is named in its own colour instead of a badge, with tertiary and
    quaternary greys for body and footer. Opening an announcement from the All announcements
    dialog now closes the dialog.
  • Topic cards. The status badge sits on the right beside a darker collapse chevron. Card
    filters are the small core Select (the Audit Hub › Gaps style) instead of FilterSelect,
    whose brand-coloured selected state read as an always-active filter.
  • Data Quality widget. Groups its latest results by table or by test case (replacing the
    test-type filter). Each row shows where its incident stands (incidentStatus, already inlined
    by the test search), and an aborted run with no incident offers Raise incident, which opens
    the test's Issues tab. Table headers count every result on that table in the card's scope, from
    one dataQualityReport aggregation on originEntityFQN, not only the rows shown.
  • Curated Assets. White rule chips on a blue-gray rule box, persona note on the right, asset
    logos on a white tile.

Type of change:

  • New feature

High-level design:

The slot is a method on CustomizeMyDataPageClassBase, not a prop: Classic mounts
HomeLandingPage from MyDataPage with no props, and Collate's AI mode mounts it from its own
landing page, so only the class-base seam reaches both. OpenMetadata keeps no dependency on the
Collate API behind the section. The Collate side records this in
ADR:2026-10-14-needs-you-now-renders-through-an-oss-home-slot-in-ai-mode-only (Collate repo).

The per-table counts reuse the existing GET /dataQuality/testSuites/dataQualityReport with a
table terms bucket on originEntityFQN and a nested status bucket, scoped by the same
owner / followed-by filters as the card. No backend change.

Tests:

Use cases covered

  • A plain OpenMetadata home renders no Needs you now section; a class base that returns one
    renders it between the announcements and the topics.
  • Data Quality: grouping by table and by test case, incident line per status, Raise incident
    only on an aborted run with no incident, table headers use the aggregated counts.
  • Opening an announcement from the dialog closes it.
  • Topic card filters choose through the core Select.

Unit tests

  • I added unit tests for the new/changed logic.
  • Files added/updated: HomeLandingPage.test.tsx, AnnouncementsRail.test.tsx,
    FilterButton.test.tsx, DataQualityWidget.test.tsx, useDataQualitySummary.test.tsx,
    dataQualityFilters.test.ts.
  • Run: yarn jest src/components/MyData/HomeLandingPage src/components/MyData/Widgets src/hooks/useDataQualitySummary src/utils/dataQualityFilters src/utils/CustomizeMyDataPageClassBase
    → 44 suites, 387 tests passed.
  • Checkstyle: ESLint --fix + Prettier on every changed file leave no diff.

Backend integration tests

  • Not applicable (no backend API changes). make java_affected: no Java tests are impacted.

Playwright (UI) tests

  • Files updated: playwright/e2e/Flow/CustomizeWidgets.spec.ts (Data Quality row test id),
    playwright/utils/widgetFilters.ts (filters pick through chooseSelectOption),
    .github/playwright/impact-map.json (maps the Data Quality summary sources to the landing specs).

The changed spec plus the 18 impact-mapped specs (plan_local_playwright.py; canary and smoke sets not run), UI from this branch against a Collate server on :8585, --workers=2, 1 retry.

Spec Tests Result
Flow/CustomizeWidgets.spec.ts (changed) 6 ✅ all passed
Flow/CustomizeLandingPage.spec.ts 4 ✅ all passed
Flow/PersonaFlow.spec.ts 11 ✅ all passed
Features/CuratedAssets.spec.ts 23 ✅ see note
Features/LandingPageWidgets/DomainDataProductsWidgets.spec.ts 6 ✅ all passed
Features/LandingPageWidgets/DomainWidgetFilter.spec.ts 2 ✅ all passed
Features/LandingPageWidgets/FollowingWidget.spec.ts 11 ✅ all passed
Features/LandingPageWidgets/LandingPage.spec.ts 5 ✅ all passed
Features/LandingPageWidgets/LandingPageContextCenter.spec.ts 5 ✅ all passed
Features/LandingPageWidgets/LandingPageDataEstate.spec.ts 4 ✅ all passed
Features/LandingPageWidgets/LandingPagePlatformHealth.spec.ts 9 ✅ all passed
Features/LandingPageWidgets/LandingPageTopicWidgets.spec.ts 4 ✅ all passed
Features/ActivityAPI.spec.ts 7 ✅ all passed
Features/ActivityFeed.spec.ts 9 ✅ all passed
Features/ActivityFeedTabBadge.spec.ts 4 ✅ all passed
Features/ActivityStream.spec.ts 6 ✅ all passed
Features/NavigationBlocker.spec.ts 5 ✅ all passed
Features/RTL.spec.ts 2 ✅ all passed
Features/SettingsNavigationPage.spec.ts 8 ✅ all passed
Pages/DataInsight.spec.ts 10 ✅ all passed

Run 1: 142 passed, 2 failed, 1 flaky (145 incl. setup / teardown), 31 min. All three non-passes were CuratedAssets … with display name filter (Databases, Database Schemas; API Collections flaky), each a strict-mode violation: two rows with the same name. The search index held a second pw-database-4b9b4c7e / pw-database-schema-cb347bdd left by an interrupted earlier run against the same server. This PR's Curated Assets change is styling only (row tint, logo tile, text size). After removing that run's leftover services:

Re-run CuratedAssets.spec.ts: 26/26 passed (23 specs + setup / teardown), 15.4 min.

Manual testing performed

  1. Collate server on :8585 with the landing-page backend, OSS and Collate UIs from these branches.
  2. Classic and AI mode as admin: home renders, card sizes and filters match the design, Data
    Quality groups by table / test case, incident lines and Raise incident navigate to the
    test's Issues tab, and All announcements closes on opening one.

UI screen recording:

Checklist:

  • I have read the CONTRIBUTING document.
  • My PR title is Fixes <issue-number>: <short explanation>
  • My PR is linked to a GitHub issue via Fixes #<issue-number> above.
  • I have commented on my code, particularly in hard-to-understand areas.
  • I have added tests (unit / integration / Playwright as applicable) and listed them above.
  • Decision check: the slot's shape is recorded in the Collate companion PR.

🤖 Generated with Claude Code

Shrabanti Paul added 8 commits October 14, 2026 12:20
CustomizeMyDataPageClassBase.getNeedsYouNowSection() returns null in
OpenMetadata, so the page is unchanged. A deployment that has a ranked
inbox returns a component, and HomeLandingPage renders it between the
announcements rail and the topic widgets, in its own Suspense boundary.
Card titles drop to 14px medium, card body text, rows and footers to
12px, section headings to 14px, and card buttons and links to the xs
variant, all from the design-system scale. The gap between the home
sections narrows to 40px. Activity links take text-xs, overriding the
legacy 14px prose link rule.
…e design

Announcement cards name their type in the type's colour rather than a
badge, set the body and footer in the tertiary and quaternary greys, and
pad 16px across. Opening an announcement from the All announcements
dialog now closes the dialog. The rail pager uses ButtonUtility's own xs
size. Topic card summaries move to the quaternary grey and status badges
to medium weight.

FilterSelect gains buttonSize for its bordered button trigger (md by
default, so existing callers are unchanged); the landing page's filters
use xs.
Topic cards carry their status badge on the right beside a heavier,
darker collapse chevron. Data Quality groups its latest results by table
or test case instead of filtering by test type, shows each result's
status icon and badge whatever the status, and colours the legend text
like its dot. Curated Assets sets its rule chips white on a blue-gray
rule box, moves the persona note to the right, and puts each asset's
logo on a white tile.
…y widget

Each row now says where its incident stands (New, Ack, Assigned,
Resolved), read from the incidentStatus the test search already inlines.
An aborted run with no incident offers Raise incident, which opens the
test's Issues tab. Table headers count every result on that table in
the card's scope, from one dataQualityReport aggregation by
originEntityFQN, instead of only the rows shown.
FilterButton now renders the small core Select, as the Audit Hub's
filters do: a neutral trigger showing the current choice and a check on
the selected option. Every card filter is single-choice and always holds
a value, so FilterSelect's brand-coloured selected state read as a
permanently active filter. The Playwright helper picks options through
chooseSelectOption.
The topic card filters moved to the core Select, so the bordered
button trigger's size option has no user left.
@github-actions

Copy link
Copy Markdown
Contributor

❌ PR checklist incomplete

This PR cannot be merged until the following are addressed on its linked issue:

  • No GitHub issue is linked. Link an issue in the Development section of the PR (or add Fixes #12345 to the description). For a same-org cross-repo issue, add Fixes open-metadata/<repo>#123 to the description.

The fields live on the linked issue in the Shipping project (open the issue → right sidebar → Projects). After you set them, re-run this check (or push a commit) — issue/project changes do not re-trigger it automatically.

Maintainers can bypass this check by adding the skip-pr-checks label.

@github-actions github-actions Bot added the UI UI specific issues label Oct 14, 2026
@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!

@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: 928 → 928
- 1 added, 1 removed, 0 changed spec-list

New source→spec entries:
  openmetadata-ui/src/main/resources/ui/src/components/MyData/Widgets/DataQualityWidget/DataQualityTestRows.tsx

Removed source→spec entries:
  openmetadata-ui/src/main/resources/ui/src/components/MyData/Widgets/DataQualityWidget/DataQualityWidget.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

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!

@shrabantipaul-collate shrabantipaul-collate added the safe to test Add this label to run secure Github workflows on PRs label Oct 14, 2026
originEntityFQN has a lowercase normalizer, so the report returns its
table buckets lowercased; a table with uppercase letters never found its
counts and the header fell back to the rows shown. Key and look up the
counts by the lowercased FQN.

Records the Needs you now slot contract and its merge order with Collate.

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

@karanh37 karanh37 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@shrabantipaul-collate post the playwright run screenshot

@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Jest test Coverage

UI tests summary

Lines Statements Branches Functions
Coverage: 77%
77.78% (126654/162836) 64.43% (80127/124350) 65.66% (26733/40712)

…ds-you-now-slot

# Conflicts:
#	openmetadata-ui/src/main/resources/ui/src/components/MyData/HomeLandingPage/HomeLandingPage.tsx
Shrabanti Paul and others added 2 commits October 15, 2026 15:00
A fixed w-36 cut "Last 7 days" to "Last 7 d..." once the calendar icon
took its share. The trigger now fits its label, keeping w-36 as its floor.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@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: 932 → 933
- 1 added, 0 removed, 13 changed spec-list

New source→spec entries:
  openmetadata-ui/src/main/resources/ui/src/components/observability/data-quality/ThresholdPreview/ThresholdPreview.tsx

Entries whose spec list changed:
  openmetadata-ui/src/main/resources/ui/playwright/constant/config.ts
  openmetadata-ui/src/main/resources/ui/playwright/e2e/Utils/appMode.ts
  openmetadata-ui/src/main/resources/ui/playwright/e2e/fixtures/pages.ts
  openmetadata-ui/src/main/resources/ui/playwright/support/entity/TableClass.ts
  openmetadata-ui/src/main/resources/ui/playwright/utils/codeEditor.ts
  openmetadata-ui/src/main/resources/ui/playwright/utils/common.ts
  openmetadata-ui/src/main/resources/ui/playwright/utils/dataQuality.ts
  openmetadata-ui/src/main/resources/ui/playwright/utils/testCases.ts
  openmetadata-ui/src/main/resources/ui/src/components/DataQuality/AddDataQualityTest/components/TestCaseFormBody.tsx
  openmetadata-ui/src/main/resources/ui/src/components/DataQuality/IncidentManager/RunDetailsCard/RunDetailsCard.tsx
  … and 3 more

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

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

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

@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

❌ UI Checkstyle Failed

❌ Bundle Runtime Check

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

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

Count Rule
2 openmetadata-imports/no-lower-layer-page-imports
1 react-hooks/exhaustive-deps
All findings
Location Rule Message
🟡 src/components/MyData/HomeLandingPage/HomeLandingPage.tsx:173:5 react-hooks/exhaustive-deps React Hook useMemo has a missing dependency: 'widgetHeight'. Either include it or remove the dependency array.
🟡 src/mocks/MyDataPage.mock.tsx:20: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/utils/CustomizeMyDataPageClassBase.ts:33: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.

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

make ui-checkstyle-changed

Take the CI renders of the design review: 14px card titles, 12px body
text, the topic card filters on the core Select. The navbar search also
renders as main now draws it; the old landing baselines predated that.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@gitar-bot

gitar-bot Bot commented Oct 15, 2026

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

🟡 Medium risk · Adding recent-result lists and table-wide aggregates to the Data Quality widget could display misleading counts or incident guidance if query scopes diverge.

Adds a Needs you now slot to the home landing page, rendered between announcements and topic widgets via a class-base seam, plus landing page design refinements to announcements, topic cards, Data Quality, and Curated Assets. Per-table counts now match uppercase FQNs, and the Collate slot contract is recorded. No open issues found.

✅ 2 closed
✅ Bug: Per-table counts never match tables with uppercase letters in the FQN

📄 openmetadata-ui/src/main/resources/ui/src/utils/dataQualityFilters.ts:134-146 📄 openmetadata-ui/src/main/resources/ui/src/components/MyData/Widgets/DataQualityWidget/DataQualityTestRows.tsx:236-246 📄 openmetadata-ui/src/main/resources/ui/src/hooks/useDataQualitySummary.ts:187-193
originEntityFQN is mapped as a keyword with lowercase_normalizer in test_case_index_mapping.json, so the table terms bucket in dataQualityReport returns lowercased keys. toTableStatusCounts stores counts under that lowercased key. DataQualityTestRows then looks them up with tableCounts?.[group.tableFqn], where group.tableFqn comes from getEntityFQN(entityLink) and keeps its original case. Any table with an uppercase character, which covers most Snowflake and Oracle names, misses the lookup. The header then quietly falls back to counting only the rows shown, which is exactly what this change set out to replace. To fix it, normalise the key on both sides, for example by lowercasing in toTableStatusCounts and at the lookup.

✅ Quality: Needs-you-now slot contract with Collate has no record in this tree

📄 openmetadata-ui/src/main/resources/ui/src/utils/CustomizeMyDataPageClassBase.ts:154-164 📄 openmetadata-ui/src/main/resources/ui/src/components/MyData/HomeLandingPage/HomeLandingPage.tsx:173-187
CustomizeMyDataPageClassBase.getNeedsYouNowSection() is a contract that the Collate repo has to implement. It fixes a no-props ComponentType, a placement between the announcements rail and the topics, its own Suspense boundary, and use in both app modes. The PR also requires a merge order ('Pairs with open-metadata/openmetadata-collate#7488 … merge this PR first'). The only record named is in the Collate repo, and nothing under docs/decisions/ here states the rule. The repo squash-merges, so the merge order and the slot shape stay only in the PR body, which goes against ADR 2026-10-08-a-decision-is-recorded-in-the-tree-not-in-the-pr-body. The record would say: "Collate fills the home 'Needs you now' slot by overriding CustomizeMyDataPageClassBase.getNeedsYouNowSection() to return a prop-less component, which HomeLandingPage renders between the announcements rail and the topic widgets inside its own Suspense boundary. OSS returns null, and the OSS PR merges before Collate #7488." The existing alert-widgets merge-order record is a model for its form.

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

@shrabantipaul-collate
shrabantipaul-collate added this pull request to the merge queue Oct 15, 2026
Merged via the queue into main with commit 961b0eb Oct 15, 2026
77 of 78 checks passed
@shrabantipaul-collate
shrabantipaul-collate deleted the feat/landing-page-needs-you-now-slot branch October 15, 2026 19:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants