Fixes #31854: make the Mentions sub-tab list the tasks you are mentioned in - #31855
Fixes #31854: make the Mentions sub-tab list the tasks you are mentioned in#31855aniketkatkar97 wants to merge 3 commits into
Conversation
…ned in
The Tasks panel renders TaskListV1 off the provider's `tasks` for both of its
sub-tabs, but the fetch effect gated only on the My Tasks sub-tab, so Mentions
fell through to getFeedData and wrote `entityThread` instead. `tasks` was never
updated, leaving the previous My Tasks list on screen -- and empty after a
reload. Collapse "which list renders" and "which fetcher runs" onto a single
`isTaskListTab` predicate so they cannot drift apart again.
The correct request then surfaced a second defect: ListFilter built
`SELECT fr.toId FROM field_relationship`, but that table has no toId column
(TaskRepository.storeMentions writes the task id into toFQN), so every
`?mentionedUser=` query failed with a SQL syntax error on MySQL and Postgres
alike. Match on the indexed fromFQNHash -- the same hash @BindFQN writes on
insert -- and select toFQN.
Also fixed, because they are what makes the stale list visible:
- ActivityFeedProvider now clears the list it owns plus the shared entityPaging
cursor when a first-page fetch starts, and a shared request sequence stops a
superseded response committing rows, the cursor, or clearing the loader. The
leftover cursor was letting infinite scroll append a new query's page onto the
previous query's list, in the incident tab too.
- The isFirstLoad reset keyed off the `subTab` prop, which entity pages never
pass (the sub-tab arrives as a URL param), so a URL or back-button driven
switch showed the outgoing list with no loader.
- handleUpdateTaskFilter fired getTaskData itself on top of the effect already
refiring on taskFilter, i.e. two identical requests per filter click.
- TaskListV1's resize effect and TestCaseIncidentTab's hardcoded
isLoading={false} both treated the new mid-fetch empty window as "no results".
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
✅ PR checks passedThe linked issue has a description and all required Shipping project fields set. Thanks! |
|
| Count | Rule |
|---|---|
| 18 | react-hooks/exhaustive-deps |
| 4 | sonarjs/no-extra-arguments |
| 3 | jsx-a11y/control-has-associated-label |
| 2 | sonarjs/cyclomatic-complexity |
| 2 | openmetadata-imports/review-sequential-api-calls |
| 2 | sonarjs/no-nested-functions |
| 1 | sonarjs/cognitive-complexity |
| 1 | sonarjs/no-nested-conditional |
| 1 | sonarjs/expression-complexity |
| 1 | openmetadata-imports/no-lower-layer-page-imports |
All findings
| Location | Rule | Message | |
|---|---|---|---|
| 🟡 | src/components/ActivityFeed/ActivityFeedList/TaskListV1.component.tsx:67:6 |
react-hooks/exhaustive-deps |
React Hook useEffect has a missing dependency: 'handlePanelResize'. Either include it or remove the dependency array. If 'handlePanelResize' changes too often, |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.test.tsx:376:9 |
sonarjs/no-extra-arguments |
This function expects no arguments, but 1 was provided. |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.test.tsx:412:9 |
sonarjs/no-extra-arguments |
This function expects no arguments, but 1 was provided. |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.test.tsx:418:9 |
sonarjs/no-extra-arguments |
This function expects no arguments, but 1 was provided. |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.test.tsx:648:9 |
sonarjs/no-extra-arguments |
This function expects no arguments, but 1 was provided. |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx:172:6 |
react-hooks/exhaustive-deps |
React Hook useCallback has a missing dependency: 'fetchPostsFeed'. Either include it or remove the dependency array. |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx:193:6 |
react-hooks/exhaustive-deps |
React Hook useCallback has a missing dependency: 'fetchTestCaseResolution'. Either include it or remove the dependency array. |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx:227:7 |
sonarjs/cognitive-complexity |
Refactor this function to reduce its Cognitive Complexity from 27 to the 15 allowed. |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx:227:7 |
sonarjs/cyclomatic-complexity |
{"message":"Function has a complexity of 25 which is greater than 10 authorized.","cost":15,"secondaryLocations":[{"line":227,"column":6,"endLine":227,"endColum |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx:364:5 |
react-hooks/exhaustive-deps |
React Hook useCallback has a missing dependency: 't'. Either include it or remove the dependency array. |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx:427:5 |
react-hooks/exhaustive-deps |
React Hook useCallback has a missing dependency: 't'. Either include it or remove the dependency array. |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx:472:5 |
react-hooks/exhaustive-deps |
React Hook useCallback has missing dependencies: 'setActiveTask', 'setActiveThread', and 't'. Either include them or remove the dependency array. |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx:527:5 |
react-hooks/exhaustive-deps |
React Hook useCallback has a missing dependency: 'setActiveThread'. Either include it or remove the dependency array. |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx:559:34 |
openmetadata-imports/review-sequential-api-calls |
Review these sequential API requests. If they are independent, start them together with Promise.all/Promise.allSettled; keep sequencing only when data-dependent |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx:563:68 |
sonarjs/no-nested-functions |
Refactor this code to not nest functions more than 4 levels deep. |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx:606:5 |
react-hooks/exhaustive-deps |
React Hook useCallback has missing dependencies: 'updatePostHandler' and 'updateThreadHandler'. Either include them or remove the dependency array. |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx:609:9 |
react-hooks/exhaustive-deps |
The 'updateReactions' function makes the dependencies of useMemo Hook (at line 886) change on every render. Move it inside the useMemo callback. Alternatively, |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx:691:9 |
react-hooks/exhaustive-deps |
The 'updateEditorFocus' function makes the dependencies of useMemo Hook (at line 886) change on every render. Move it inside the useMemo callback. Alternatively |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx:699:6 |
react-hooks/exhaustive-deps |
React Hook useCallback has a missing dependency: 'setActiveThread'. Either include it or remove the dependency array. |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx:706:6 |
react-hooks/exhaustive-deps |
React Hook useCallback has a missing dependency: 'setActiveTask'. Either include it or remove the dependency array. |
| 🟡 | src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx:740:28 |
sonarjs/no-nested-functions |
Refactor this code to not nest functions more than 4 levels deep. |
| 🟡 | src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.test.tsx:143:9 |
jsx-a11y/control-has-associated-label |
A control must be associated with a text label. |
| 🟡 | src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx:111:26 |
sonarjs/cyclomatic-complexity |
{"message":"Function has a complexity of 29 which is greater than 10 authorized.","cost":19,"secondaryLocations":[{"line":111,"column":25,"endLine":111,"endColu |
| 🟡 | src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx:260:5 |
react-hooks/exhaustive-deps |
React Hook useCallback has a missing dependency: 'onUpdateFeedCount'. Either include it or remove the dependency array. If 'onUpdateFeedCount' changes too often |
| 🟡 | src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx:273:11 |
sonarjs/no-nested-conditional |
Extract this nested ternary operation into an independent statement. |
| 🟡 | src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx:284:21 |
openmetadata-imports/review-sequential-api-calls |
Review these sequential API requests. If they are independent, start them together with Promise.all/Promise.allSettled; keep sequencing only when data-dependent |
| 🟡 | src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx:330:6 |
react-hooks/exhaustive-deps |
React Hook useCallback has an unnecessary dependency: 'currentUser.id'. Either exclude it or remove the dependency array. |
| 🟡 | src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx:622:5 |
react-hooks/exhaustive-deps |
React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array. |
| 🟡 | src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx:653:6 |
react-hooks/exhaustive-deps |
React Hook useCallback has a missing dependency: 'activeTab'. Either include it or remove the dependency array. |
| 🟡 | src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx:747:6 |
react-hooks/exhaustive-deps |
React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array. |
| 🟡 | src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx:914:10 |
sonarjs/expression-complexity |
Reduce the number of conditional operators (5) used in the expression (maximum allowed 3). |
| 🟡 | src/components/DataQuality/IncidentManager/TestCaseIncidentTab/TestCaseIncidentTab.component.tsx:32:1 |
openmetadata-imports/no-lower-layer-page-imports |
Pages are route-level composition modules. Move the shared implementation/type to a lower layer instead of importing a page from here. |
| 🟡 | src/components/DataQuality/IncidentManager/TestCaseIncidentTab/TestCaseIncidentTab.component.tsx:113:6 |
react-hooks/exhaustive-deps |
React Hook useEffect has a missing dependency: 'handleFeedFetchFromFeedList'. Either include it or remove the dependency array. |
| 🟡 | src/mocks/ActivityFeedProvider.mock.tsx:146:7 |
jsx-a11y/control-has-associated-label |
A control must be associated with a text label. |
| 🟡 | src/mocks/ActivityFeedProvider.mock.tsx:150:7 |
jsx-a11y/control-has-associated-label |
A control must be associated with a text label. |
| 🟡 | src/mocks/ActivityFeedProvider.mock.tsx:290:7 |
sonarjs/no-duplicate-string |
Define a constant instead of duplicating this literal 3 times. |
Fix locally (fast - only checks files changed in this branch):
make ui-checkstyle-changed… mention hashes Two P1 review findings, both real. `if (after) setIsFirstLoad(false)` only avoided clearing the flag; it never set it back. Once pagination had cleared it, a first-page refetch -- closing a task, or any change to entity/domain -- left `isFirstLoad && loading` false while the provider had already emptied the list, so TaskListV1/ActivityFeedListV1New rendered the empty-state placeholder next to the pagination spinner. Use `setIsFirstLoad(!after)`, and move the reset into the fetch effect itself so it also covers the fqn and activeDomain deps rather than only sub-tab and filter. This is the same defect Gitar reported from the entityThread side; ActivityFeedTab is the only consumer that renders entityThread as a list, so it is fully covered. ListFilter now hashes via hashUserName, which quotes before hashing. Verified against live rows: a dotted user's FQN is stored quoted, and storeMentions writes md5 of the quoted single segment. Hashing the raw value matched the quoted FQN the UI sends but would split a bare `john.doe` into three FQN segments and match nothing; quoteName is idempotent for an already-quoted name, so quoting first accepts both. Also matches the sibling assignee condition. The loader unit test now paginates first, so it fails without the fix rather than starting from the already-true state. Added an IT assertion covering the quoted FQN form alongside the bare name. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Code Review ✅ Approved 1 resolved / 1 findingsFixes the Mentions sub-tab to correctly query tasks and resolves the backend 500 error by querying toFQN and fromFQNHash. Adds request sequencing and state resets to prevent stale task results. ✅ 1 resolved✅ Bug: getFeedData now clears entityThread/paging before response lands
OptionsDisplay: compact → Showing less information. Comment with these commands to change the behavior for this request:
Was this helpful? React with 👍 / 👎 | Powered by Gitar — free for open source |
|
✅ Playwright Results — workflow succeededValidated commit ✅ 1037 passed · ❌ 0 failed · 🟡 4 flaky · ⏭️ 0 skipped · 🧰 0 lifecycle flaky PerformanceBlocking targets: ✅ met · Optimization targets: 🟡 in progress Shard-job maxima below are not the full workflow wall time; the linked run includes build, fixture, planning, and reporting. 🕒 Full workflow signal wall (to summary) 48m 35s ⏱️ Max setup 4m 30s · max shard execution 21m 7s · max shard-job elapsed before upload 24m 18s · reporting 9s 🌐 192.39 requests/attempt · 2.58 app boots/UI scenario · 34.65% common-shard skew Optimization targets still in progress:
🟡 4 flaky test(s) (passed on retry)
How to debug locally# Download playwright-test-results-<shard> artifact and unzip
npx playwright show-trace path/to/trace.zip # view trace |



Describe your changes:
Fixes #31854
I made the Mentions sub-tab of the Tasks panel actually list the tasks you are mentioned in, because it was rendering the My Tasks list instead — and after a reload rendered the empty-state placeholder. The Mentions sub-tab has never displayed real data.
Two independent defects were stacked behind this.
1. The UI fetched into the wrong store.
ActivityFeedTab.component.tsxused two different predicates for which list renders and which fetcher runs:isTaskActiveTab || isMentionTabSelected→<TaskListV1 taskList={tasks} />isTaskActiveTabonlySo Mentions fell through to
getFeedData(...), which writesentityThread.taskswas never updated, leaving the previous My Tasks array on screen; after a reloadtasksstarts[], hence the placeholder. The provider already had the correct branch — it lives ingetTaskData(listTasks({ mentionedUser, aboutEntity })), which the tab simply never reached. Fixed by collapsing both branches onto oneisTaskListTabpredicate so they cannot drift apart again.2.
GET /v1/tasks?mentionedUser=returned 500. With the routing fixed, the correct request failed.ListFilter.getMentionedUserConditionbuiltSELECT fr.toId FROM field_relationship, but that table has notoIdcolumn —TaskRepository.storeMentionswrites the task id intotoFQN. EverymentionedUserquery threw, on MySQL (Unknown column 'fr.toId' in 'field list') and PostgreSQL (column fr.toid does not exist) alike. Fixed by selectingtoFQNand matching on the indexedfromFQNHash— the same hash@BindFQNwrites on insert.Three secondary defects are in scope because they are exactly what made the stale list visible, and would still show a wrong list or a misleading placeholder after fix (1):
tasks/entityThread/entityPagingwere only written after a response landed. A first-page fetch now clears the list it owns plus the sharedentityPagingcursor, and a shared request sequence stops a superseded response from committing rows, the cursor, or clearing the loader. The leftover cursor was letting infinite scroll append a new query's page onto the previous query's list — inTestCaseIncidentTabtoo, which sharesentityPaging.isFirstLoadnever reset on entity pages. The reset effect keyed off thesubTabprop, which entity tab utils never pass; the component reads the sub-tab from the URL param. A URL/back-button switch therefore showed the outgoing list with no loader.handleUpdateTaskFiltercalledgetTaskDataitself on top of the effect already refiring ontaskFilter.Plus two consumer guards for the new mid-fetch empty window:
TaskListV1's resize effect was collapsing the right panel on every switch, andTestCaseIncidentTabhardcodedisLoading={false}next to its own spinner, so it would have shown "no tasks assigned" and a spinner during an Open↔Closed fetch.getFeedData'sFeedFilter.MENTIONSsemantics are deliberately untouched — that path is live for conversation mentions in the notification bell (NotificationBox.component.tsx) and has a test asserting it stays ongetAllFeeds.Type of change:
High-level design:
The load-bearing idea is that "which list is on screen" and "which fetcher populates it" must be one value, not two.
isTaskListTab = isTaskActiveTab || isMentionTabSelectedis now that single predicate, used by the fetch effect, the infinite-scroll path, the render branch, the observer gate, the filter bar and the right panel. The original bug was precisely these two expressions drifting apart, so unifying them is the fix and the regression guard.For the stale-state half, the reset lives inside
getTaskData/getFeedDatawhenafteris undefined, rather than behind a newresetFeedDataaction on the context:after === undefinedmeans "first page of a new query", so replacing the result set is the fetcher's contract, not something each of the five call sites must remember to opt into.entityPagingis one piece of state consumed by two independent infinite-scroll effects (ActivityFeedTabandTestCaseIncidentTab), so clearing centrally fixes the stale-cursor append for both. A tab-scoped reset action would leave the incident tab broken.Clearing at fetch start is only safe if the loader is guaranteed on for that window, which is why the
isFirstLoadfix and theTaskListV1/TestCaseIncidentTabguards are part of the same change rather than optional extras — without them the blank window renders the empty placeholder, i.e. the exact symptom being fixed.Backend side, the alternative to hashing was leaving the predicate on the plain
fromFQNcolumn and only correctingtoId→toFQN. MatchingfromFQNHashinstead is both correct and index-covered (from_fqnhash_index(fromFQNHash, relation)), and it mirrors what@BindFQNwrote on insert, so there is no hashing-convention mismatch. No migration is needed — the schema was always right; only the query was wrong.Tests:
Use cases covered
GET /v1/tasks?mentionedUser=<me>&aboutEntity=<fqn>and lists only the tasks whose comments mention the logged-in user — not the My Tasks list./api/v1/tasksrequest.GET /v1/tasks?mentionedUser=returns 200 instead of 500, and a task is discoverable by mention as soon as a comment mentions the user.entityPagingconsumer).Unit tests
Files updated:
ActivityFeedTab.component.test.tsx— replaced theBug 1suite, which assertedgetFeedDatawas called withFeedFilter.MENTIONSand therefore codified the bug. New suites: mentions routes togetTaskDataandgetFeedDatais never called; the task list renders (not the feed list) with themessage.no-mentionsplaceholder; a first-page refetch keeps the in-list loader on; a URL-driven sub-tab change brings the loader back; exactly one fetch per filter change.ActivityFeedProvider.test.tsx+src/mocks/ActivityFeedProvider.mock.tsx— newDummyTaskListStateComponentfixture exposingtasksandentityPaging.after, and two tests: a new first-page fetch clears rows and the cursor before the response resolves, and a response resolving after a newer request started is ignored. The existingshould keep mentions on the feed API…test is intentionally left green.Verified fail-first (RED → GREEN), stashing only the source file:
With the fix, the regression sweep over every touched consumer is green:
Backend integration tests
openmetadata-integration-tests/for the changed query.TaskCommentsIT#test_listByMentionedUser_returnsTaskFromCommentMention— comments a<#E::user::…>mention onto one of two tasks, then asserts?mentionedUser=returns the mentioning task and excludes the other.Ingestion integration tests
Playwright (UI) tests
No new spec file — both changes land in specs that already own the fixtures.
playwright/e2e/Features/ActivityFeedTabBadge.spec.ts— newMentions sub-tab lists only the tasks the user is mentioned in. Reuses the describe'sTableClass/UserClass/performAdminLogin/waitForTaskListResponseand itsnavigateToTasksPanel/createOpenTaskhelpers, on its own table since chromium runs fullyParallel. Creates two tasks, mentions the admin on one viaPOST /api/v1/tasks/{id}/comments(mentions are only recorded from the comment path), then asserts 2 cards on My Tasks → 1 on Mentions → 2 back on My Tasks → 1 after a reload on the Mentions URL, with no empty-state placeholder.playwright/e2e/Features/Tasks/ActivityFeed.spec.ts—entity task filters should request open, closed, and mentions viewswaited on/api/v1/feed?filterType=MENTIONS. That request no longer fires, so the test would have hung; it now waits on/api/v1/taskswithmentionedUserset andaboutEntityequal to the table FQN, and targets the newmentions-toggletest id instead of a.task-filter-container+getByText(/mention/i)chain.Both specs green against a dev server on the fixed backend:
And the new E2E test is fail-first — stashing only
ActivityFeedTab.component.tsx:Manual testing performed
openmetadata-serviceand ran it against the local Docker stack; started the Vite dev server on:3000(:8585serves a prebuilt bundle and would not have exercised the change).GET /api/v1/tasks?mentionedUser=admin→ 500,Unknown column 'fr.toId' in 'field list'. Confirmed the corrected subquery against the live MySQLfield_relationship/task_entityrows, and thatstoreMentionswritesfromFQN=admin,fromFQNHash=21232f29…,toFQN=<task-uuid>,toType=task,relation=5. After the fix: 200, both mentioning tasks returned.GET /api/v1/tasks?…mentionedUser=admin&aboutEntity=<fqn>and no/api/v1/feed; the list switches to the mentioned task./api/v1/tasksrequest per click (was two)./users/<me>/tasks/mentions).entityPagingchange.UI screen recording / screenshots:
To follow — the behaviour is covered end-to-end by the new Playwright test above (
ActivityFeedTabBadge.spec.ts), including the reload case, which is the one the bug report calls out.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.
For JSON Schema changes: not applicable — no schema change. The
field_relationshipschema was always correct; only the query referenced a non-existent column, so no migration is needed.For UI changes: I attached a screen recording and/or screenshots above.
I have added tests (unit / integration / Playwright as applicable) and listed them above.
I have added a test that covers the exact scenario we are fixing. Issue Mentions sub-tab in the Tasks panel keeps showing the My Tasks list; GET /v1/tasks?mentionedUser= returns 500 #31854 is referenced in this PR; the covering tests are
ActivityFeedTabBadge.spec.ts→Mentions sub-tab lists only the tasks the user is mentioned in,ActivityFeedTab.component.test.tsx→Mentions sub-tab fetches tasks the user is mentioned in, andTaskCommentsIT#test_listByMentionedUser_returnsTaskFromCommentMention.🤖 Generated with Claude Code
Greptile Summary
The PR routes Mentions through the task API, corrects mention relationship filtering, and resets shared list state for replacing requests. One notification-driven refresh path still bypasses the corresponding first-page loader reset.
toFQNand normalized user-name hashes.Confidence Score: 4/5
The PR is not yet safe to merge because notification-driven task refreshes can still display a false empty state after pagination.
The provider now clears task rows at the start of every first-page request, but the
tasksRefreshKeyeffect starts such a request without restoring the first-load flag, so the task list suppresses its loading state and renders the empty placeholder until the response arrives.Files Needing Attention: openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx
Important Files Changed
Sequence Diagram
Comments Outside Diff (2)
openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx, line 455 (link)When a user paginates an entity's Tasks tab and then opens a task notification for the same entity, the
tasksRefreshKeyeffect starts a first-page request without restoringisFirstLoad. The provider clearstasks, butTaskListV1receivesisLoading={false}and displays the no-tasks placeholder until the response arrives.openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx, line 445-456 (link)When a user paginates an entity's Tasks tab and then opens a task notification for the same entity, the
tasksRefreshKeyeffect starts a first-page request without restoringisFirstLoad. The provider clearstasks, soTaskListV1receivesisLoading={false}and displays the no-tasks placeholder alongside the pagination spinner until the response arrives.Reviews (3): Last reviewed commit: "Merge branch 'main' into mentions-tab-st..." | Re-trigger Greptile