@backstage-community/plugin-announcements 2.7.0 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# @backstage-community/plugin-announcements
|
|
2
2
|
|
|
3
|
+
## 2.8.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- daaeefa: Migrated `AnnouncementsCard` component to Backstage UI.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- ebf4891: Updated dependency `slugify` to `1.6.9`.
|
|
12
|
+
|
|
3
13
|
## 2.7.0
|
|
4
14
|
|
|
5
15
|
### Minor Changes
|
|
@@ -1,23 +1,13 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { DateTime } from 'luxon';
|
|
3
|
-
import { Progress, InfoCard
|
|
3
|
+
import { Progress, InfoCard } from '@backstage/core-components';
|
|
4
4
|
import { useApi, useRouteRef, useAnalytics } from '@backstage/core-plugin-api';
|
|
5
5
|
import { rootRouteRef, announcementViewRouteRef, announcementAdminRouteRef } from '../../routes.esm.js';
|
|
6
6
|
import { formatAnnouncementStartTime } from '../utils/announcementDateUtils.esm.js';
|
|
7
7
|
import { announcementsApiRef, useAnnouncementsTranslation, useAnnouncements, useAnnouncementsPermissions } from '@backstage-community/plugin-announcements-react';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import NewReleasesIcon from '@material-ui/icons/NewReleases';
|
|
8
|
+
import { Alert, List, Text, Link, ListRow, Box, Flex, TagGroup, Tag } from '@backstage/ui';
|
|
9
|
+
import { RiMegaphoneLine } from '@remixicon/react';
|
|
11
10
|
|
|
12
|
-
const useStyles = makeStyles({
|
|
13
|
-
newAnnouncementIcon: {
|
|
14
|
-
minWidth: "36px"
|
|
15
|
-
},
|
|
16
|
-
chipStyle: {
|
|
17
|
-
marginRight: 4,
|
|
18
|
-
marginBottom: 4
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
11
|
const AnnouncementsCard = ({
|
|
22
12
|
title,
|
|
23
13
|
max,
|
|
@@ -29,7 +19,6 @@ const AnnouncementsCard = ({
|
|
|
29
19
|
current,
|
|
30
20
|
hideStartAt
|
|
31
21
|
}) => {
|
|
32
|
-
const classes = useStyles();
|
|
33
22
|
const announcementsApi = useApi(announcementsApiRef);
|
|
34
23
|
const announcementsLink = useRouteRef(rootRouteRef);
|
|
35
24
|
const viewAnnouncementLink = useRouteRef(announcementViewRouteRef);
|
|
@@ -49,7 +38,7 @@ const AnnouncementsCard = ({
|
|
|
49
38
|
if (loading) {
|
|
50
39
|
return /* @__PURE__ */ jsx(Progress, {});
|
|
51
40
|
} else if (error) {
|
|
52
|
-
return /* @__PURE__ */ jsx(Alert, {
|
|
41
|
+
return /* @__PURE__ */ jsx(Alert, { status: "danger", title: error.message });
|
|
53
42
|
}
|
|
54
43
|
const deepLink = {
|
|
55
44
|
link: announcementsLink(),
|
|
@@ -61,67 +50,69 @@ const AnnouncementsCard = ({
|
|
|
61
50
|
title: title || t("announcementsCard.announcements"),
|
|
62
51
|
variant,
|
|
63
52
|
deepLink,
|
|
64
|
-
children: /* @__PURE__ */
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
),
|
|
77
|
-
/* @__PURE__ */ jsx(
|
|
78
|
-
ListItemText,
|
|
53
|
+
children: /* @__PURE__ */ jsx(
|
|
54
|
+
List,
|
|
55
|
+
{
|
|
56
|
+
"aria-label": title || t("announcementsCard.announcements"),
|
|
57
|
+
items: announcements.results,
|
|
58
|
+
renderEmptyState: !permissions.create.loading && permissions.create.allowed ? () => /* @__PURE__ */ jsxs(Text, { as: "span", children: [
|
|
59
|
+
`${t("announcementsCard.noAnnouncements")} `,
|
|
60
|
+
/* @__PURE__ */ jsx(Link, { href: announcementAdminLink(), children: t("announcementsCard.addOne") }),
|
|
61
|
+
"?"
|
|
62
|
+
] }) : void 0,
|
|
63
|
+
children: (announcement) => /* @__PURE__ */ jsx(
|
|
64
|
+
ListRow,
|
|
79
65
|
{
|
|
80
|
-
|
|
81
|
-
|
|
66
|
+
id: announcement.id,
|
|
67
|
+
textValue: announcement.title,
|
|
68
|
+
icon: /* @__PURE__ */ jsx(
|
|
69
|
+
Box,
|
|
82
70
|
{
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
location: "AnnouncementsCard"
|
|
89
|
-
}
|
|
90
|
-
}),
|
|
91
|
-
children: announcement.title
|
|
71
|
+
style: {
|
|
72
|
+
visibility: lastSeen < DateTime.fromISO(announcement.created_at) ? "visible" : "hidden"
|
|
73
|
+
},
|
|
74
|
+
title: t("announcementsCard.new"),
|
|
75
|
+
children: /* @__PURE__ */ jsx(RiMegaphoneLine, { size: 20 })
|
|
92
76
|
}
|
|
93
77
|
),
|
|
94
|
-
|
|
95
|
-
/* @__PURE__ */
|
|
78
|
+
children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "1", children: [
|
|
79
|
+
/* @__PURE__ */ jsx(
|
|
80
|
+
Link,
|
|
81
|
+
{
|
|
82
|
+
href: viewAnnouncementLink({ id: announcement.id }),
|
|
83
|
+
onClick: () => analytics.captureEvent("click", announcement.title, {
|
|
84
|
+
attributes: {
|
|
85
|
+
announcementId: announcement.id,
|
|
86
|
+
location: "AnnouncementsCard"
|
|
87
|
+
}
|
|
88
|
+
}),
|
|
89
|
+
children: announcement.title
|
|
90
|
+
}
|
|
91
|
+
),
|
|
92
|
+
/* @__PURE__ */ jsxs(Text, { variant: "body-small", color: "secondary", as: "span", children: [
|
|
96
93
|
DateTime.fromISO(announcement.created_at).toRelative(),
|
|
97
94
|
announcement.category && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
98
95
|
` ${t("announcementsCard.in")} `,
|
|
99
96
|
/* @__PURE__ */ jsx(
|
|
100
97
|
Link,
|
|
101
98
|
{
|
|
102
|
-
|
|
103
|
-
variant: "inherit",
|
|
99
|
+
href: `${announcementsLink()}?category=${announcement.category.slug}`,
|
|
104
100
|
children: announcement.category.title
|
|
105
101
|
}
|
|
106
102
|
)
|
|
107
103
|
] })
|
|
108
104
|
] }),
|
|
109
|
-
/* @__PURE__ */
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
},
|
|
121
|
-
tag.slug
|
|
122
|
-
)) })
|
|
123
|
-
] }),
|
|
124
|
-
!hideStartAt && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "textSecondary", children: formatAnnouncementStartTime(
|
|
105
|
+
/* @__PURE__ */ jsx(Text, { variant: "body-small", color: "secondary", children: announcement.excerpt }),
|
|
106
|
+
announcement.tags && announcement.tags.length > 0 && /* @__PURE__ */ jsx(Box, { mt: "2", children: /* @__PURE__ */ jsx(TagGroup, { children: announcement.tags.map((tag) => /* @__PURE__ */ jsx(
|
|
107
|
+
Tag,
|
|
108
|
+
{
|
|
109
|
+
size: "small",
|
|
110
|
+
href: `${announcementsLink()}?tags=${tag.slug}`,
|
|
111
|
+
children: tag.title
|
|
112
|
+
},
|
|
113
|
+
tag.slug
|
|
114
|
+
)) }) }),
|
|
115
|
+
!hideStartAt && /* @__PURE__ */ jsx(Text, { variant: "body-x-small", color: "secondary", children: formatAnnouncementStartTime(
|
|
125
116
|
announcement.start_at,
|
|
126
117
|
t("announcementsCard.occurred"),
|
|
127
118
|
t("announcementsCard.scheduled"),
|
|
@@ -129,15 +120,9 @@ const AnnouncementsCard = ({
|
|
|
129
120
|
) })
|
|
130
121
|
] })
|
|
131
122
|
}
|
|
132
|
-
)
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
announcements.count === 0 && !permissions.create.loading && permissions.create.allowed && /* @__PURE__ */ jsx(ListItem, { children: /* @__PURE__ */ jsxs(ListItemText, { children: [
|
|
136
|
-
`${t("announcementsCard.noAnnouncements")} `,
|
|
137
|
-
/* @__PURE__ */ jsx(Link, { to: announcementAdminLink(), variant: "inherit", children: t("announcementsCard.addOne") }),
|
|
138
|
-
"?"
|
|
139
|
-
] }) })
|
|
140
|
-
] })
|
|
123
|
+
)
|
|
124
|
+
}
|
|
125
|
+
)
|
|
141
126
|
}
|
|
142
127
|
);
|
|
143
128
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnnouncementsCard.esm.js","sources":["../../../src/components/AnnouncementsCard/AnnouncementsCard.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { DateTime } from 'luxon';\nimport {\n InfoCard,\n InfoCardVariants,\n Link,\n Progress,\n} from '@backstage/core-components';\nimport { useApi, useRouteRef, useAnalytics } from '@backstage/core-plugin-api';\nimport {\n announcementAdminRouteRef,\n announcementViewRouteRef,\n rootRouteRef,\n} from '../../routes';\nimport { formatAnnouncementStartTime } from '../utils/announcementDateUtils';\nimport {\n announcementsApiRef,\n useAnnouncements,\n useAnnouncementsTranslation,\n useAnnouncementsPermissions,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n makeStyles,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Typography,\n Box,\n Chip,\n} from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport NewReleasesIcon from '@material-ui/icons/NewReleases';\n\nconst useStyles = makeStyles({\n newAnnouncementIcon: {\n minWidth: '36px',\n },\n chipStyle: {\n marginRight: 4,\n marginBottom: 4,\n },\n});\n\ntype AnnouncementsCardOpts = {\n title?: string;\n max?: number;\n category?: string;\n active?: boolean;\n variant?: InfoCardVariants;\n sortBy?: 'created_at' | 'start_at';\n order?: 'asc' | 'desc';\n current?: boolean;\n hideStartAt?: boolean;\n};\n\nexport const AnnouncementsCard = ({\n title,\n max,\n category,\n active,\n variant = 'gridItem',\n sortBy,\n order,\n current,\n hideStartAt,\n}: AnnouncementsCardOpts) => {\n const classes = useStyles();\n const announcementsApi = useApi(announcementsApiRef);\n const announcementsLink = useRouteRef(rootRouteRef);\n const viewAnnouncementLink = useRouteRef(announcementViewRouteRef);\n const announcementAdminLink = useRouteRef(announcementAdminRouteRef);\n const lastSeen = announcementsApi.lastSeenDate();\n const analytics = useAnalytics();\n const { t } = useAnnouncementsTranslation();\n\n const { announcements, loading, error } = useAnnouncements({\n max: max || 5,\n category,\n active,\n sortBy,\n order,\n current,\n });\n\n const permissions = useAnnouncementsPermissions();\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n }\n\n const deepLink = {\n link: announcementsLink(),\n title: t('announcementsCard.seeAll'),\n };\n\n return (\n <InfoCard\n title={title || t('announcementsCard.announcements')}\n variant={variant}\n deepLink={deepLink}\n >\n <List dense>\n {announcements.results.map(announcement => (\n <ListItem key={announcement.id}>\n <ListItemIcon\n className={classes.newAnnouncementIcon}\n style={{\n visibility:\n lastSeen < DateTime.fromISO(announcement.created_at)\n ? 'visible'\n : 'hidden',\n }}\n title={t('announcementsCard.new')}\n >\n <NewReleasesIcon />\n </ListItemIcon>\n <ListItemText\n primary={\n <Link\n to={viewAnnouncementLink({ id: announcement.id })}\n variant=\"inherit\"\n onClick={() =>\n analytics.captureEvent('click', announcement.title, {\n attributes: {\n announcementId: announcement.id,\n location: 'AnnouncementsCard',\n },\n })\n }\n >\n {announcement.title}\n </Link>\n }\n secondary={\n <Box>\n <Typography variant=\"body2\" color=\"textSecondary\">\n {DateTime.fromISO(announcement.created_at).toRelative()}\n {announcement.category && (\n <>\n {` ${t('announcementsCard.in')} `}\n <Link\n to={`${announcementsLink()}?category=${\n announcement.category.slug\n }`}\n variant=\"inherit\"\n >\n {announcement.category.title}\n </Link>\n </>\n )}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n {announcement.excerpt}\n {announcement.tags && announcement.tags.length > 0 && (\n <Box mt={1}>\n {announcement.tags.map(tag => (\n <Chip\n key={tag.slug}\n size=\"small\"\n label={tag.title}\n component={Link}\n to={`${announcementsLink()}?tags=${tag.slug}`}\n clickable\n className={classes.chipStyle}\n />\n ))}\n </Box>\n )}\n </Typography>\n {!hideStartAt && (\n <Typography variant=\"caption\" color=\"textSecondary\">\n {formatAnnouncementStartTime(\n announcement.start_at,\n t('announcementsCard.occurred'),\n t('announcementsCard.scheduled'),\n t('announcementsCard.today'),\n )}\n </Typography>\n )}\n </Box>\n }\n />{' '}\n </ListItem>\n ))}\n {announcements.count === 0 &&\n !permissions.create.loading &&\n permissions.create.allowed && (\n <ListItem>\n <ListItemText>\n {`${t('announcementsCard.noAnnouncements')} `}\n <Link to={announcementAdminLink()} variant=\"inherit\">\n {t('announcementsCard.addOne')}\n </Link>\n ?\n </ListItemText>\n </ListItem>\n )}\n </List>\n </InfoCard>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AnnouncementsCard.esm.js","sources":["../../../src/components/AnnouncementsCard/AnnouncementsCard.tsx"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { DateTime } from 'luxon';\nimport {\n InfoCard,\n InfoCardVariants,\n Progress,\n} from '@backstage/core-components';\nimport { useApi, useRouteRef, useAnalytics } from '@backstage/core-plugin-api';\nimport {\n announcementAdminRouteRef,\n announcementViewRouteRef,\n rootRouteRef,\n} from '../../routes';\nimport { formatAnnouncementStartTime } from '../utils/announcementDateUtils';\nimport {\n announcementsApiRef,\n useAnnouncements,\n useAnnouncementsTranslation,\n useAnnouncementsPermissions,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n Alert,\n Box,\n Flex,\n Link,\n List,\n ListRow,\n Tag,\n TagGroup,\n Text,\n} from '@backstage/ui';\nimport { RiMegaphoneLine } from '@remixicon/react';\n\ntype AnnouncementsCardOpts = {\n title?: string;\n max?: number;\n category?: string;\n active?: boolean;\n variant?: InfoCardVariants;\n sortBy?: 'created_at' | 'start_at';\n order?: 'asc' | 'desc';\n current?: boolean;\n hideStartAt?: boolean;\n};\n\nexport const AnnouncementsCard = ({\n title,\n max,\n category,\n active,\n variant = 'gridItem',\n sortBy,\n order,\n current,\n hideStartAt,\n}: AnnouncementsCardOpts) => {\n const announcementsApi = useApi(announcementsApiRef);\n const announcementsLink = useRouteRef(rootRouteRef);\n const viewAnnouncementLink = useRouteRef(announcementViewRouteRef);\n const announcementAdminLink = useRouteRef(announcementAdminRouteRef);\n const lastSeen = announcementsApi.lastSeenDate();\n const analytics = useAnalytics();\n const { t } = useAnnouncementsTranslation();\n\n const { announcements, loading, error } = useAnnouncements({\n max: max || 5,\n category,\n active,\n sortBy,\n order,\n current,\n });\n\n const permissions = useAnnouncementsPermissions();\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <Alert status=\"danger\" title={error.message} />;\n }\n\n const deepLink = {\n link: announcementsLink(),\n title: t('announcementsCard.seeAll'),\n };\n\n return (\n <InfoCard\n title={title || t('announcementsCard.announcements')}\n variant={variant}\n deepLink={deepLink}\n >\n <List\n aria-label={title || t('announcementsCard.announcements')}\n items={announcements.results}\n renderEmptyState={\n !permissions.create.loading && permissions.create.allowed\n ? () => (\n <Text as=\"span\">\n {`${t('announcementsCard.noAnnouncements')} `}\n <Link href={announcementAdminLink()}>\n {t('announcementsCard.addOne')}\n </Link>\n ?\n </Text>\n )\n : undefined\n }\n >\n {announcement => (\n <ListRow\n id={announcement.id}\n textValue={announcement.title}\n icon={\n <Box\n style={{\n visibility:\n lastSeen < DateTime.fromISO(announcement.created_at)\n ? 'visible'\n : 'hidden',\n }}\n title={t('announcementsCard.new')}\n >\n <RiMegaphoneLine size={20} />\n </Box>\n }\n >\n <Flex direction=\"column\" gap=\"1\">\n <Link\n href={viewAnnouncementLink({ id: announcement.id })}\n onClick={() =>\n analytics.captureEvent('click', announcement.title, {\n attributes: {\n announcementId: announcement.id,\n location: 'AnnouncementsCard',\n },\n })\n }\n >\n {announcement.title}\n </Link>\n\n <Text variant=\"body-small\" color=\"secondary\" as=\"span\">\n {DateTime.fromISO(announcement.created_at).toRelative()}\n {announcement.category && (\n <>\n {` ${t('announcementsCard.in')} `}\n <Link\n href={`${announcementsLink()}?category=${\n announcement.category.slug\n }`}\n >\n {announcement.category.title}\n </Link>\n </>\n )}\n </Text>\n\n <Text variant=\"body-small\" color=\"secondary\">\n {announcement.excerpt}\n </Text>\n\n {announcement.tags && announcement.tags.length > 0 && (\n <Box mt=\"2\">\n <TagGroup>\n {announcement.tags.map(tag => (\n <Tag\n key={tag.slug}\n size=\"small\"\n href={`${announcementsLink()}?tags=${tag.slug}`}\n >\n {tag.title}\n </Tag>\n ))}\n </TagGroup>\n </Box>\n )}\n\n {!hideStartAt && (\n <Text variant=\"body-x-small\" color=\"secondary\">\n {formatAnnouncementStartTime(\n announcement.start_at,\n t('announcementsCard.occurred'),\n t('announcementsCard.scheduled'),\n t('announcementsCard.today'),\n )}\n </Text>\n )}\n </Flex>\n </ListRow>\n )}\n </List>\n </InfoCard>\n );\n};\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage-community/plugin-announcements",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.0",
|
|
4
4
|
"main": "./dist/index.esm.js",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
"@uiw/react-md-editor": "^4.0.11",
|
|
86
86
|
"luxon": "^3.2.0",
|
|
87
87
|
"react-use": "^17.2.4",
|
|
88
|
-
"slugify": "1.6.
|
|
88
|
+
"slugify": "1.6.9"
|
|
89
89
|
},
|
|
90
90
|
"peerDependencies": {
|
|
91
91
|
"react": "^17.0.0 || ^18.0.0",
|