diff --git a/openmetadata-ui/src/main/resources/ui/src/axiosAPIs/feedsAPI.ts b/openmetadata-ui/src/main/resources/ui/src/axiosAPIs/feedsAPI.ts index 05301e7e9fc..edef054e304 100644 --- a/openmetadata-ui/src/main/resources/ui/src/axiosAPIs/feedsAPI.ts +++ b/openmetadata-ui/src/main/resources/ui/src/axiosAPIs/feedsAPI.ts @@ -172,13 +172,16 @@ export const updateTask: Function = ( }; export const getActiveAnnouncement = async (entityLink: string) => { - const response = await APIClient.get('/feed', { - params: { - entityLink, - type: ThreadType.Announcement, - activeAnnouncement: true, - }, - }); + const response = await APIClient.get<{ data: Thread[]; paging: Paging }>( + '/feed', + { + params: { + entityLink, + type: ThreadType.Announcement, + activeAnnouncement: true, + }, + } + ); return response.data; }; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/ActivityFeedPanel.interface.ts b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/ActivityFeedPanel.interface.ts index 7803dd84754..b9a69602d0f 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/ActivityFeedPanel.interface.ts +++ b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/ActivityFeedPanel.interface.ts @@ -12,6 +12,7 @@ */ import { HTMLAttributes } from 'react'; +import { ThreadType } from '../../../generated/api/feed/createThread'; import { Thread } from '../../../generated/entity/feed/thread'; import { ThreadUpdatedFunc } from '../../../interface/feed.interface'; import { ConfirmState } from '../ActivityFeedCard/ActivityFeedCard.interface'; @@ -29,7 +30,9 @@ export interface FeedPanelHeaderProp extends HTMLAttributes, Pick { entityField: string; + entityFQN?: string; noun?: string; + threadType?: ThreadType; onShowNewConversation?: (v: boolean) => void; } export interface FeedPanelOverlayProp diff --git a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/ActivityFeedPanel.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/ActivityFeedPanel.test.tsx index 528148f896a..b1a112bceed 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/ActivityFeedPanel.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/ActivityFeedPanel.test.tsx @@ -57,6 +57,7 @@ const mockFeedPanelProp = { jest.mock('../../../utils/FeedUtils', () => ({ getEntityField: jest.fn(), + getEntityFQN: jest.fn(), })); jest.mock('../ActivityFeedEditor/ActivityFeedEditor', () => { diff --git a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/ActivityFeedPanel.tsx b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/ActivityFeedPanel.tsx index 1541831a81d..b7a896296f2 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/ActivityFeedPanel.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/ActivityFeedPanel.tsx @@ -18,7 +18,7 @@ import { getFeedById } from '../../../axiosAPIs/feedsAPI'; import { confirmStateInitialValue } from '../../../constants/feed.constants'; import { Thread } from '../../../generated/entity/feed/thread'; import jsonData from '../../../jsons/en'; -import { getEntityField } from '../../../utils/FeedUtils'; +import { getEntityField, getEntityFQN } from '../../../utils/FeedUtils'; import { showErrorToast } from '../../../utils/ToastUtils'; import { ConfirmState } from '../ActivityFeedCard/ActivityFeedCard.interface'; import ActivityFeedEditor from '../ActivityFeedEditor/ActivityFeedEditor'; @@ -40,6 +40,7 @@ const ActivityFeedPanel: FC = ({ const [threadData, setThreadData] = useState(selectedThread); const [isLoading, setIsLoading] = useState(false); const entityField = getEntityField(selectedThread.about); + const entityFQN = getEntityFQN(selectedThread.about); const [confirmationState, setConfirmationState] = useState( confirmStateInitialValue @@ -88,7 +89,9 @@ const ActivityFeedPanel: FC = ({ id="feed-panel"> diff --git a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/FeedPanelHeader.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/FeedPanelHeader.test.tsx index 8ff9ed92c8d..3f9caa43b2b 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/FeedPanelHeader.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/FeedPanelHeader.test.tsx @@ -14,6 +14,7 @@ import { findByTestId, queryByTestId, render } from '@testing-library/react'; import React from 'react'; import { MemoryRouter } from 'react-router-dom'; +import { ThreadType } from '../../../generated/entity/feed/thread'; import FeedPanelHeader from './FeedPanelHeader'; const mockFeedPanelHeaderProp = { @@ -85,4 +86,40 @@ describe('Test FeedPanelHeader Component', () => { // noun is undefined so default noun should be present in text content expect(noun).toHaveTextContent('Conversation on'); }); + + it('Should render entityFQN if entityField is empty', async () => { + const { container } = render( + , + { + wrapper: MemoryRouter, + } + ); + + const entityAttribute = await findByTestId(container, 'entity-attribute'); + + expect(entityAttribute).toHaveTextContent(/x.y.z/i); + }); + + it('Should render noun according to the threadtype', async () => { + const { container } = render( + , + { + wrapper: MemoryRouter, + } + ); + + const noun = await findByTestId(container, 'header-noun'); + + expect(noun).toHaveTextContent(/Announcement on/i); + }); }); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/FeedPanelHeader.tsx b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/FeedPanelHeader.tsx index d608bec4231..fede2e998eb 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/FeedPanelHeader.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/ActivityFeed/ActivityFeedPanel/FeedPanelHeader.tsx @@ -14,7 +14,10 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import classNames from 'classnames'; import React, { FC } from 'react'; -import { getEntityFieldDisplay } from '../../../utils/FeedUtils'; +import { + getEntityFieldDisplay, + getFeedPanelHeaderText, +} from '../../../utils/FeedUtils'; import { Button } from '../../buttons/Button/Button'; import PopOver from '../../common/popover/PopOver'; import { FeedPanelHeaderProp } from './ActivityFeedPanel.interface'; @@ -24,16 +27,18 @@ const FeedPanelHeader: FC = ({ className, noun, onShowNewConversation, + threadType, + entityFQN = '', }) => { return (

- {noun ? noun : 'Conversation'} on{' '} + {noun ? noun : getFeedPanelHeaderText(threadType)} on{' '} - - {getEntityFieldDisplay(entityField)} + + {entityField ? getEntityFieldDisplay(entityField) : entityFQN}

diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/entityPageInfo/AnnouncementDrawer/AnnouncementDrawer.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/entityPageInfo/AnnouncementDrawer/AnnouncementDrawer.tsx index 7f92f4ff559..22e5a48509c 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/entityPageInfo/AnnouncementDrawer/AnnouncementDrawer.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/entityPageInfo/AnnouncementDrawer/AnnouncementDrawer.tsx @@ -15,6 +15,7 @@ import { CloseOutlined } from '@ant-design/icons'; import { Button, Drawer, Space, Typography } from 'antd'; import { AxiosError } from 'axios'; import { Operation } from 'fast-json-patch'; +import { uniqueId } from 'lodash'; import { observer } from 'mobx-react'; import React, { FC, useMemo, useState } from 'react'; import AppState from '../../../../AppState'; @@ -123,6 +124,7 @@ const AnnouncementDrawer: FC = ({ className="tw-p-0" createThread={createThread} deletePostHandler={deletePostHandler} + key={uniqueId()} postFeedHandler={postFeedHandler} showHeader={false} threadLink={getEntityFeedLink(entityType, entityFQN)} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/entityPageInfo/EntityPageInfo.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/entityPageInfo/EntityPageInfo.tsx index 915de685225..4ae09017aef 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/entityPageInfo/EntityPageInfo.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/entityPageInfo/EntityPageInfo.tsx @@ -377,8 +377,8 @@ const EntityPageInfo = ({ getEntityFeedLink(entityType, entityFqn) ); - if (!isEmpty(announcements)) { - setActiveAnnouncement(announcements[0]); + if (!isEmpty(announcements.data)) { + setActiveAnnouncement(announcements.data[0]); } } catch (error) { showErrorToast(error as AxiosError); diff --git a/openmetadata-ui/src/main/resources/ui/src/utils/FeedUtils.tsx b/openmetadata-ui/src/main/resources/ui/src/utils/FeedUtils.tsx index 8735ccb0775..03c59e43cb6 100644 --- a/openmetadata-ui/src/main/resources/ui/src/utils/FeedUtils.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/utils/FeedUtils.tsx @@ -506,3 +506,17 @@ export const entityDisplayName = (entityType: string, entityFQN: string) => { export const MarkdownToHTMLConverter = new Showdown.Converter({ strikethrough: true, }); + +export const getFeedPanelHeaderText = ( + threadType: ThreadType = ThreadType.Conversation +) => { + switch (threadType) { + case ThreadType.Announcement: + return 'Announcement'; + case ThreadType.Task: + return 'Task'; + case ThreadType.Conversation: + default: + return 'Conversation'; + } +};