diff --git a/openmetadata-spec/src/main/antlr4/org/openmetadata/schema/EntityLink.g4 b/openmetadata-spec/src/main/antlr4/org/openmetadata/schema/EntityLink.g4 index 84913f63120..5dafdd49589 100644 --- a/openmetadata-spec/src/main/antlr4/org/openmetadata/schema/EntityLink.g4 +++ b/openmetadata-spec/src/main/antlr4/org/openmetadata/schema/EntityLink.g4 @@ -119,6 +119,7 @@ ENTITY_FIELD | 'sourceHash' | 'testCaseResult' | 'tests' + | 'pipelineStatus' ; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx index c64c9b1a6b5..c5dd9391e18 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProvider.tsx @@ -35,6 +35,7 @@ import { Post, TaskType, Thread, + ThreadTaskStatus, ThreadType, } from '../../../generated/entity/feed/thread'; import { EntityReference } from '../../../generated/entity/type'; @@ -164,7 +165,8 @@ const ActivityFeedProvider = ({ children, user }: Props) => { after?: string, type?: ThreadType, entityType?: EntityType, - fqn?: string + fqn?: string, + taskStatus?: ThreadTaskStatus ) => { try { setLoading(true); @@ -183,7 +185,7 @@ const ActivityFeedProvider = ({ children, user }: Props) => { after, type, feedFilterType, - undefined, + taskStatus, userId ); setEntityThread((prev) => (after ? [...prev, ...data] : [...data])); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProviderContext.interface.ts b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProviderContext.interface.ts index 098b2c79083..eb8cfeb43d2 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProviderContext.interface.ts +++ b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedProvider/ActivityFeedProviderContext.interface.ts @@ -18,6 +18,7 @@ import { Post, ReactionType, Thread, + ThreadTaskStatus, ThreadType, } from '../../../generated/entity/feed/thread'; import { EntityReference } from '../../../generated/entity/type'; @@ -53,7 +54,8 @@ export interface ActivityFeedProviderContextType { after?: string, type?: ThreadType, entityType?: EntityType, - fqn?: string + fqn?: string, + taskStatus?: ThreadTaskStatus ) => Promise; showDrawer: (thread: Thread) => void; hideDrawer: () => void; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx index 5d7fe7b3ae0..678915c6de8 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.component.tsx @@ -343,11 +343,12 @@ export const ActivityFeedTab = ({ - {getCountBadge( - count.conversationCount, - '', - activeTab === ActivityFeedTabs.ALL - )} + {!isUserEntity && + getCountBadge( + count.conversationCount, + '', + activeTab === ActivityFeedTabs.ALL + )} ), @@ -390,7 +391,7 @@ export const ActivityFeedTab = ({ {t('label.task-plural')} - {getCountBadge(count.totalTasksCount, '', isTaskActiveTab)} + {getCountBadge(count.openTaskCount, '', isTaskActiveTab)} ), diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Widgets/FeedsWidget/FeedsWidget.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Widgets/FeedsWidget/FeedsWidget.component.tsx index 4a0f9ad754f..7e1b67fc7ae 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Widgets/FeedsWidget/FeedsWidget.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Widgets/FeedsWidget/FeedsWidget.component.tsx @@ -12,6 +12,7 @@ */ import { CloseOutlined, DragOutlined } from '@ant-design/icons'; import { Button, Space, Tabs, Typography } from 'antd'; +import { AxiosError } from 'axios'; import { isUndefined } from 'lodash'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; @@ -21,6 +22,7 @@ import { useActivityFeedProvider } from '../../../components/ActivityFeed/Activi import { ActivityFeedTabs } from '../../../components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.interface'; import { useTourProvider } from '../../../components/TourProvider/TourProvider'; import { ROUTES } from '../../../constants/constants'; +import { FEED_COUNT_INITIAL_DATA } from '../../../constants/entity.constants'; import { mockFeedData } from '../../../constants/mockTourData.constants'; import { EntityTabs, EntityType } from '../../../enums/entity.enum'; import { FeedFilter } from '../../../enums/mydata.enum'; @@ -28,13 +30,15 @@ import { ThreadTaskStatus, ThreadType, } from '../../../generated/entity/feed/thread'; +import { FeedCounts } from '../../../interface/feed.interface'; import { WidgetCommonProps } from '../../../pages/CustomizablePage/CustomizablePage.interface'; -import { getFeedsWithFilter } from '../../../rest/feedsAPI'; +import { getFeedCount } from '../../../rest/feedsAPI'; import { getCountBadge, getEntityDetailLink, Transi18next, } from '../../../utils/CommonUtils'; +import { getEntityUserLink } from '../../../utils/EntityUtils'; import { showErrorToast } from '../../../utils/ToastUtils'; import { useAuthContext } from '../../Auth/AuthProviders/AuthProvider'; import FeedsFilterPopover from '../../common/FeedsFilterPopover/FeedsFilterPopover.component'; @@ -54,7 +58,7 @@ const FeedsWidget = ({ ); const { loading, entityThread, entityPaging, getFeedData } = useActivityFeedProvider(); - const [taskCount, setTaskCount] = useState(0); + const [count, setCount] = useState(FEED_COUNT_INITIAL_DATA); const [defaultFilter, setDefaultFilter] = useState( currentUser?.isAdmin ? FeedFilter.ALL : FeedFilter.OWNER_OR_FOLLOWS @@ -66,13 +70,36 @@ const FeedsWidget = ({ } else if (activeTab === ActivityFeedTabs.MENTIONS) { getFeedData(FeedFilter.MENTIONS); } else if (activeTab === ActivityFeedTabs.TASKS) { - getFeedData(FeedFilter.OWNER, undefined, ThreadType.Task); + getFeedData( + FeedFilter.OWNER, + undefined, + ThreadType.Task, + undefined, + undefined, + ThreadTaskStatus.Open + ); } }, [activeTab, defaultFilter]); - const countBadge = useMemo(() => { - return getCountBadge(taskCount, '', activeTab === 'tasks'); - }, [taskCount, activeTab]); + const mentionCountBadge = useMemo( + () => + getCountBadge( + count.mentionCount, + '', + activeTab === ActivityFeedTabs.MENTIONS + ), + [count.mentionCount, activeTab] + ); + + const taskCountBadge = useMemo( + () => + getCountBadge( + count.openTaskCount, + '', + activeTab === ActivityFeedTabs.TASKS + ), + [count.openTaskCount, activeTab] + ); const onTabChange = (key: string) => setActiveTab(key as ActivityFeedTabs); @@ -106,23 +133,27 @@ const FeedsWidget = ({ setDefaultFilter(filter); }; + const fetchFeedsCount = async () => { + try { + const res = await getFeedCount( + getEntityUserLink(currentUser?.name ?? '') + ); + setCount((prev) => ({ + ...prev, + openTaskCount: res?.[0]?.openTaskCount ?? 0, + + mentionCount: res?.[0]?.mentionCount ?? 0, + })); + } catch (err) { + showErrorToast(err as AxiosError, t('server.entity-feed-fetch-error')); + } + }; + useEffect(() => { setDefaultFilter( currentUser?.isAdmin ? FeedFilter.ALL : FeedFilter.OWNER_OR_FOLLOWS ); - getFeedsWithFilter( - currentUser?.id, - FeedFilter.OWNER, - undefined, - ThreadType.Task, - ThreadTaskStatus.Open - ) - .then((res) => { - setTaskCount(res.data.length); - }) - .catch((err) => { - showErrorToast(err); - }); + fetchFeedsCount(); }, [currentUser]); const threads = useMemo(() => { @@ -177,7 +208,12 @@ const FeedsWidget = ({ ), }, { - label: `@${t('label.mention-plural')}`, + label: ( + <> + {`@${t('label.mention-plural')}`} + {mentionCountBadge} + + ), key: ActivityFeedTabs.MENTIONS, children: ( <> @@ -196,7 +232,7 @@ const FeedsWidget = ({ label: ( <> {`${t('label.task-plural')} `} - {countBadge} + {taskCountBadge} ), key: ActivityFeedTabs.TASKS, diff --git a/openmetadata-ui/src/main/resources/ui/src/styles/app.less b/openmetadata-ui/src/main/resources/ui/src/styles/app.less index 2e667bdda50..18bad6b8967 100644 --- a/openmetadata-ui/src/main/resources/ui/src/styles/app.less +++ b/openmetadata-ui/src/main/resources/ui/src/styles/app.less @@ -81,7 +81,7 @@ p { } .page-container { - padding: 0 24px; + padding: 0 24px 16px 24px; } a,