diff --git a/workspaces/announcements/.changeset/shy-hairs-knock.md b/workspaces/announcements/.changeset/shy-hairs-knock.md new file mode 100644 index 0000000000..0cebcb96a0 --- /dev/null +++ b/workspaces/announcements/.changeset/shy-hairs-knock.md @@ -0,0 +1,9 @@ +--- +'@backstage-community/plugin-announcements-backend': minor +'@backstage-community/plugin-announcements': minor +--- + +Fixed handling of `active` prop in NewAnnouncementBanner +Extended signal and notification on update when the annoucencement is activated +Updated `EditAnnoucementPage` to navigate to root path as the announcement creation page +Updated `EditAnnoucementPage` alertApi on success to be transient diff --git a/workspaces/announcements/plugins/announcements-backend/src/router.test.ts b/workspaces/announcements/plugins/announcements-backend/src/router.test.ts index a31d87b1dc..6153d3e6ac 100644 --- a/workspaces/announcements/plugins/announcements-backend/src/router.test.ts +++ b/workspaces/announcements/plugins/announcements-backend/src/router.test.ts @@ -109,7 +109,7 @@ describe('createRouter', () => { category: undefined, max: undefined, offset: undefined, - active: undefined, + active: false, sortBy: 'created_at', // Default sortBy order: 'desc', // Default order current: undefined, @@ -161,7 +161,7 @@ describe('createRouter', () => { category: undefined, max: undefined, offset: undefined, - active: undefined, + active: false, sortBy: 'created_at', order: 'asc', }); @@ -214,7 +214,7 @@ describe('createRouter', () => { category: undefined, max: undefined, offset: undefined, - active: undefined, + active: false, sortBy: 'created_at', order: 'desc', current: undefined, @@ -255,7 +255,7 @@ describe('createRouter', () => { category: undefined, max: undefined, offset: undefined, - active: undefined, + active: false, sortBy: 'created_at', order: 'desc', current: undefined, @@ -284,7 +284,7 @@ describe('createRouter', () => { category: undefined, max: undefined, offset: undefined, - active: undefined, + active: false, sortBy: 'created_at', order: 'desc', current: undefined, diff --git a/workspaces/announcements/plugins/announcements-backend/src/router.ts b/workspaces/announcements/plugins/announcements-backend/src/router.ts index 34695005f4..c59890e0a0 100644 --- a/workspaces/announcements/plugins/announcements-backend/src/router.ts +++ b/workspaces/announcements/plugins/announcements-backend/src/router.ts @@ -62,7 +62,7 @@ type GetAnnouncementsQueryParams = { category?: string; page?: number; max?: number; - active?: boolean; + active?: string; sortby?: 'created_at' | 'start_at'; order?: 'asc' | 'desc'; current?: boolean; @@ -133,7 +133,7 @@ export async function createRouter( category, max, offset: page ? (page - 1) * (max ?? 10) : undefined, - active, + active: active === 'true', sortBy: ['created_at', 'start_at'].includes(sortby) ? sortby : 'created_at', @@ -314,6 +314,15 @@ export async function createRouter( }); } + if (!initialAnnouncement.active && active) { + await signalAnnouncement(announcement, signals); + const announcementNotificationsEnabled = + req.body?.sendNotification === true; + if (announcementNotificationsEnabled) { + await sendAnnouncementNotification(announcement, notifications); + } + } + return res.status(200).json(announcement); }, ); diff --git a/workspaces/announcements/plugins/announcements/src/components/EditAnnouncementPage/EditAnnouncementPage.test.tsx b/workspaces/announcements/plugins/announcements/src/components/EditAnnouncementPage/EditAnnouncementPage.test.tsx index 72113a5976..287f2a8136 100644 --- a/workspaces/announcements/plugins/announcements/src/components/EditAnnouncementPage/EditAnnouncementPage.test.tsx +++ b/workspaces/announcements/plugins/announcements/src/components/EditAnnouncementPage/EditAnnouncementPage.test.tsx @@ -46,6 +46,12 @@ import { EditAnnouncementPage } from './EditAnnouncementPage'; jest.mock('../AnnouncementForm'); +const mockNavigate = jest.fn(); +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useNavigate: () => mockNavigate, +})); + jest.mock('@backstage-community/plugin-announcements-react', () => ({ ...jest.requireActual('@backstage-community/plugin-announcements-react'), useAnnouncementsTranslation: () => ({ t: (key: string) => key }), @@ -109,6 +115,7 @@ describe('EditAnnouncementPage', () => { beforeEach(() => { jest.restoreAllMocks(); jest.useRealTimers(); + mockNavigate.mockClear(); }); it('renders loading state', async () => { @@ -236,7 +243,10 @@ describe('EditAnnouncementPage', () => { expect(alertApiMock.post).toHaveBeenCalledWith({ message: 'editAnnouncementPage.updatedMessage', severity: 'success', + display: 'transient', }); + + expect(mockNavigate).toHaveBeenCalledWith('/announcements'); }); }); @@ -301,7 +311,10 @@ describe('EditAnnouncementPage', () => { expect(alertApiMock.post).toHaveBeenCalledWith({ message: 'editAnnouncementPage.updatedMessage', severity: 'success', + display: 'transient', }); + + expect(mockNavigate).toHaveBeenCalledWith('/announcements'); }); }); @@ -362,7 +375,10 @@ describe('EditAnnouncementPage', () => { message: 'editAnnouncementPageupdatedMessage editAnnouncementPage.updatedMessageWithNewCategory updated-category.', severity: 'success', + display: 'transient', }); + + expect(mockNavigate).toHaveBeenCalledWith('/announcements'); }); }); @@ -417,6 +433,8 @@ describe('EditAnnouncementPage', () => { }), ); }); + + expect(mockNavigate).not.toHaveBeenCalled(); }); }); }); diff --git a/workspaces/announcements/plugins/announcements/src/components/EditAnnouncementPage/EditAnnouncementPage.tsx b/workspaces/announcements/plugins/announcements/src/components/EditAnnouncementPage/EditAnnouncementPage.tsx index 3846704d8f..0bf7966eb8 100644 --- a/workspaces/announcements/plugins/announcements/src/components/EditAnnouncementPage/EditAnnouncementPage.tsx +++ b/workspaces/announcements/plugins/announcements/src/components/EditAnnouncementPage/EditAnnouncementPage.tsx @@ -20,6 +20,7 @@ import { Page, Header, Content, Progress } from '@backstage/core-components'; import { alertApiRef, useApi, + useRouteRef, useRouteRefParams, } from '@backstage/core-plugin-api'; import { AnnouncementForm } from '../AnnouncementForm'; @@ -31,6 +32,8 @@ import { useCategories, } from '@backstage-community/plugin-announcements-react'; import { Alert } from '@material-ui/lab'; +import { rootRouteRef } from '../../routes'; +import { useNavigate } from 'react-router-dom'; type EditAnnouncementPageProps = { themeId: string; @@ -47,6 +50,8 @@ export const EditAnnouncementPage = (props: EditAnnouncementPageProps) => { ); const { categories } = useCategories(); const { t } = useAnnouncementsTranslation(); + const navigate = useNavigate(); + const rootPage = useRouteRef(rootRouteRef); let title = props.title; let content: ReactNode = ; @@ -76,7 +81,12 @@ export const EditAnnouncementPage = (props: EditAnnouncementPageProps) => { } await announcementsApi.updateAnnouncement(id, request); - alertApi.post({ message: updateMsg, severity: 'success' }); + alertApi.post({ + message: updateMsg, + severity: 'success', + display: 'transient', + }); + navigate(rootPage()); } catch (err) { alertApi.post({ message: (err as Error).message, severity: 'error' }); } diff --git a/workspaces/announcements/plugins/announcements/src/components/NewAnnouncementBanner/NewAnnouncementBanner.tsx b/workspaces/announcements/plugins/announcements/src/components/NewAnnouncementBanner/NewAnnouncementBanner.tsx index 69a24b6867..af5e6afb8b 100644 --- a/workspaces/announcements/plugins/announcements/src/components/NewAnnouncementBanner/NewAnnouncementBanner.tsx +++ b/workspaces/announcements/plugins/announcements/src/components/NewAnnouncementBanner/NewAnnouncementBanner.tsx @@ -166,6 +166,7 @@ export const NewAnnouncementBanner = (props: NewAnnouncementBannerProps) => { active, current, }); + const lastSeen = announcementsApi.lastSeenDate(); const { lastSignal } = useSignal(