@backstage-community/plugin-announcements 0.5.7 → 0.5.8

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.
Files changed (47) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/alpha/entityCards.esm.js +2 -2
  3. package/dist/alpha/entityCards.esm.js.map +1 -1
  4. package/dist/alpha/pages.esm.js +2 -2
  5. package/dist/alpha/pages.esm.js.map +1 -1
  6. package/dist/components/Admin/AdminPortal/AdminPortal.esm.js +32 -21
  7. package/dist/components/Admin/AdminPortal/AdminPortal.esm.js.map +1 -1
  8. package/dist/components/Admin/AnnouncementsContent/AnnouncementsContent.esm.js +79 -67
  9. package/dist/components/Admin/AnnouncementsContent/AnnouncementsContent.esm.js.map +1 -1
  10. package/dist/components/Admin/CategoriesContent/CategoriesContent.esm.js +41 -35
  11. package/dist/components/Admin/CategoriesContent/CategoriesContent.esm.js.map +1 -1
  12. package/dist/components/AnnouncementForm/AnnouncementForm.esm.js +93 -78
  13. package/dist/components/AnnouncementForm/AnnouncementForm.esm.js.map +1 -1
  14. package/dist/components/AnnouncementForm/CategoryInput.esm.js +8 -5
  15. package/dist/components/AnnouncementForm/CategoryInput.esm.js.map +1 -1
  16. package/dist/components/AnnouncementPage/AnnouncementPage.esm.js +19 -10
  17. package/dist/components/AnnouncementPage/AnnouncementPage.esm.js.map +1 -1
  18. package/dist/components/AnnouncementSearchResultListItem/AnnouncementSearchResultListItem.esm.js +29 -20
  19. package/dist/components/AnnouncementSearchResultListItem/AnnouncementSearchResultListItem.esm.js.map +1 -1
  20. package/dist/components/AnnouncementsCard/AnnouncementsCard.esm.js +55 -34
  21. package/dist/components/AnnouncementsCard/AnnouncementsCard.esm.js.map +1 -1
  22. package/dist/components/AnnouncementsPage/AnnouncementsPage.esm.js +140 -100
  23. package/dist/components/AnnouncementsPage/AnnouncementsPage.esm.js.map +1 -1
  24. package/dist/components/AnnouncementsPage/ContextMenu.esm.js +40 -27
  25. package/dist/components/AnnouncementsPage/ContextMenu.esm.js.map +1 -1
  26. package/dist/components/AnnouncementsPage/DeleteAnnouncementDialog.esm.js +16 -10
  27. package/dist/components/AnnouncementsPage/DeleteAnnouncementDialog.esm.js.map +1 -1
  28. package/dist/components/AnnouncementsTimeline/AnnouncementsTimeline.esm.js +26 -15
  29. package/dist/components/AnnouncementsTimeline/AnnouncementsTimeline.esm.js.map +1 -1
  30. package/dist/components/CategoriesForm/CategoriesForm.esm.js +30 -26
  31. package/dist/components/CategoriesForm/CategoriesForm.esm.js.map +1 -1
  32. package/dist/components/CategoriesPage/CategoriesPage.esm.js +50 -42
  33. package/dist/components/CategoriesPage/CategoriesPage.esm.js.map +1 -1
  34. package/dist/components/CategoriesPage/DeleteCategoryDialog.esm.js +8 -2
  35. package/dist/components/CategoriesPage/DeleteCategoryDialog.esm.js.map +1 -1
  36. package/dist/components/CreateAnnouncementPage/CreateAnnouncementPage.esm.js +11 -8
  37. package/dist/components/CreateAnnouncementPage/CreateAnnouncementPage.esm.js.map +1 -1
  38. package/dist/components/EditAnnouncementPage/EditAnnouncementPage.esm.js +10 -7
  39. package/dist/components/EditAnnouncementPage/EditAnnouncementPage.esm.js.map +1 -1
  40. package/dist/components/NewAnnouncementBanner/NewAnnouncementBanner.esm.js +35 -29
  41. package/dist/components/NewAnnouncementBanner/NewAnnouncementBanner.esm.js.map +1 -1
  42. package/dist/components/NewCategoryDialog/NewCategoryDialog.esm.js +22 -14
  43. package/dist/components/NewCategoryDialog/NewCategoryDialog.esm.js.map +1 -1
  44. package/dist/components/Router.esm.js +40 -32
  45. package/dist/components/Router.esm.js.map +1 -1
  46. package/dist/index.d.ts +8 -8
  47. package/package.json +21 -21
@@ -1,4 +1,4 @@
1
- import React__default from 'react';
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { DateTime } from 'luxon';
3
3
  import { usePermission } from '@backstage/plugin-permission-react';
4
4
  import { Progress, InfoCard, Link } from '@backstage/core-components';
@@ -45,49 +45,70 @@ const AnnouncementsCard = ({
45
45
  permission: announcementCreatePermission
46
46
  });
47
47
  if (loading) {
48
- return /* @__PURE__ */ React__default.createElement(Progress, null);
48
+ return /* @__PURE__ */ jsx(Progress, {});
49
49
  } else if (error) {
50
- return /* @__PURE__ */ React__default.createElement(Alert, { severity: "error" }, error.message);
50
+ return /* @__PURE__ */ jsx(Alert, { severity: "error", children: error.message });
51
51
  }
52
52
  const deepLink = {
53
53
  link: announcementsLink(),
54
54
  title: t("announcementsCard.seeAll")
55
55
  };
56
- return /* @__PURE__ */ React__default.createElement(
56
+ return /* @__PURE__ */ jsx(
57
57
  InfoCard,
58
58
  {
59
59
  title: title || t("announcementsCard.announcements"),
60
60
  variant,
61
- deepLink
62
- },
63
- /* @__PURE__ */ React__default.createElement(List, { dense: true }, announcements.results.map((announcement) => /* @__PURE__ */ React__default.createElement(ListItem, { key: announcement.id }, /* @__PURE__ */ React__default.createElement(
64
- ListItemIcon,
65
- {
66
- className: classes.newAnnouncementIcon,
67
- style: {
68
- visibility: lastSeen < DateTime.fromISO(announcement.created_at) ? "visible" : "hidden"
69
- },
70
- title: t("announcementsCard.new")
71
- },
72
- /* @__PURE__ */ React__default.createElement(NewReleasesIcon, null)
73
- ), /* @__PURE__ */ React__default.createElement(
74
- ListItemText,
75
- {
76
- primary: /* @__PURE__ */ React__default.createElement(Link, { to: viewAnnouncementLink({ id: announcement.id }) }, announcement.title),
77
- secondary: /* @__PURE__ */ React__default.createElement(Box, null, /* @__PURE__ */ React__default.createElement(Typography, { variant: "body2", color: "textSecondary" }, DateTime.fromISO(announcement.created_at).toRelative(), announcement.category && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, ` ${t("announcementsCard.in")} `, /* @__PURE__ */ React__default.createElement(
78
- Link,
79
- {
80
- to: `${announcementsLink()}?category=${announcement.category.slug}`
81
- },
82
- announcement.category.title
83
- ))), /* @__PURE__ */ React__default.createElement(Typography, { variant: "body2", color: "textSecondary" }, announcement.excerpt), !hideStartAt && /* @__PURE__ */ React__default.createElement(Typography, { variant: "caption", color: "textSecondary" }, formatAnnouncementStartTime(
84
- announcement.start_at,
85
- t("announcementsCard.occurred"),
86
- t("announcementsCard.scheduled"),
87
- t("announcementsCard.today")
88
- )))
89
- }
90
- ), " ")), announcements.count === 0 && !loadingPermission && canAdd && /* @__PURE__ */ React__default.createElement(ListItem, null, /* @__PURE__ */ React__default.createElement(ListItemText, null, `${t("announcementsCard.noAnnouncements")} `, /* @__PURE__ */ React__default.createElement(Link, { to: createAnnouncementLink() }, t("announcementsCard.addOne")), "?")))
61
+ deepLink,
62
+ children: /* @__PURE__ */ jsxs(List, { dense: true, children: [
63
+ announcements.results.map((announcement) => /* @__PURE__ */ jsxs(ListItem, { children: [
64
+ /* @__PURE__ */ jsx(
65
+ ListItemIcon,
66
+ {
67
+ className: classes.newAnnouncementIcon,
68
+ style: {
69
+ visibility: lastSeen < DateTime.fromISO(announcement.created_at) ? "visible" : "hidden"
70
+ },
71
+ title: t("announcementsCard.new"),
72
+ children: /* @__PURE__ */ jsx(NewReleasesIcon, {})
73
+ }
74
+ ),
75
+ /* @__PURE__ */ jsx(
76
+ ListItemText,
77
+ {
78
+ primary: /* @__PURE__ */ jsx(Link, { to: viewAnnouncementLink({ id: announcement.id }), children: announcement.title }),
79
+ secondary: /* @__PURE__ */ jsxs(Box, { children: [
80
+ /* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "textSecondary", children: [
81
+ DateTime.fromISO(announcement.created_at).toRelative(),
82
+ announcement.category && /* @__PURE__ */ jsxs(Fragment, { children: [
83
+ ` ${t("announcementsCard.in")} `,
84
+ /* @__PURE__ */ jsx(
85
+ Link,
86
+ {
87
+ to: `${announcementsLink()}?category=${announcement.category.slug}`,
88
+ children: announcement.category.title
89
+ }
90
+ )
91
+ ] })
92
+ ] }),
93
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "textSecondary", children: announcement.excerpt }),
94
+ !hideStartAt && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "textSecondary", children: formatAnnouncementStartTime(
95
+ announcement.start_at,
96
+ t("announcementsCard.occurred"),
97
+ t("announcementsCard.scheduled"),
98
+ t("announcementsCard.today")
99
+ ) })
100
+ ] })
101
+ }
102
+ ),
103
+ " "
104
+ ] }, announcement.id)),
105
+ announcements.count === 0 && !loadingPermission && canAdd && /* @__PURE__ */ jsx(ListItem, { children: /* @__PURE__ */ jsxs(ListItemText, { children: [
106
+ `${t("announcementsCard.noAnnouncements")} `,
107
+ /* @__PURE__ */ jsx(Link, { to: createAnnouncementLink(), children: t("announcementsCard.addOne") }),
108
+ "?"
109
+ ] }) })
110
+ ] })
111
+ }
91
112
  );
92
113
  };
93
114
 
@@ -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 React from 'react';\nimport { DateTime } from 'luxon';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n InfoCard,\n InfoCardVariants,\n Link,\n Progress,\n} from '@backstage/core-components';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { announcementEntityPermissions } from '@backstage-community/plugin-announcements-common';\nimport {\n announcementCreateRouteRef,\n announcementViewRouteRef,\n rootRouteRef,\n} from '../../routes';\nimport { formatAnnouncementStartTime } from '../utils/announcementDateUtils';\nimport {\n announcementsApiRef,\n useAnnouncements,\n useAnnouncementsTranslation,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n makeStyles,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Typography,\n Box,\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});\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 hideStartAt?: boolean;\n};\n\nexport const AnnouncementsCard = ({\n title,\n max,\n category,\n active,\n variant = 'gridItem',\n sortBy,\n order,\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 createAnnouncementLink = useRouteRef(announcementCreateRouteRef);\n const lastSeen = announcementsApi.lastSeenDate();\n const { t } = useAnnouncementsTranslation();\n\n const { announcements, loading, error } = useAnnouncements({\n max: max || 5,\n category,\n active,\n sortBy,\n order,\n });\n\n const { announcementCreatePermission } = announcementEntityPermissions;\n const { loading: loadingPermission, allowed: canAdd } = usePermission({\n permission: announcementCreatePermission,\n });\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 to={viewAnnouncementLink({ id: announcement.id })}>\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 >\n {announcement.category.title}\n </Link>\n </>\n )}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n {announcement.excerpt}\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 && !loadingPermission && canAdd && (\n <ListItem>\n <ListItemText>\n {`${t('announcementsCard.noAnnouncements')} `}\n <Link to={createAnnouncementLink()}>\n {t('announcementsCard.addOne')}\n </Link>\n ?\n </ListItemText>\n </ListItem>\n )}\n </List>\n </InfoCard>\n );\n};\n"],"names":["React"],"mappings":"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"}
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 { usePermission } from '@backstage/plugin-permission-react';\nimport {\n InfoCard,\n InfoCardVariants,\n Link,\n Progress,\n} from '@backstage/core-components';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { announcementEntityPermissions } from '@backstage-community/plugin-announcements-common';\nimport {\n announcementCreateRouteRef,\n announcementViewRouteRef,\n rootRouteRef,\n} from '../../routes';\nimport { formatAnnouncementStartTime } from '../utils/announcementDateUtils';\nimport {\n announcementsApiRef,\n useAnnouncements,\n useAnnouncementsTranslation,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n makeStyles,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Typography,\n Box,\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});\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 hideStartAt?: boolean;\n};\n\nexport const AnnouncementsCard = ({\n title,\n max,\n category,\n active,\n variant = 'gridItem',\n sortBy,\n order,\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 createAnnouncementLink = useRouteRef(announcementCreateRouteRef);\n const lastSeen = announcementsApi.lastSeenDate();\n const { t } = useAnnouncementsTranslation();\n\n const { announcements, loading, error } = useAnnouncements({\n max: max || 5,\n category,\n active,\n sortBy,\n order,\n });\n\n const { announcementCreatePermission } = announcementEntityPermissions;\n const { loading: loadingPermission, allowed: canAdd } = usePermission({\n permission: announcementCreatePermission,\n });\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 to={viewAnnouncementLink({ id: announcement.id })}>\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 >\n {announcement.category.title}\n </Link>\n </>\n )}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n {announcement.excerpt}\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 && !loadingPermission && canAdd && (\n <ListItem>\n <ListItemText>\n {`${t('announcementsCard.noAnnouncements')} `}\n <Link to={createAnnouncementLink()}>\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,4 +1,5 @@
1
- import React__default from 'react';
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { useState } from 'react';
2
3
  import { useLocation } from 'react-router-dom';
3
4
  import { usePermission } from '@backstage/plugin-permission-react';
4
5
  import { announcementCreatePermission, announcementDeletePermission, announcementUpdatePermission } from '@backstage-community/plugin-announcements-common';
@@ -48,39 +49,54 @@ const AnnouncementCard = ({
48
49
  const entityLink = useRouteRef(entityRouteRef);
49
50
  const { t } = useAnnouncementsTranslation();
50
51
  const publisherRef = parseEntityRef(announcement.publisher);
51
- const title = /* @__PURE__ */ React__default.createElement(
52
+ const title = /* @__PURE__ */ jsx(
52
53
  Tooltip,
53
54
  {
54
55
  title: announcement.title,
55
56
  disableFocusListener: true,
56
- "data-testid": "announcement-card-title-tooltip"
57
- },
58
- /* @__PURE__ */ React__default.createElement(
59
- Link,
60
- {
61
- className: classes.cardHeader,
62
- to: viewAnnouncementLink({ id: announcement.id })
63
- },
64
- truncate(announcement.title, titleLength)
65
- )
57
+ "data-testid": "announcement-card-title-tooltip",
58
+ children: /* @__PURE__ */ jsx(
59
+ Link,
60
+ {
61
+ className: classes.cardHeader,
62
+ to: viewAnnouncementLink({ id: announcement.id }),
63
+ children: truncate(announcement.title, titleLength)
64
+ }
65
+ )
66
+ }
66
67
  );
67
- const subTitle = /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(Typography, { variant: "body2", color: "textSecondary", component: "span" }, t("announcementsPage.card.by"), " ", /* @__PURE__ */ React__default.createElement(EntityPeekAheadPopover, { entityRef: announcement.publisher }, /* @__PURE__ */ React__default.createElement(Link, { to: entityLink(publisherRef) }, /* @__PURE__ */ React__default.createElement(EntityDisplayName, { entityRef: announcement.publisher, hideIcon: true }))), announcement.category && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, " ", t("announcementsPage.card.in"), " ", /* @__PURE__ */ React__default.createElement(
68
- Link,
69
- {
70
- to: `${announcementsLink()}?category=${announcement.category.slug}`
71
- },
72
- announcement.category.title
73
- )), ", ", DateTime.fromISO(announcement.created_at).toRelative()), /* @__PURE__ */ React__default.createElement(Box, null, !hideStartAt && /* @__PURE__ */ React__default.createElement(Typography, { variant: "caption", color: "textSecondary" }, formatAnnouncementStartTime(
74
- announcement.start_at,
75
- t("announcementsCard.occurred"),
76
- t("announcementsCard.scheduled"),
77
- t("announcementsCard.today")
78
- ))));
68
+ const subTitle = /* @__PURE__ */ jsxs(Fragment, { children: [
69
+ /* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "textSecondary", component: "span", children: [
70
+ t("announcementsPage.card.by"),
71
+ " ",
72
+ /* @__PURE__ */ jsx(EntityPeekAheadPopover, { entityRef: announcement.publisher, children: /* @__PURE__ */ jsx(Link, { to: entityLink(publisherRef), children: /* @__PURE__ */ jsx(EntityDisplayName, { entityRef: announcement.publisher, hideIcon: true }) }) }),
73
+ announcement.category && /* @__PURE__ */ jsxs(Fragment, { children: [
74
+ " ",
75
+ t("announcementsPage.card.in"),
76
+ " ",
77
+ /* @__PURE__ */ jsx(
78
+ Link,
79
+ {
80
+ to: `${announcementsLink()}?category=${announcement.category.slug}`,
81
+ children: announcement.category.title
82
+ }
83
+ )
84
+ ] }),
85
+ ", ",
86
+ DateTime.fromISO(announcement.created_at).toRelative()
87
+ ] }),
88
+ /* @__PURE__ */ jsx(Box, { children: !hideStartAt && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "textSecondary", children: formatAnnouncementStartTime(
89
+ announcement.start_at,
90
+ t("announcementsCard.occurred"),
91
+ t("announcementsCard.scheduled"),
92
+ t("announcementsCard.today")
93
+ ) }) })
94
+ ] });
79
95
  const { loading: loadingDeletePermission, allowed: canDelete } = usePermission({ permission: announcementDeletePermission });
80
96
  const { loading: loadingUpdatePermission, allowed: canUpdate } = usePermission({ permission: announcementUpdatePermission });
81
97
  const AnnouncementEditMenu = () => {
82
- const [open, setOpen] = React__default.useState(false);
83
- const [anchorEl, setAnchorEl] = React__default.useState(
98
+ const [open, setOpen] = useState(false);
99
+ const [anchorEl, setAnchorEl] = useState(
84
100
  void 0
85
101
  );
86
102
  const handleOpenEditMenu = (event) => {
@@ -92,33 +108,47 @@ const AnnouncementCard = ({
92
108
  setOpen(false);
93
109
  };
94
110
  const canShowMenu = !loadingUpdatePermission && canUpdate || !loadingDeletePermission && canDelete;
95
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, canShowMenu && /* @__PURE__ */ React__default.createElement(
96
- IconButton,
97
- {
98
- "data-testid": "announcement-edit-menu",
99
- "aria-label": "more",
100
- onClick: handleOpenEditMenu
101
- },
102
- /* @__PURE__ */ React__default.createElement(MoreVert, null)
103
- ), /* @__PURE__ */ React__default.createElement(Menu, { anchorEl, open, onClose: handleCloseEditClose }, !loadingUpdatePermission && canUpdate && /* @__PURE__ */ React__default.createElement(
104
- MenuItem,
105
- {
106
- "data-testid": "edit-announcement",
107
- component: LinkButton,
108
- to: editAnnouncementLink({ id: announcement.id })
109
- },
110
- /* @__PURE__ */ React__default.createElement(ListItemIcon, null, /* @__PURE__ */ React__default.createElement(EditIcon, null)),
111
- t("announcementsPage.card.edit")
112
- ), !loadingDeletePermission && canDelete && /* @__PURE__ */ React__default.createElement(MenuItem, { onClick: onDelete }, /* @__PURE__ */ React__default.createElement(ListItemIcon, null, /* @__PURE__ */ React__default.createElement(DeleteIcon, null)), t("announcementsPage.card.delete"))));
111
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
112
+ canShowMenu && /* @__PURE__ */ jsx(
113
+ IconButton,
114
+ {
115
+ "data-testid": "announcement-edit-menu",
116
+ "aria-label": "more",
117
+ onClick: handleOpenEditMenu,
118
+ children: /* @__PURE__ */ jsx(MoreVert, {})
119
+ }
120
+ ),
121
+ /* @__PURE__ */ jsxs(Menu, { anchorEl, open, onClose: handleCloseEditClose, children: [
122
+ !loadingUpdatePermission && canUpdate && /* @__PURE__ */ jsxs(
123
+ MenuItem,
124
+ {
125
+ "data-testid": "edit-announcement",
126
+ component: LinkButton,
127
+ to: editAnnouncementLink({ id: announcement.id }),
128
+ children: [
129
+ /* @__PURE__ */ jsx(ListItemIcon, { children: /* @__PURE__ */ jsx(EditIcon, {}) }),
130
+ t("announcementsPage.card.edit")
131
+ ]
132
+ }
133
+ ),
134
+ !loadingDeletePermission && canDelete && /* @__PURE__ */ jsxs(MenuItem, { onClick: onDelete, children: [
135
+ /* @__PURE__ */ jsx(ListItemIcon, { children: /* @__PURE__ */ jsx(DeleteIcon, {}) }),
136
+ t("announcementsPage.card.delete")
137
+ ] })
138
+ ] })
139
+ ] });
113
140
  };
114
- return /* @__PURE__ */ React__default.createElement(Card, null, /* @__PURE__ */ React__default.createElement(
115
- CardHeader,
116
- {
117
- action: /* @__PURE__ */ React__default.createElement(AnnouncementEditMenu, null),
118
- title,
119
- subheader: subTitle
120
- }
121
- ), /* @__PURE__ */ React__default.createElement(CardContent, null, announcement.excerpt));
141
+ return /* @__PURE__ */ jsxs(Card, { children: [
142
+ /* @__PURE__ */ jsx(
143
+ CardHeader,
144
+ {
145
+ action: /* @__PURE__ */ jsx(AnnouncementEditMenu, {}),
146
+ title,
147
+ subheader: subTitle
148
+ }
149
+ ),
150
+ /* @__PURE__ */ jsx(CardContent, { children: announcement.excerpt })
151
+ ] });
122
152
  };
123
153
  const AnnouncementsGrid = ({
124
154
  maxPerPage,
@@ -132,7 +162,7 @@ const AnnouncementsGrid = ({
132
162
  const classes = useStyles();
133
163
  const announcementsApi = useApi(announcementsApiRef);
134
164
  const alertApi = useApi(alertApiRef);
135
- const [page, setPage] = React__default.useState(1);
165
+ const [page, setPage] = useState(1);
136
166
  const handleChange = (_event, value) => {
137
167
  setPage(value);
138
168
  };
@@ -160,9 +190,9 @@ const AnnouncementsGrid = ({
160
190
  announcement: announcementToDelete
161
191
  } = useDeleteAnnouncementDialogState();
162
192
  if (loading) {
163
- return /* @__PURE__ */ React__default.createElement(Progress, null);
193
+ return /* @__PURE__ */ jsx(Progress, {});
164
194
  } else if (error) {
165
- return /* @__PURE__ */ React__default.createElement(Alert, { severity: "error" }, error.message);
195
+ return /* @__PURE__ */ jsx(Alert, { severity: "error", children: error.message });
166
196
  }
167
197
  const onCancelDelete = () => {
168
198
  closeDeleteDialog();
@@ -180,30 +210,34 @@ const AnnouncementsGrid = ({
180
210
  }
181
211
  refresh();
182
212
  };
183
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(ItemCardGrid, null, announcements.results.map((announcement) => /* @__PURE__ */ React__default.createElement(
184
- AnnouncementCard,
185
- {
186
- key: announcement.id,
187
- announcement,
188
- onDelete: () => openDeleteDialog(announcement),
189
- options: { titleLength: cardTitleLength },
190
- hideStartAt
191
- }
192
- ))), announcements && announcements.count !== 0 && /* @__PURE__ */ React__default.createElement("div", { className: classes.pagination }, /* @__PURE__ */ React__default.createElement(
193
- Pagination,
194
- {
195
- count: Math.ceil(announcements.count / maxPerPage),
196
- page,
197
- onChange: handleChange
198
- }
199
- )), /* @__PURE__ */ React__default.createElement(
200
- DeleteAnnouncementDialog,
201
- {
202
- open: isDeleteDialogOpen,
203
- onCancel: onCancelDelete,
204
- onConfirm: onConfirmDelete
205
- }
206
- ));
213
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
214
+ /* @__PURE__ */ jsx(ItemCardGrid, { children: announcements.results.map((announcement) => /* @__PURE__ */ jsx(
215
+ AnnouncementCard,
216
+ {
217
+ announcement,
218
+ onDelete: () => openDeleteDialog(announcement),
219
+ options: { titleLength: cardTitleLength },
220
+ hideStartAt
221
+ },
222
+ announcement.id
223
+ )) }),
224
+ announcements && announcements.count !== 0 && /* @__PURE__ */ jsx("div", { className: classes.pagination, children: /* @__PURE__ */ jsx(
225
+ Pagination,
226
+ {
227
+ count: Math.ceil(announcements.count / maxPerPage),
228
+ page,
229
+ onChange: handleChange
230
+ }
231
+ ) }),
232
+ /* @__PURE__ */ jsx(
233
+ DeleteAnnouncementDialog,
234
+ {
235
+ open: isDeleteDialogOpen,
236
+ onCancel: onCancelDelete,
237
+ onConfirm: onConfirmDelete
238
+ }
239
+ )
240
+ ] });
207
241
  };
208
242
  const AnnouncementsPage = (props) => {
209
243
  const location = useLocation();
@@ -225,27 +259,33 @@ const AnnouncementsPage = (props) => {
225
259
  sortby,
226
260
  order
227
261
  } = props;
228
- return /* @__PURE__ */ React__default.createElement(Page, { themeId }, /* @__PURE__ */ React__default.createElement(Header, { title, subtitle }, !hideContextMenu && canCreate && /* @__PURE__ */ React__default.createElement(ContextMenu, null)), /* @__PURE__ */ React__default.createElement(Content, null, /* @__PURE__ */ React__default.createElement(ContentHeader, { title: "" }, !loadingCreatePermission && /* @__PURE__ */ React__default.createElement(
229
- LinkButton,
230
- {
231
- disabled: !canCreate,
232
- to: newAnnouncementLink(),
233
- color: "primary",
234
- variant: "contained"
235
- },
236
- buttonOptions ? `${t("announcementsPage.genericNew")} ${buttonOptions.name}` : t("announcementsPage.newAnnouncement")
237
- )), /* @__PURE__ */ React__default.createElement(
238
- AnnouncementsGrid,
239
- {
240
- maxPerPage: maxPerPage ?? 10,
241
- category: category ?? queryParams.get("category") ?? void 0,
242
- cardTitleLength: cardOptions?.titleLength,
243
- active: hideInactive ? true : false,
244
- sortBy: sortby ?? "created_at",
245
- order: order ?? "desc",
246
- hideStartAt
247
- }
248
- )));
262
+ return /* @__PURE__ */ jsxs(Page, { themeId, children: [
263
+ /* @__PURE__ */ jsx(Header, { title, subtitle, children: !hideContextMenu && canCreate && /* @__PURE__ */ jsx(ContextMenu, {}) }),
264
+ /* @__PURE__ */ jsxs(Content, { children: [
265
+ /* @__PURE__ */ jsx(ContentHeader, { title: "", children: !loadingCreatePermission && /* @__PURE__ */ jsx(
266
+ LinkButton,
267
+ {
268
+ disabled: !canCreate,
269
+ to: newAnnouncementLink(),
270
+ color: "primary",
271
+ variant: "contained",
272
+ children: buttonOptions ? `${t("announcementsPage.genericNew")} ${buttonOptions.name}` : t("announcementsPage.newAnnouncement")
273
+ }
274
+ ) }),
275
+ /* @__PURE__ */ jsx(
276
+ AnnouncementsGrid,
277
+ {
278
+ maxPerPage: maxPerPage ?? 10,
279
+ category: category ?? queryParams.get("category") ?? void 0,
280
+ cardTitleLength: cardOptions?.titleLength,
281
+ active: hideInactive ? true : false,
282
+ sortBy: sortby ?? "created_at",
283
+ order: order ?? "desc",
284
+ hideStartAt
285
+ }
286
+ )
287
+ ] })
288
+ ] });
249
289
  };
250
290
 
251
291
  export { AnnouncementsPage };
@@ -1 +1 @@
1
- {"version":3,"file":"AnnouncementsPage.esm.js","sources":["../../../src/components/AnnouncementsPage/AnnouncementsPage.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 React, { ReactNode } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n announcementCreatePermission,\n announcementUpdatePermission,\n announcementDeletePermission,\n Announcement,\n} from '@backstage-community/plugin-announcements-common';\nimport { DateTime } from 'luxon';\nimport {\n Page,\n Header,\n Content,\n Link,\n ItemCardGrid,\n Progress,\n ContentHeader,\n LinkButton,\n} from '@backstage/core-components';\nimport { alertApiRef, useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport {\n EntityDisplayName,\n EntityPeekAheadPopover,\n entityRouteRef,\n} from '@backstage/plugin-catalog-react';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport EditIcon from '@material-ui/icons/Edit';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport {\n announcementCreateRouteRef,\n announcementEditRouteRef,\n announcementViewRouteRef,\n rootRouteRef,\n} from '../../routes';\nimport { DeleteAnnouncementDialog } from './DeleteAnnouncementDialog';\nimport { useDeleteAnnouncementDialogState } from './useDeleteAnnouncementDialogState';\nimport { ContextMenu } from './ContextMenu';\nimport {\n announcementsApiRef,\n useAnnouncements,\n useAnnouncementsTranslation,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n Box,\n Card,\n CardContent,\n CardHeader,\n IconButton,\n ListItemIcon,\n makeStyles,\n Menu,\n MenuItem,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport { Alert, Pagination } from '@material-ui/lab';\nimport { formatAnnouncementStartTime } from '../utils/announcementDateUtils';\n\nconst useStyles = makeStyles(theme => {\n return {\n cardHeader: {\n color: theme?.palette?.text?.primary || '#000',\n fontSize: '1.5rem',\n },\n pagination: {\n display: 'flex',\n justifyContent: 'center',\n marginTop: theme?.spacing?.(4) || 32,\n },\n };\n});\n/**\n * Truncate text to a given length and add ellipsis\n * @param text the text to truncate\n * @param length the length to truncate to\n * @returns the truncated text\n */\nconst truncate = (text: string, length: number) => {\n return text.length > length ? `${text.substring(0, length)}...` : text;\n};\n\nconst AnnouncementCard = ({\n announcement,\n onDelete,\n options: { titleLength = 50 },\n hideStartAt,\n}: {\n announcement: Announcement;\n onDelete: () => void;\n options: AnnouncementCardProps;\n hideStartAt?: boolean;\n}) => {\n const classes = useStyles();\n const announcementsLink = useRouteRef(rootRouteRef);\n const viewAnnouncementLink = useRouteRef(announcementViewRouteRef);\n const editAnnouncementLink = useRouteRef(announcementEditRouteRef);\n const entityLink = useRouteRef(entityRouteRef);\n const { t } = useAnnouncementsTranslation();\n\n const publisherRef = parseEntityRef(announcement.publisher);\n const title = (\n <Tooltip\n title={announcement.title}\n disableFocusListener\n data-testid=\"announcement-card-title-tooltip\"\n >\n <Link\n className={classes.cardHeader}\n to={viewAnnouncementLink({ id: announcement.id })}\n >\n {truncate(announcement.title, titleLength)}\n </Link>\n </Tooltip>\n );\n const subTitle = (\n <>\n <Typography variant=\"body2\" color=\"textSecondary\" component=\"span\">\n {t('announcementsPage.card.by')}{' '}\n <EntityPeekAheadPopover entityRef={announcement.publisher}>\n <Link to={entityLink(publisherRef)}>\n <EntityDisplayName entityRef={announcement.publisher} hideIcon />\n </Link>\n </EntityPeekAheadPopover>\n {announcement.category && (\n <>\n {' '}\n {t('announcementsPage.card.in')}{' '}\n <Link\n to={`${announcementsLink()}?category=${\n announcement.category.slug\n }`}\n >\n {announcement.category.title}\n </Link>\n </>\n )}\n , {DateTime.fromISO(announcement.created_at).toRelative()}\n </Typography>\n <Box>\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 const { loading: loadingDeletePermission, allowed: canDelete } =\n usePermission({ permission: announcementDeletePermission });\n const { loading: loadingUpdatePermission, allowed: canUpdate } =\n usePermission({ permission: announcementUpdatePermission });\n\n const AnnouncementEditMenu = () => {\n const [open, setOpen] = React.useState(false);\n const [anchorEl, setAnchorEl] = React.useState<undefined | HTMLElement>(\n undefined,\n );\n\n const handleOpenEditMenu = (event: React.MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n setOpen(true);\n };\n\n const handleCloseEditClose = () => {\n setAnchorEl(undefined);\n setOpen(false);\n };\n\n const canShowMenu =\n (!loadingUpdatePermission && canUpdate) ||\n (!loadingDeletePermission && canDelete);\n\n return (\n <>\n {canShowMenu && (\n <IconButton\n data-testid=\"announcement-edit-menu\"\n aria-label=\"more\"\n onClick={handleOpenEditMenu}\n >\n <MoreVertIcon />\n </IconButton>\n )}\n <Menu anchorEl={anchorEl} open={open} onClose={handleCloseEditClose}>\n {!loadingUpdatePermission && canUpdate && (\n <MenuItem\n data-testid=\"edit-announcement\"\n component={LinkButton}\n to={editAnnouncementLink({ id: announcement.id })}\n >\n <ListItemIcon>\n <EditIcon />\n </ListItemIcon>\n {t('announcementsPage.card.edit')}\n </MenuItem>\n )}\n {!loadingDeletePermission && canDelete && (\n <MenuItem onClick={onDelete}>\n <ListItemIcon>\n <DeleteIcon />\n </ListItemIcon>\n {t('announcementsPage.card.delete')}\n </MenuItem>\n )}\n </Menu>\n </>\n );\n };\n\n return (\n <Card>\n <CardHeader\n action={<AnnouncementEditMenu />}\n title={title}\n subheader={subTitle}\n />\n <CardContent>{announcement.excerpt}</CardContent>\n </Card>\n );\n};\n\nconst AnnouncementsGrid = ({\n maxPerPage,\n category,\n cardTitleLength,\n active,\n sortBy,\n order,\n hideStartAt,\n}: {\n maxPerPage: number;\n category?: string;\n cardTitleLength?: number;\n active?: boolean;\n sortBy?: 'created_at' | 'start_at';\n order?: 'asc' | 'desc';\n hideStartAt?: boolean;\n}) => {\n const classes = useStyles();\n const announcementsApi = useApi(announcementsApiRef);\n const alertApi = useApi(alertApiRef);\n\n const [page, setPage] = React.useState(1);\n const handleChange = (_event: any, value: number) => {\n setPage(value);\n };\n\n const {\n announcements,\n loading,\n error,\n retry: refresh,\n } = useAnnouncements(\n {\n max: maxPerPage,\n page: page,\n category,\n active,\n sortBy,\n order,\n },\n { dependencies: [maxPerPage, page, category] },\n );\n\n const { t } = useAnnouncementsTranslation();\n\n const {\n isOpen: isDeleteDialogOpen,\n open: openDeleteDialog,\n close: closeDeleteDialog,\n announcement: announcementToDelete,\n } = useDeleteAnnouncementDialogState();\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n }\n\n const onCancelDelete = () => {\n closeDeleteDialog();\n };\n const onConfirmDelete = async () => {\n closeDeleteDialog();\n\n try {\n await announcementsApi.deleteAnnouncementByID(announcementToDelete!.id);\n\n alertApi.post({\n message: t('announcementsPage.grid.announcementDeleted'),\n severity: 'success',\n });\n } catch (err) {\n alertApi.post({ message: (err as Error).message, severity: 'error' });\n }\n\n refresh();\n };\n\n return (\n <>\n <ItemCardGrid>\n {announcements.results.map(announcement => (\n <AnnouncementCard\n key={announcement.id}\n announcement={announcement}\n onDelete={() => openDeleteDialog(announcement)}\n options={{ titleLength: cardTitleLength }}\n hideStartAt={hideStartAt}\n />\n ))}\n </ItemCardGrid>\n\n {announcements && announcements.count !== 0 && (\n <div className={classes.pagination}>\n <Pagination\n count={Math.ceil(announcements.count / maxPerPage)}\n page={page}\n onChange={handleChange}\n />\n </div>\n )}\n\n <DeleteAnnouncementDialog\n open={isDeleteDialogOpen}\n onCancel={onCancelDelete}\n onConfirm={onConfirmDelete}\n />\n </>\n );\n};\n\ntype AnnouncementCardProps = {\n titleLength?: number;\n};\n\ntype AnnouncementCreateButtonProps = {\n name?: string;\n};\n\nexport type AnnouncementsPageProps = {\n themeId: string;\n title: string;\n subtitle?: ReactNode;\n maxPerPage?: number;\n category?: string;\n buttonOptions?: AnnouncementCreateButtonProps;\n cardOptions?: AnnouncementCardProps;\n hideContextMenu?: boolean;\n hideInactive?: boolean;\n hideStartAt?: boolean;\n sortby?: 'created_at' | 'start_at';\n order?: 'asc' | 'desc';\n};\n\nexport const AnnouncementsPage = (props: AnnouncementsPageProps) => {\n const location = useLocation();\n const queryParams = new URLSearchParams(location.search);\n const newAnnouncementLink = useRouteRef(announcementCreateRouteRef);\n const { loading: loadingCreatePermission, allowed: canCreate } =\n usePermission({ permission: announcementCreatePermission });\n const { t } = useAnnouncementsTranslation();\n\n const {\n hideContextMenu,\n hideInactive,\n hideStartAt,\n themeId,\n title,\n subtitle,\n buttonOptions,\n maxPerPage,\n category,\n cardOptions,\n sortby,\n order,\n } = props;\n\n return (\n <Page themeId={themeId}>\n <Header title={title} subtitle={subtitle}>\n {!hideContextMenu && canCreate && <ContextMenu />}\n </Header>\n\n <Content>\n <ContentHeader title=\"\">\n {!loadingCreatePermission && (\n <LinkButton\n disabled={!canCreate}\n to={newAnnouncementLink()}\n color=\"primary\"\n variant=\"contained\"\n >\n {buttonOptions\n ? `${t('announcementsPage.genericNew')} ${buttonOptions.name}`\n : t('announcementsPage.newAnnouncement')}\n </LinkButton>\n )}\n </ContentHeader>\n\n <AnnouncementsGrid\n maxPerPage={maxPerPage ?? 10}\n category={category ?? queryParams.get('category') ?? undefined}\n cardTitleLength={cardOptions?.titleLength}\n active={hideInactive ? true : false}\n sortBy={sortby ?? 'created_at'}\n order={order ?? 'desc'}\n hideStartAt={hideStartAt}\n />\n </Content>\n </Page>\n );\n};\n"],"names":["React","MoreVertIcon"],"mappings":"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"}
1
+ {"version":3,"file":"AnnouncementsPage.esm.js","sources":["../../../src/components/AnnouncementsPage/AnnouncementsPage.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 { MouseEvent, useState, ReactNode } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n announcementCreatePermission,\n announcementUpdatePermission,\n announcementDeletePermission,\n Announcement,\n} from '@backstage-community/plugin-announcements-common';\nimport { DateTime } from 'luxon';\nimport {\n Page,\n Header,\n Content,\n Link,\n ItemCardGrid,\n Progress,\n ContentHeader,\n LinkButton,\n} from '@backstage/core-components';\nimport { alertApiRef, useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport {\n EntityDisplayName,\n EntityPeekAheadPopover,\n entityRouteRef,\n} from '@backstage/plugin-catalog-react';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport EditIcon from '@material-ui/icons/Edit';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport {\n announcementCreateRouteRef,\n announcementEditRouteRef,\n announcementViewRouteRef,\n rootRouteRef,\n} from '../../routes';\nimport { DeleteAnnouncementDialog } from './DeleteAnnouncementDialog';\nimport { useDeleteAnnouncementDialogState } from './useDeleteAnnouncementDialogState';\nimport { ContextMenu } from './ContextMenu';\nimport {\n announcementsApiRef,\n useAnnouncements,\n useAnnouncementsTranslation,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n Box,\n Card,\n CardContent,\n CardHeader,\n IconButton,\n ListItemIcon,\n makeStyles,\n Menu,\n MenuItem,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport { Alert, Pagination } from '@material-ui/lab';\nimport { formatAnnouncementStartTime } from '../utils/announcementDateUtils';\n\nconst useStyles = makeStyles(theme => {\n return {\n cardHeader: {\n color: theme?.palette?.text?.primary || '#000',\n fontSize: '1.5rem',\n },\n pagination: {\n display: 'flex',\n justifyContent: 'center',\n marginTop: theme?.spacing?.(4) || 32,\n },\n };\n});\n/**\n * Truncate text to a given length and add ellipsis\n * @param text the text to truncate\n * @param length the length to truncate to\n * @returns the truncated text\n */\nconst truncate = (text: string, length: number) => {\n return text.length > length ? `${text.substring(0, length)}...` : text;\n};\n\nconst AnnouncementCard = ({\n announcement,\n onDelete,\n options: { titleLength = 50 },\n hideStartAt,\n}: {\n announcement: Announcement;\n onDelete: () => void;\n options: AnnouncementCardProps;\n hideStartAt?: boolean;\n}) => {\n const classes = useStyles();\n const announcementsLink = useRouteRef(rootRouteRef);\n const viewAnnouncementLink = useRouteRef(announcementViewRouteRef);\n const editAnnouncementLink = useRouteRef(announcementEditRouteRef);\n const entityLink = useRouteRef(entityRouteRef);\n const { t } = useAnnouncementsTranslation();\n\n const publisherRef = parseEntityRef(announcement.publisher);\n const title = (\n <Tooltip\n title={announcement.title}\n disableFocusListener\n data-testid=\"announcement-card-title-tooltip\"\n >\n <Link\n className={classes.cardHeader}\n to={viewAnnouncementLink({ id: announcement.id })}\n >\n {truncate(announcement.title, titleLength)}\n </Link>\n </Tooltip>\n );\n const subTitle = (\n <>\n <Typography variant=\"body2\" color=\"textSecondary\" component=\"span\">\n {t('announcementsPage.card.by')}{' '}\n <EntityPeekAheadPopover entityRef={announcement.publisher}>\n <Link to={entityLink(publisherRef)}>\n <EntityDisplayName entityRef={announcement.publisher} hideIcon />\n </Link>\n </EntityPeekAheadPopover>\n {announcement.category && (\n <>\n {' '}\n {t('announcementsPage.card.in')}{' '}\n <Link\n to={`${announcementsLink()}?category=${\n announcement.category.slug\n }`}\n >\n {announcement.category.title}\n </Link>\n </>\n )}\n , {DateTime.fromISO(announcement.created_at).toRelative()}\n </Typography>\n <Box>\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 const { loading: loadingDeletePermission, allowed: canDelete } =\n usePermission({ permission: announcementDeletePermission });\n const { loading: loadingUpdatePermission, allowed: canUpdate } =\n usePermission({ permission: announcementUpdatePermission });\n\n const AnnouncementEditMenu = () => {\n const [open, setOpen] = useState(false);\n const [anchorEl, setAnchorEl] = useState<undefined | HTMLElement>(\n undefined,\n );\n\n const handleOpenEditMenu = (event: MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n setOpen(true);\n };\n\n const handleCloseEditClose = () => {\n setAnchorEl(undefined);\n setOpen(false);\n };\n\n const canShowMenu =\n (!loadingUpdatePermission && canUpdate) ||\n (!loadingDeletePermission && canDelete);\n\n return (\n <>\n {canShowMenu && (\n <IconButton\n data-testid=\"announcement-edit-menu\"\n aria-label=\"more\"\n onClick={handleOpenEditMenu}\n >\n <MoreVertIcon />\n </IconButton>\n )}\n <Menu anchorEl={anchorEl} open={open} onClose={handleCloseEditClose}>\n {!loadingUpdatePermission && canUpdate && (\n <MenuItem\n data-testid=\"edit-announcement\"\n component={LinkButton}\n to={editAnnouncementLink({ id: announcement.id })}\n >\n <ListItemIcon>\n <EditIcon />\n </ListItemIcon>\n {t('announcementsPage.card.edit')}\n </MenuItem>\n )}\n {!loadingDeletePermission && canDelete && (\n <MenuItem onClick={onDelete}>\n <ListItemIcon>\n <DeleteIcon />\n </ListItemIcon>\n {t('announcementsPage.card.delete')}\n </MenuItem>\n )}\n </Menu>\n </>\n );\n };\n\n return (\n <Card>\n <CardHeader\n action={<AnnouncementEditMenu />}\n title={title}\n subheader={subTitle}\n />\n <CardContent>{announcement.excerpt}</CardContent>\n </Card>\n );\n};\n\nconst AnnouncementsGrid = ({\n maxPerPage,\n category,\n cardTitleLength,\n active,\n sortBy,\n order,\n hideStartAt,\n}: {\n maxPerPage: number;\n category?: string;\n cardTitleLength?: number;\n active?: boolean;\n sortBy?: 'created_at' | 'start_at';\n order?: 'asc' | 'desc';\n hideStartAt?: boolean;\n}) => {\n const classes = useStyles();\n const announcementsApi = useApi(announcementsApiRef);\n const alertApi = useApi(alertApiRef);\n\n const [page, setPage] = useState(1);\n const handleChange = (_event: any, value: number) => {\n setPage(value);\n };\n\n const {\n announcements,\n loading,\n error,\n retry: refresh,\n } = useAnnouncements(\n {\n max: maxPerPage,\n page: page,\n category,\n active,\n sortBy,\n order,\n },\n { dependencies: [maxPerPage, page, category] },\n );\n\n const { t } = useAnnouncementsTranslation();\n\n const {\n isOpen: isDeleteDialogOpen,\n open: openDeleteDialog,\n close: closeDeleteDialog,\n announcement: announcementToDelete,\n } = useDeleteAnnouncementDialogState();\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n }\n\n const onCancelDelete = () => {\n closeDeleteDialog();\n };\n const onConfirmDelete = async () => {\n closeDeleteDialog();\n\n try {\n await announcementsApi.deleteAnnouncementByID(announcementToDelete!.id);\n\n alertApi.post({\n message: t('announcementsPage.grid.announcementDeleted'),\n severity: 'success',\n });\n } catch (err) {\n alertApi.post({ message: (err as Error).message, severity: 'error' });\n }\n\n refresh();\n };\n\n return (\n <>\n <ItemCardGrid>\n {announcements.results.map(announcement => (\n <AnnouncementCard\n key={announcement.id}\n announcement={announcement}\n onDelete={() => openDeleteDialog(announcement)}\n options={{ titleLength: cardTitleLength }}\n hideStartAt={hideStartAt}\n />\n ))}\n </ItemCardGrid>\n\n {announcements && announcements.count !== 0 && (\n <div className={classes.pagination}>\n <Pagination\n count={Math.ceil(announcements.count / maxPerPage)}\n page={page}\n onChange={handleChange}\n />\n </div>\n )}\n\n <DeleteAnnouncementDialog\n open={isDeleteDialogOpen}\n onCancel={onCancelDelete}\n onConfirm={onConfirmDelete}\n />\n </>\n );\n};\n\ntype AnnouncementCardProps = {\n titleLength?: number;\n};\n\ntype AnnouncementCreateButtonProps = {\n name?: string;\n};\n\nexport type AnnouncementsPageProps = {\n themeId: string;\n title: string;\n subtitle?: ReactNode;\n maxPerPage?: number;\n category?: string;\n buttonOptions?: AnnouncementCreateButtonProps;\n cardOptions?: AnnouncementCardProps;\n hideContextMenu?: boolean;\n hideInactive?: boolean;\n hideStartAt?: boolean;\n sortby?: 'created_at' | 'start_at';\n order?: 'asc' | 'desc';\n};\n\nexport const AnnouncementsPage = (props: AnnouncementsPageProps) => {\n const location = useLocation();\n const queryParams = new URLSearchParams(location.search);\n const newAnnouncementLink = useRouteRef(announcementCreateRouteRef);\n const { loading: loadingCreatePermission, allowed: canCreate } =\n usePermission({ permission: announcementCreatePermission });\n const { t } = useAnnouncementsTranslation();\n\n const {\n hideContextMenu,\n hideInactive,\n hideStartAt,\n themeId,\n title,\n subtitle,\n buttonOptions,\n maxPerPage,\n category,\n cardOptions,\n sortby,\n order,\n } = props;\n\n return (\n <Page themeId={themeId}>\n <Header title={title} subtitle={subtitle}>\n {!hideContextMenu && canCreate && <ContextMenu />}\n </Header>\n\n <Content>\n <ContentHeader title=\"\">\n {!loadingCreatePermission && (\n <LinkButton\n disabled={!canCreate}\n to={newAnnouncementLink()}\n color=\"primary\"\n variant=\"contained\"\n >\n {buttonOptions\n ? `${t('announcementsPage.genericNew')} ${buttonOptions.name}`\n : t('announcementsPage.newAnnouncement')}\n </LinkButton>\n )}\n </ContentHeader>\n\n <AnnouncementsGrid\n maxPerPage={maxPerPage ?? 10}\n category={category ?? queryParams.get('category') ?? undefined}\n cardTitleLength={cardOptions?.titleLength}\n active={hideInactive ? true : false}\n sortBy={sortby ?? 'created_at'}\n order={order ?? 'desc'}\n hideStartAt={hideStartAt}\n />\n </Content>\n </Page>\n );\n};\n"],"names":["MoreVertIcon"],"mappings":"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"}