@backstage-community/plugin-announcements 1.3.2 → 2.0.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.
Files changed (70) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/{alpha/Router.esm.js → Router.esm.js} +11 -7
  3. package/dist/Router.esm.js.map +1 -0
  4. package/dist/alpha/components/admin/announcements/AnnouncementForm/AnnouncementForm.esm.js.map +1 -0
  5. package/dist/alpha/components/admin/announcements/AnnouncementForm/CategoryInput.esm.js.map +1 -0
  6. package/dist/alpha/components/admin/announcements/AnnouncementForm/OnBehalfTeamDropdown.esm.js.map +1 -0
  7. package/dist/alpha/components/admin/announcements/AnnouncementForm/TagsInput.esm.js.map +1 -0
  8. package/dist/alpha/components/admin/announcements/AnnouncementsContent.esm.js +27 -23
  9. package/dist/alpha/components/admin/announcements/AnnouncementsContent.esm.js.map +1 -1
  10. package/dist/alpha/components/admin/announcements/AnnouncementsTable.esm.js +128 -121
  11. package/dist/alpha/components/admin/announcements/AnnouncementsTable.esm.js.map +1 -1
  12. package/dist/alpha/components/admin/announcements/AnnouncementsTableCard.esm.js +12 -21
  13. package/dist/alpha/components/admin/announcements/AnnouncementsTableCard.esm.js.map +1 -1
  14. package/dist/alpha/components/admin/categories/CategoriesTable.esm.js +43 -42
  15. package/dist/alpha/components/admin/categories/CategoriesTable.esm.js.map +1 -1
  16. package/dist/alpha/components/admin/categories/CategoriesTableCard.esm.js +2 -20
  17. package/dist/alpha/components/admin/categories/CategoriesTableCard.esm.js.map +1 -1
  18. package/dist/alpha/components/admin/tags/TagsTable.esm.js +43 -36
  19. package/dist/alpha/components/admin/tags/TagsTable.esm.js.map +1 -1
  20. package/dist/alpha/components/admin/tags/TagsTableCard.esm.js +2 -20
  21. package/dist/alpha/components/admin/tags/TagsTableCard.esm.js.map +1 -1
  22. package/dist/alpha/components/announcements/ViewAnnouncementPage.esm.js +0 -30
  23. package/dist/alpha/components/announcements/ViewAnnouncementPage.esm.js.map +1 -1
  24. package/dist/alpha/pages.esm.js +1 -1
  25. package/dist/alpha/pages.esm.js.map +1 -1
  26. package/dist/alpha/search.esm.js +5 -3
  27. package/dist/alpha/search.esm.js.map +1 -1
  28. package/dist/alpha.d.ts +2 -2
  29. package/dist/index.d.ts +1 -80
  30. package/dist/index.esm.js +1 -1
  31. package/dist/plugin.esm.js +2 -18
  32. package/dist/plugin.esm.js.map +1 -1
  33. package/package.json +13 -13
  34. package/dist/alpha/Router.esm.js.map +0 -1
  35. package/dist/components/Admin/AdminPortal/AdminPortal.esm.js +0 -65
  36. package/dist/components/Admin/AdminPortal/AdminPortal.esm.js.map +0 -1
  37. package/dist/components/Admin/AnnouncementsContent/AnnouncementForm/AnnouncementForm.esm.js.map +0 -1
  38. package/dist/components/Admin/AnnouncementsContent/AnnouncementForm/CategoryInput.esm.js.map +0 -1
  39. package/dist/components/Admin/AnnouncementsContent/AnnouncementForm/OnBehalfTeamDropdown.esm.js.map +0 -1
  40. package/dist/components/Admin/AnnouncementsContent/AnnouncementForm/TagsInput.esm.js.map +0 -1
  41. package/dist/components/Admin/AnnouncementsContent/AnnouncementsContent.esm.js +0 -305
  42. package/dist/components/Admin/AnnouncementsContent/AnnouncementsContent.esm.js.map +0 -1
  43. package/dist/components/Admin/CategoriesContent/CategoriesContent.esm.js +0 -143
  44. package/dist/components/Admin/CategoriesContent/CategoriesContent.esm.js.map +0 -1
  45. package/dist/components/Admin/TagsContent/TagsContent.esm.js +0 -158
  46. package/dist/components/Admin/TagsContent/TagsContent.esm.js.map +0 -1
  47. package/dist/components/Admin/index.esm.js +0 -3
  48. package/dist/components/Admin/index.esm.js.map +0 -1
  49. package/dist/components/Admin/shared/DeleteDialog/DeleteDialog.esm.js +0 -30
  50. package/dist/components/Admin/shared/DeleteDialog/DeleteDialog.esm.js.map +0 -1
  51. package/dist/components/Admin/shared/DeleteDialog/useDeleteDialogState.esm.js +0 -29
  52. package/dist/components/Admin/shared/DeleteDialog/useDeleteDialogState.esm.js.map +0 -1
  53. package/dist/components/Admin/shared/TitleForm/TitleForm.esm.js +0 -71
  54. package/dist/components/Admin/shared/TitleForm/TitleForm.esm.js.map +0 -1
  55. package/dist/components/AnnouncementPage/AnnouncementPage.esm.js +0 -99
  56. package/dist/components/AnnouncementPage/AnnouncementPage.esm.js.map +0 -1
  57. package/dist/components/AnnouncementsPage/AnnouncementsPage.esm.js +0 -197
  58. package/dist/components/AnnouncementsPage/AnnouncementsPage.esm.js.map +0 -1
  59. package/dist/components/AnnouncementsPage/ContextMenu.esm.js +0 -60
  60. package/dist/components/AnnouncementsPage/ContextMenu.esm.js.map +0 -1
  61. package/dist/components/AnnouncementsTimeline/AnnouncementsTimeline.esm.js +0 -75
  62. package/dist/components/AnnouncementsTimeline/AnnouncementsTimeline.esm.js.map +0 -1
  63. package/dist/components/Router.esm.js +0 -75
  64. package/dist/components/Router.esm.js.map +0 -1
  65. package/dist/components/index.esm.js +0 -5
  66. package/dist/components/index.esm.js.map +0 -1
  67. /package/dist/{components/Admin/AnnouncementsContent → alpha/components/admin/announcements}/AnnouncementForm/AnnouncementForm.esm.js +0 -0
  68. /package/dist/{components/Admin/AnnouncementsContent → alpha/components/admin/announcements}/AnnouncementForm/CategoryInput.esm.js +0 -0
  69. /package/dist/{components/Admin/AnnouncementsContent → alpha/components/admin/announcements}/AnnouncementForm/OnBehalfTeamDropdown.esm.js +0 -0
  70. /package/dist/{components/Admin/AnnouncementsContent → alpha/components/admin/announcements}/AnnouncementForm/TagsInput.esm.js +0 -0
@@ -1,45 +1,52 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
1
+ import { jsx } from 'react/jsx-runtime';
2
2
  import { useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';
3
- import { Table, TableHeader, Column, TableBody, Row, CellText, Cell, ButtonIcon } from '@backstage/ui';
3
+ import { CellText, Cell, ButtonIcon, useTable, Table, Text } from '@backstage/ui';
4
4
  import { RiDeleteBinLine } from '@remixicon/react';
5
+ import { useEffect } from 'react';
5
6
 
6
- const TagsTableEmptyState = () => {
7
- const { t } = useAnnouncementsTranslation();
8
- return /* @__PURE__ */ jsx(Row, { children: /* @__PURE__ */ jsx(CellText, { colSpan: 3, title: t("admin.tagsContent.table.noTagsFound") }) });
9
- };
10
- const TagTableRow = (props) => {
11
- const { tag, onDeleteClick } = props;
12
- return /* @__PURE__ */ jsxs(Row, { children: [
13
- /* @__PURE__ */ jsx(CellText, { title: tag.title }),
14
- /* @__PURE__ */ jsx(CellText, { title: tag.slug }),
15
- /* @__PURE__ */ jsx(Cell, { children: /* @__PURE__ */ jsx(
16
- ButtonIcon,
17
- {
18
- icon: /* @__PURE__ */ jsx(RiDeleteBinLine, {}),
19
- variant: "tertiary",
20
- onClick: () => onDeleteClick(tag)
21
- }
22
- ) })
23
- ] }, tag.slug);
24
- };
25
7
  const TagsTable = (props) => {
26
8
  const { data, onDeleteClick } = props;
27
9
  const { t } = useAnnouncementsTranslation();
28
- return /* @__PURE__ */ jsxs(Table, { children: [
29
- /* @__PURE__ */ jsxs(TableHeader, { children: [
30
- /* @__PURE__ */ jsx(Column, { id: "title", isRowHeader: true, children: t("admin.tagsContent.table.title") }),
31
- /* @__PURE__ */ jsx(Column, { id: "slug", children: t("admin.tagsContent.table.slug") }),
32
- /* @__PURE__ */ jsx(Column, { id: "actions", children: t("admin.tagsContent.table.actions") })
33
- ] }),
34
- /* @__PURE__ */ jsx(TableBody, { children: data.length > 0 ? data.map((tag) => /* @__PURE__ */ jsx(
35
- TagTableRow,
36
- {
37
- tag,
38
- onDeleteClick
39
- },
40
- tag.slug
41
- )) : /* @__PURE__ */ jsx(TagsTableEmptyState, {}) })
42
- ] });
10
+ const columns = [
11
+ {
12
+ id: "title",
13
+ label: t("admin.tagsContent.table.title"),
14
+ isRowHeader: true,
15
+ cell: (tag) => /* @__PURE__ */ jsx(CellText, { title: tag.title })
16
+ },
17
+ {
18
+ id: "slug",
19
+ label: t("admin.tagsContent.table.slug"),
20
+ cell: (tag) => /* @__PURE__ */ jsx(CellText, { title: tag.slug })
21
+ },
22
+ {
23
+ id: "actions",
24
+ label: t("admin.tagsContent.table.actions"),
25
+ cell: (tag) => /* @__PURE__ */ jsx(Cell, { children: /* @__PURE__ */ jsx(
26
+ ButtonIcon,
27
+ {
28
+ icon: /* @__PURE__ */ jsx(RiDeleteBinLine, {}),
29
+ variant: "tertiary",
30
+ onClick: () => onDeleteClick?.(tag)
31
+ }
32
+ ) })
33
+ }
34
+ ];
35
+ const { tableProps, reload } = useTable({
36
+ mode: "complete",
37
+ getData: () => data.map((tag) => ({ ...tag, id: tag.slug }))
38
+ });
39
+ useEffect(() => {
40
+ reload();
41
+ }, [data, reload]);
42
+ return /* @__PURE__ */ jsx(
43
+ Table,
44
+ {
45
+ columnConfig: columns,
46
+ emptyState: /* @__PURE__ */ jsx(Text, { children: t("admin.tagsContent.table.noTagsFound") }),
47
+ ...tableProps
48
+ }
49
+ );
43
50
  };
44
51
 
45
52
  export { TagsTable };
@@ -1 +1 @@
1
- {"version":3,"file":"TagsTable.esm.js","sources":["../../../../../src/alpha/components/admin/tags/TagsTable.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 */\n\nimport { Tag } from '@backstage-community/plugin-announcements-common';\nimport { useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';\nimport {\n CellText,\n Column,\n Row,\n Table,\n TableBody,\n TableHeader,\n Cell,\n ButtonIcon,\n} from '@backstage/ui';\nimport { RiDeleteBinLine } from '@remixicon/react';\n\nconst TagsTableEmptyState = () => {\n const { t } = useAnnouncementsTranslation();\n\n return (\n <Row>\n <CellText colSpan={3} title={t('admin.tagsContent.table.noTagsFound')} />\n </Row>\n );\n};\n\ntype TagTableRowProps = {\n tag: Tag;\n onDeleteClick?: (tag: Tag) => void;\n};\n\nconst TagTableRow = (props: TagTableRowProps) => {\n const { tag, onDeleteClick } = props;\n\n return (\n <Row key={tag.slug}>\n <CellText title={tag.title} />\n <CellText title={tag.slug} />\n <Cell>\n <ButtonIcon\n icon={<RiDeleteBinLine />}\n variant=\"tertiary\"\n onClick={() => onDeleteClick!(tag)}\n />\n </Cell>\n </Row>\n );\n};\n\n/**\n * @internal\n */\ntype TagsTableProps = {\n data: Tag[];\n onDeleteClick?: (tag: Tag) => void;\n};\n\n/**\n * @internal\n */\nexport const TagsTable = (props: TagsTableProps) => {\n const { data, onDeleteClick } = props;\n const { t } = useAnnouncementsTranslation();\n\n return (\n <Table>\n <TableHeader>\n <Column id=\"title\" isRowHeader>\n {t('admin.tagsContent.table.title')}\n </Column>\n <Column id=\"slug\">{t('admin.tagsContent.table.slug')}</Column>\n <Column id=\"actions\">{t('admin.tagsContent.table.actions')}</Column>\n </TableHeader>\n <TableBody>\n {data.length > 0 ? (\n data.map(tag => (\n <TagTableRow\n key={tag.slug}\n tag={tag}\n onDeleteClick={onDeleteClick}\n />\n ))\n ) : (\n <TagsTableEmptyState />\n )}\n </TableBody>\n </Table>\n );\n};\n"],"names":[],"mappings":";;;;;AA8BA,MAAM,sBAAsB,MAAM;AAChC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAE1C,EACE,uBAAA,GAAA,CAAC,GACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAS,EAAA,EAAA,OAAA,EAAS,GAAG,KAAO,EAAA,CAAA,CAAE,qCAAqC,CAAA,EAAG,CACzE,EAAA,CAAA;AAEJ,CAAA;AAOA,MAAM,WAAA,GAAc,CAAC,KAA4B,KAAA;AAC/C,EAAM,MAAA,EAAE,GAAK,EAAA,aAAA,EAAkB,GAAA,KAAA;AAE/B,EAAA,4BACG,GACC,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,QAAA,EAAA,EAAS,KAAO,EAAA,GAAA,CAAI,KAAO,EAAA,CAAA;AAAA,oBAC3B,GAAA,CAAA,QAAA,EAAA,EAAS,KAAO,EAAA,GAAA,CAAI,IAAM,EAAA,CAAA;AAAA,wBAC1B,IACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,IAAA,sBAAO,eAAgB,EAAA,EAAA,CAAA;AAAA,QACvB,OAAQ,EAAA,UAAA;AAAA,QACR,OAAA,EAAS,MAAM,aAAA,CAAe,GAAG;AAAA;AAAA,KAErC,EAAA;AAAA,GAAA,EAAA,EATQ,IAAI,IAUd,CAAA;AAEJ,CAAA;AAaa,MAAA,SAAA,GAAY,CAAC,KAA0B,KAAA;AAClD,EAAM,MAAA,EAAE,IAAM,EAAA,aAAA,EAAkB,GAAA,KAAA;AAChC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAE1C,EAAA,4BACG,KACC,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,WACC,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAO,EAAG,EAAA,OAAA,EAAQ,aAAW,IAC3B,EAAA,QAAA,EAAA,CAAA,CAAE,+BAA+B,CACpC,EAAA,CAAA;AAAA,0BACC,MAAO,EAAA,EAAA,EAAA,EAAG,MAAQ,EAAA,QAAA,EAAA,CAAA,CAAE,8BAA8B,CAAE,EAAA,CAAA;AAAA,0BACpD,MAAO,EAAA,EAAA,EAAA,EAAG,SAAW,EAAA,QAAA,EAAA,CAAA,CAAE,iCAAiC,CAAE,EAAA;AAAA,KAC7D,EAAA,CAAA;AAAA,wBACC,SACE,EAAA,EAAA,QAAA,EAAA,IAAA,CAAK,SAAS,CACb,GAAA,IAAA,CAAK,IAAI,CACP,GAAA,qBAAA,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QAEC,GAAA;AAAA,QACA;AAAA,OAAA;AAAA,MAFK,GAAI,CAAA;AAAA,KAIZ,CAAA,mBAEA,GAAA,CAAA,mBAAA,EAAA,EAAoB,CAEzB,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"TagsTable.esm.js","sources":["../../../../../src/alpha/components/admin/tags/TagsTable.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 */\n\nimport { Tag } from '@backstage-community/plugin-announcements-common';\nimport { useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';\nimport {\n CellText,\n Cell,\n ButtonIcon,\n Table,\n useTable,\n type ColumnConfig,\n TableItem,\n Text,\n} from '@backstage/ui';\nimport { RiDeleteBinLine } from '@remixicon/react';\nimport { useEffect } from 'react';\n\n/**\n * @internal\n */\ntype TagsTableProps = {\n data: Tag[];\n onDeleteClick?: (tag: Tag) => void;\n};\n\ntype TagTableItem = TableItem & Tag;\n\n/**\n * @internal\n */\nexport const TagsTable = (props: TagsTableProps) => {\n const { data, onDeleteClick } = props;\n const { t } = useAnnouncementsTranslation();\n\n const columns: ColumnConfig<TagTableItem>[] = [\n {\n id: 'title',\n label: t('admin.tagsContent.table.title'),\n isRowHeader: true,\n cell: tag => <CellText title={tag.title} />,\n },\n {\n id: 'slug',\n label: t('admin.tagsContent.table.slug'),\n cell: tag => <CellText title={tag.slug} />,\n },\n {\n id: 'actions',\n label: t('admin.tagsContent.table.actions'),\n cell: tag => (\n <Cell>\n <ButtonIcon\n icon={<RiDeleteBinLine />}\n variant=\"tertiary\"\n onClick={() => onDeleteClick?.(tag)}\n />\n </Cell>\n ),\n },\n ];\n\n const { tableProps, reload } = useTable({\n mode: 'complete',\n getData: () => data.map(tag => ({ ...tag, id: tag.slug })),\n });\n\n useEffect(() => {\n reload();\n }, [data, reload]);\n\n return (\n <Table\n columnConfig={columns}\n emptyState={<Text>{t('admin.tagsContent.table.noTagsFound')}</Text>}\n {...tableProps}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;AA4Ca,MAAA,SAAA,GAAY,CAAC,KAA0B,KAAA;AAClD,EAAM,MAAA,EAAE,IAAM,EAAA,aAAA,EAAkB,GAAA,KAAA;AAChC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAE1C,EAAA,MAAM,OAAwC,GAAA;AAAA,IAC5C;AAAA,MACE,EAAI,EAAA,OAAA;AAAA,MACJ,KAAA,EAAO,EAAE,+BAA+B,CAAA;AAAA,MACxC,WAAa,EAAA,IAAA;AAAA,MACb,MAAM,CAAO,GAAA,qBAAA,GAAA,CAAC,QAAS,EAAA,EAAA,KAAA,EAAO,IAAI,KAAO,EAAA;AAAA,KAC3C;AAAA,IACA;AAAA,MACE,EAAI,EAAA,MAAA;AAAA,MACJ,KAAA,EAAO,EAAE,8BAA8B,CAAA;AAAA,MACvC,MAAM,CAAO,GAAA,qBAAA,GAAA,CAAC,QAAS,EAAA,EAAA,KAAA,EAAO,IAAI,IAAM,EAAA;AAAA,KAC1C;AAAA,IACA;AAAA,MACE,EAAI,EAAA,SAAA;AAAA,MACJ,KAAA,EAAO,EAAE,iCAAiC,CAAA;AAAA,MAC1C,IAAA,EAAM,CACJ,GAAA,qBAAA,GAAA,CAAC,IACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,IAAA,sBAAO,eAAgB,EAAA,EAAA,CAAA;AAAA,UACvB,OAAQ,EAAA,UAAA;AAAA,UACR,OAAA,EAAS,MAAM,aAAA,GAAgB,GAAG;AAAA;AAAA,OAEtC,EAAA;AAAA;AAEJ,GACF;AAEA,EAAA,MAAM,EAAE,UAAA,EAAY,MAAO,EAAA,GAAI,QAAS,CAAA;AAAA,IACtC,IAAM,EAAA,UAAA;AAAA,IACN,OAAA,EAAS,MAAM,IAAA,CAAK,GAAI,CAAA,CAAA,GAAA,MAAQ,EAAE,GAAG,GAAK,EAAA,EAAA,EAAI,GAAI,CAAA,IAAA,EAAO,CAAA;AAAA,GAC1D,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAO,MAAA,EAAA;AAAA,GACN,EAAA,CAAC,IAAM,EAAA,MAAM,CAAC,CAAA;AAEjB,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,YAAc,EAAA,OAAA;AAAA,MACd,UAAY,kBAAA,GAAA,CAAC,IAAM,EAAA,EAAA,QAAA,EAAA,CAAA,CAAE,qCAAqC,CAAE,EAAA,CAAA;AAAA,MAC3D,GAAG;AAAA;AAAA,GACN;AAEJ;;;;"}
@@ -1,19 +1,11 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { useState, useMemo } from 'react';
3
2
  import { useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';
4
- import { Card, CardHeader, Flex, Text, Button, CardBody, CardFooter, TablePagination } from '@backstage/ui';
3
+ import { Card, CardHeader, Flex, Text, Button, CardBody } from '@backstage/ui';
5
4
  import { TagsTable } from './TagsTable.esm.js';
6
5
 
7
6
  const TagsTableCard = (props) => {
8
7
  const { tags, onCreateClick, onDeleteClick, canCreate, canDelete } = props;
9
- const [pageSize, setPageSize] = useState(5);
10
- const [offset, setOffset] = useState(0);
11
8
  const { t } = useAnnouncementsTranslation();
12
- const paginatedTags = useMemo(() => {
13
- const start = offset;
14
- const end = offset + pageSize;
15
- return tags.slice(start, end);
16
- }, [tags, offset, pageSize]);
17
9
  const title = `${t("tagsPage.title")} (${tags.length})`;
18
10
  return /* @__PURE__ */ jsxs(Card, { children: [
19
11
  /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(Flex, { justify: "between", align: "center", children: [
@@ -23,19 +15,9 @@ const TagsTableCard = (props) => {
23
15
  /* @__PURE__ */ jsx(CardBody, { children: /* @__PURE__ */ jsx(
24
16
  TagsTable,
25
17
  {
26
- data: paginatedTags,
18
+ data: tags,
27
19
  onDeleteClick: canDelete ? onDeleteClick : void 0
28
20
  }
29
- ) }),
30
- tags.length > 0 && /* @__PURE__ */ jsx(CardFooter, { children: /* @__PURE__ */ jsx(
31
- TablePagination,
32
- {
33
- offset,
34
- pageSize,
35
- setOffset,
36
- setPageSize,
37
- rowCount: tags.length
38
- }
39
21
  ) })
40
22
  ] });
41
23
  };
@@ -1 +1 @@
1
- {"version":3,"file":"TagsTableCard.esm.js","sources":["../../../../../src/alpha/components/admin/tags/TagsTableCard.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 { useState, useMemo } from 'react';\nimport { Tag } from '@backstage-community/plugin-announcements-common';\nimport { useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';\nimport {\n Button,\n TablePagination,\n Card,\n CardBody,\n CardFooter,\n CardHeader,\n Text,\n Flex,\n} from '@backstage/ui';\n\nimport { TagsTable } from './TagsTable';\n\n/**\n * @internal\n */\ntype TagsTableCardProps = {\n tags: Tag[];\n onCreateClick: () => void;\n onDeleteClick: (tag: Tag) => void;\n canCreate: boolean;\n canDelete: boolean;\n};\n\n/**\n * @internal\n */\nexport const TagsTableCard = (props: TagsTableCardProps) => {\n const { tags, onCreateClick, onDeleteClick, canCreate, canDelete } = props;\n\n const [pageSize, setPageSize] = useState(5);\n const [offset, setOffset] = useState(0);\n const { t } = useAnnouncementsTranslation();\n\n const paginatedTags = useMemo(() => {\n const start = offset;\n const end = offset + pageSize;\n return tags.slice(start, end);\n }, [tags, offset, pageSize]);\n\n const title = `${t('tagsPage.title')} (${tags.length})`;\n\n return (\n <Card>\n <CardHeader>\n <Flex justify=\"between\" align=\"center\">\n <Text variant=\"title-x-small\">{title}</Text>\n <Button isDisabled={!canCreate} onClick={onCreateClick}>\n {t('admin.tagsContent.createButton')}\n </Button>\n </Flex>\n </CardHeader>\n\n <CardBody>\n <TagsTable\n data={paginatedTags}\n onDeleteClick={canDelete ? onDeleteClick : undefined}\n />\n </CardBody>\n\n {tags.length > 0 && (\n <CardFooter>\n <TablePagination\n offset={offset}\n pageSize={pageSize}\n setOffset={setOffset}\n setPageSize={setPageSize}\n rowCount={tags.length}\n />\n </CardFooter>\n )}\n </Card>\n );\n};\n"],"names":[],"mappings":";;;;;;AA6Ca,MAAA,aAAA,GAAgB,CAAC,KAA8B,KAAA;AAC1D,EAAA,MAAM,EAAE,IAAM,EAAA,aAAA,EAAe,aAAe,EAAA,SAAA,EAAW,WAAc,GAAA,KAAA;AAErE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,CAAC,CAAA;AAC1C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,CAAC,CAAA;AACtC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAE1C,EAAM,MAAA,aAAA,GAAgB,QAAQ,MAAM;AAClC,IAAA,MAAM,KAAQ,GAAA,MAAA;AACd,IAAA,MAAM,MAAM,MAAS,GAAA,QAAA;AACrB,IAAO,OAAA,IAAA,CAAK,KAAM,CAAA,KAAA,EAAO,GAAG,CAAA;AAAA,GAC3B,EAAA,CAAC,IAAM,EAAA,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAE3B,EAAA,MAAM,QAAQ,CAAG,EAAA,CAAA,CAAE,gBAAgB,CAAC,CAAA,EAAA,EAAK,KAAK,MAAM,CAAA,CAAA,CAAA;AAEpD,EAAA,4BACG,IACC,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,cACC,QAAC,kBAAA,IAAA,CAAA,IAAA,EAAA,EAAK,OAAQ,EAAA,SAAA,EAAU,OAAM,QAC5B,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,IAAA,EAAA,EAAK,OAAQ,EAAA,eAAA,EAAiB,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,sBACrC,GAAA,CAAC,UAAO,UAAY,EAAA,CAAC,WAAW,OAAS,EAAA,aAAA,EACtC,QAAE,EAAA,CAAA,CAAA,gCAAgC,CACrC,EAAA;AAAA,KAAA,EACF,CACF,EAAA,CAAA;AAAA,wBAEC,QACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,IAAM,EAAA,aAAA;AAAA,QACN,aAAA,EAAe,YAAY,aAAgB,GAAA,KAAA;AAAA;AAAA,KAE/C,EAAA,CAAA;AAAA,IAEC,IAAK,CAAA,MAAA,GAAS,CACb,oBAAA,GAAA,CAAC,UACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAU,IAAK,CAAA;AAAA;AAAA,KAEnB,EAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"TagsTableCard.esm.js","sources":["../../../../../src/alpha/components/admin/tags/TagsTableCard.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 { Tag } from '@backstage-community/plugin-announcements-common';\nimport { useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';\nimport { Button, Card, CardBody, CardHeader, Text, Flex } from '@backstage/ui';\n\nimport { TagsTable } from './TagsTable';\n\n/**\n * @internal\n */\ntype TagsTableCardProps = {\n tags: Tag[];\n onCreateClick: () => void;\n onDeleteClick: (tag: Tag) => void;\n canCreate: boolean;\n canDelete: boolean;\n};\n\n/**\n * @internal\n */\nexport const TagsTableCard = (props: TagsTableCardProps) => {\n const { tags, onCreateClick, onDeleteClick, canCreate, canDelete } = props;\n\n const { t } = useAnnouncementsTranslation();\n\n const title = `${t('tagsPage.title')} (${tags.length})`;\n\n return (\n <Card>\n <CardHeader>\n <Flex justify=\"between\" align=\"center\">\n <Text variant=\"title-x-small\">{title}</Text>\n <Button isDisabled={!canCreate} onClick={onCreateClick}>\n {t('admin.tagsContent.createButton')}\n </Button>\n </Flex>\n </CardHeader>\n\n <CardBody>\n <TagsTable\n data={tags}\n onDeleteClick={canDelete ? onDeleteClick : undefined}\n />\n </CardBody>\n </Card>\n );\n};\n"],"names":[],"mappings":";;;;;AAmCa,MAAA,aAAA,GAAgB,CAAC,KAA8B,KAAA;AAC1D,EAAA,MAAM,EAAE,IAAM,EAAA,aAAA,EAAe,aAAe,EAAA,SAAA,EAAW,WAAc,GAAA,KAAA;AAErE,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAE1C,EAAA,MAAM,QAAQ,CAAG,EAAA,CAAA,CAAE,gBAAgB,CAAC,CAAA,EAAA,EAAK,KAAK,MAAM,CAAA,CAAA,CAAA;AAEpD,EAAA,4BACG,IACC,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,cACC,QAAC,kBAAA,IAAA,CAAA,IAAA,EAAA,EAAK,OAAQ,EAAA,SAAA,EAAU,OAAM,QAC5B,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,IAAA,EAAA,EAAK,OAAQ,EAAA,eAAA,EAAiB,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,sBACrC,GAAA,CAAC,UAAO,UAAY,EAAA,CAAC,WAAW,OAAS,EAAA,aAAA,EACtC,QAAE,EAAA,CAAA,CAAA,gCAAgC,CACrC,EAAA;AAAA,KAAA,EACF,CACF,EAAA,CAAA;AAAA,wBAEC,QACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,IAAM,EAAA,IAAA;AAAA,QACN,aAAA,EAAe,YAAY,aAAgB,GAAA,KAAA;AAAA;AAAA,KAE/C,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
@@ -9,36 +9,6 @@ import { RiPriceTag3Line, RiHashtag } from '@remixicon/react';
9
9
  import { EntityRefLink } from '@backstage/plugin-catalog-react';
10
10
  import { announcementsApiRef, useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';
11
11
  import { announcementViewRouteRef, rootRouteRef } from '../../../routes.esm.js';
12
- import 'react-router-dom';
13
- import '@backstage/core-components';
14
- import '@material-ui/core';
15
- import '@mui/material/Stack';
16
- import '../../../components/Admin/AdminPortal/AdminPortal.esm.js';
17
- import '@backstage-community/plugin-announcements-common';
18
- import 'react-use/esm/useAsyncRetry';
19
- import '@uiw/react-md-editor';
20
- import 'slugify';
21
- import '../../../components/Admin/AnnouncementsContent/AnnouncementForm/CategoryInput.esm.js';
22
- import '@mui/material/TextField';
23
- import '@mui/material/Autocomplete';
24
- import '@mui/material/CircularProgress';
25
- import 'react-use/esm/useAsync';
26
- import '@backstage/catalog-model';
27
- import '@mui/material/Box';
28
- import '@mui/material/Typography';
29
- import '../../../components/Admin/AnnouncementsContent/AnnouncementForm/TagsInput.esm.js';
30
- import '@mui/material/Button';
31
- import '@mui/material/Divider';
32
- import '@mui/material/FormControlLabel';
33
- import '@mui/material/FormGroup';
34
- import '@mui/material/Grid';
35
- import '@mui/material/Paper';
36
- import '@mui/icons-material/SaveAlt';
37
- import '@mui/material/Switch';
38
- import '@backstage/plugin-permission-react';
39
- import '@material-ui/icons/Delete';
40
- import '@material-ui/icons/Edit';
41
- import '@material-ui/icons/Visibility';
42
12
  import { MarkdownRenderer } from '../../../components/MarkdownRenderer/MarkdownRenderer.esm.js';
43
13
  import '@backstage/frontend-plugin-api';
44
14
  import { BackToAnnouncementsButton } from '../shared/BackToAnnouncementsButton/BackToAnnouncementsButton.esm.js';
@@ -1 +1 @@
1
- {"version":3,"file":"ViewAnnouncementPage.esm.js","sources":["../../../../src/alpha/components/announcements/ViewAnnouncementPage.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 { useEffect } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\nimport { DateTime } from 'luxon';\nimport {\n Card,\n CardBody,\n CardHeader,\n Container,\n Flex,\n HeaderPage,\n Link,\n Text,\n Grid,\n Box,\n Skeleton,\n Tag,\n TagGroup,\n} from '@backstage/ui';\nimport {\n useApi,\n useRouteRef,\n useRouteRefParams,\n useAnalytics,\n} from '@backstage/core-plugin-api';\nimport { Alert } from '@material-ui/lab';\nimport { RiHashtag, RiPriceTag3Line } from '@remixicon/react';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport {\n announcementsApiRef,\n useAnnouncementsTranslation,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n Announcement,\n Tag as AnnouncementTag,\n Category,\n} from '@backstage-community/plugin-announcements-common';\n\nimport { announcementViewRouteRef, rootRouteRef } from '../../../routes';\nimport {\n MarkdownRenderer,\n MarkdownRendererTypeProps,\n} from '../../../components';\nimport { BackToAnnouncementsButton } from '../shared';\n\nconst AnnouncementCategoryBadge = (props: {\n category: Category | undefined;\n}) => {\n const { category } = props;\n const announcementsLink = useRouteRef(rootRouteRef);\n\n if (!category) {\n return null;\n }\n\n return (\n <Link\n href={`${announcementsLink()}?category=${category.slug}`}\n color=\"secondary\"\n variant=\"body-small\"\n >\n <Flex align=\"center\" gap=\"2\">\n <RiPriceTag3Line size={16} /> {category?.title}\n </Flex>\n </Link>\n );\n};\n\nconst AnnouncementTagsTagGroup = (props: { tags: AnnouncementTag[] }) => {\n const announcementsLink = useRouteRef(rootRouteRef);\n const { t } = useAnnouncementsTranslation();\n return (\n <TagGroup aria-label={t('viewAnnouncementPage.tagsAriaLabel')}>\n {props.tags.map(tag => (\n <Tag\n key={tag.slug}\n size=\"small\"\n href={`${announcementsLink()}?tag=${tag.slug}`}\n >\n <RiHashtag size={10} /> {tag.title}\n </Tag>\n ))}\n </TagGroup>\n );\n};\n\ntype AnnouncementDetailsCardProps = {\n announcement: Announcement;\n markdownRenderer?: MarkdownRendererTypeProps;\n};\n\nconst AnnouncementDetailsCard = (props: AnnouncementDetailsCardProps) => {\n const { announcement, markdownRenderer } = props;\n const { title, category, body, created_at, on_behalf_of, publisher, tags } =\n announcement;\n\n const announcementsApi = useApi(announcementsApiRef);\n const analytics = useAnalytics();\n const { t } = useAnnouncementsTranslation();\n\n const lastSeen = announcementsApi.lastSeenDate();\n const announcementCreatedAt = DateTime.fromISO(created_at);\n\n if (announcementCreatedAt > lastSeen) {\n announcementsApi.markLastSeenDate(announcementCreatedAt);\n }\n\n useEffect(() => {\n if (!announcement) {\n return;\n }\n\n analytics.captureEvent('view', announcement.title, {\n attributes: {\n announcementId: announcement.id,\n location: 'AnnouncementPage',\n },\n });\n }, [analytics, announcement]);\n\n return (\n <Card>\n <Box\n style={{\n borderBottom: 'solid 1px #e0e0e0',\n paddingBottom: 16,\n paddingRight: 8,\n }}\n >\n <CardHeader>\n <Flex justify=\"between\" pb=\"3\">\n <AnnouncementCategoryBadge category={category} />\n\n <Text variant=\"body-small\" as=\"p\">\n {DateTime.fromISO(created_at).toRelative()}\n </Text>\n </Flex>\n <Text variant=\"title-medium\" as=\"h2\">\n {title}\n </Text>\n\n <Text variant=\"body-small\" as=\"p\">\n {t('viewAnnouncementPage.by')}{' '}\n <EntityRefLink entityRef={on_behalf_of || publisher} hideIcon />\n </Text>\n </CardHeader>\n </Box>\n\n <CardBody>\n <AnnouncementTagsTagGroup tags={tags ?? []} />\n <MarkdownRenderer content={body} rendererType={markdownRenderer} />\n </CardBody>\n </Card>\n );\n};\n\ntype ViewAnnouncementPageProps = {\n title: string;\n markdownRenderer?: MarkdownRendererTypeProps;\n};\n\nexport const ViewAnnouncementPage = (props: ViewAnnouncementPageProps) => {\n const { id } = useRouteRefParams(announcementViewRouteRef);\n const announcementsApi = useApi(announcementsApiRef);\n const { t } = useAnnouncementsTranslation();\n\n const announcementsLink = useRouteRef(rootRouteRef);\n\n const {\n value: announcement,\n loading,\n error,\n } = useAsync(async () => announcementsApi.announcementByID(id), [id]);\n\n if (loading) {\n return <Skeleton />;\n } else if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n } else if (!announcement) {\n return <Alert severity=\"error\">{t('viewAnnouncementPage.notFound')}</Alert>;\n }\n\n return (\n <>\n <HeaderPage\n title={`${announcement.title ?? ''}`}\n breadcrumbs={[\n {\n label: t('viewAnnouncementPage.announcements'),\n href: announcementsLink(),\n },\n ]}\n />\n\n <Container>\n <Grid.Root columns=\"1\">\n <Grid.Item>\n <AnnouncementDetailsCard\n announcement={announcement}\n markdownRenderer={props.markdownRenderer}\n />\n </Grid.Item>\n\n <Grid.Item>\n <Box mb=\"8\">\n <BackToAnnouncementsButton />\n </Box>\n </Grid.Item>\n </Grid.Root>\n </Container>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ViewAnnouncementPage.esm.js","sources":["../../../../src/alpha/components/announcements/ViewAnnouncementPage.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 { useEffect } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\nimport { DateTime } from 'luxon';\nimport {\n Card,\n CardBody,\n CardHeader,\n Container,\n Flex,\n HeaderPage,\n Link,\n Text,\n Grid,\n Box,\n Skeleton,\n Tag,\n TagGroup,\n} from '@backstage/ui';\nimport {\n useApi,\n useRouteRef,\n useRouteRefParams,\n useAnalytics,\n} from '@backstage/core-plugin-api';\nimport { Alert } from '@material-ui/lab';\nimport { RiHashtag, RiPriceTag3Line } from '@remixicon/react';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport {\n announcementsApiRef,\n useAnnouncementsTranslation,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n Announcement,\n Tag as AnnouncementTag,\n Category,\n} from '@backstage-community/plugin-announcements-common';\n\nimport { announcementViewRouteRef, rootRouteRef } from '../../../routes';\nimport {\n MarkdownRenderer,\n MarkdownRendererTypeProps,\n} from '../../../components';\nimport { BackToAnnouncementsButton } from '../shared';\n\nconst AnnouncementCategoryBadge = (props: {\n category: Category | undefined;\n}) => {\n const { category } = props;\n const announcementsLink = useRouteRef(rootRouteRef);\n\n if (!category) {\n return null;\n }\n\n return (\n <Link\n href={`${announcementsLink()}?category=${category.slug}`}\n color=\"secondary\"\n variant=\"body-small\"\n >\n <Flex align=\"center\" gap=\"2\">\n <RiPriceTag3Line size={16} /> {category?.title}\n </Flex>\n </Link>\n );\n};\n\nconst AnnouncementTagsTagGroup = (props: { tags: AnnouncementTag[] }) => {\n const announcementsLink = useRouteRef(rootRouteRef);\n const { t } = useAnnouncementsTranslation();\n return (\n <TagGroup aria-label={t('viewAnnouncementPage.tagsAriaLabel')}>\n {props.tags.map(tag => (\n <Tag\n key={tag.slug}\n size=\"small\"\n href={`${announcementsLink()}?tag=${tag.slug}`}\n >\n <RiHashtag size={10} /> {tag.title}\n </Tag>\n ))}\n </TagGroup>\n );\n};\n\ntype AnnouncementDetailsCardProps = {\n announcement: Announcement;\n markdownRenderer?: MarkdownRendererTypeProps;\n};\n\nconst AnnouncementDetailsCard = (props: AnnouncementDetailsCardProps) => {\n const { announcement, markdownRenderer } = props;\n const { title, category, body, created_at, on_behalf_of, publisher, tags } =\n announcement;\n\n const announcementsApi = useApi(announcementsApiRef);\n const analytics = useAnalytics();\n const { t } = useAnnouncementsTranslation();\n\n const lastSeen = announcementsApi.lastSeenDate();\n const announcementCreatedAt = DateTime.fromISO(created_at);\n\n if (announcementCreatedAt > lastSeen) {\n announcementsApi.markLastSeenDate(announcementCreatedAt);\n }\n\n useEffect(() => {\n if (!announcement) {\n return;\n }\n\n analytics.captureEvent('view', announcement.title, {\n attributes: {\n announcementId: announcement.id,\n location: 'AnnouncementPage',\n },\n });\n }, [analytics, announcement]);\n\n return (\n <Card>\n <Box\n style={{\n borderBottom: 'solid 1px #e0e0e0',\n paddingBottom: 16,\n paddingRight: 8,\n }}\n >\n <CardHeader>\n <Flex justify=\"between\" pb=\"3\">\n <AnnouncementCategoryBadge category={category} />\n\n <Text variant=\"body-small\" as=\"p\">\n {DateTime.fromISO(created_at).toRelative()}\n </Text>\n </Flex>\n <Text variant=\"title-medium\" as=\"h2\">\n {title}\n </Text>\n\n <Text variant=\"body-small\" as=\"p\">\n {t('viewAnnouncementPage.by')}{' '}\n <EntityRefLink entityRef={on_behalf_of || publisher} hideIcon />\n </Text>\n </CardHeader>\n </Box>\n\n <CardBody>\n <AnnouncementTagsTagGroup tags={tags ?? []} />\n <MarkdownRenderer content={body} rendererType={markdownRenderer} />\n </CardBody>\n </Card>\n );\n};\n\ntype ViewAnnouncementPageProps = {\n title: string;\n markdownRenderer?: MarkdownRendererTypeProps;\n};\n\nexport const ViewAnnouncementPage = (props: ViewAnnouncementPageProps) => {\n const { id } = useRouteRefParams(announcementViewRouteRef);\n const announcementsApi = useApi(announcementsApiRef);\n const { t } = useAnnouncementsTranslation();\n\n const announcementsLink = useRouteRef(rootRouteRef);\n\n const {\n value: announcement,\n loading,\n error,\n } = useAsync(async () => announcementsApi.announcementByID(id), [id]);\n\n if (loading) {\n return <Skeleton />;\n } else if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n } else if (!announcement) {\n return <Alert severity=\"error\">{t('viewAnnouncementPage.notFound')}</Alert>;\n }\n\n return (\n <>\n <HeaderPage\n title={`${announcement.title ?? ''}`}\n breadcrumbs={[\n {\n label: t('viewAnnouncementPage.announcements'),\n href: announcementsLink(),\n },\n ]}\n />\n\n <Container>\n <Grid.Root columns=\"1\">\n <Grid.Item>\n <AnnouncementDetailsCard\n announcement={announcement}\n markdownRenderer={props.markdownRenderer}\n />\n </Grid.Item>\n\n <Grid.Item>\n <Box mb=\"8\">\n <BackToAnnouncementsButton />\n </Box>\n </Grid.Item>\n </Grid.Root>\n </Container>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ const announcementsPage = PageBlueprint.make({
7
7
  params: {
8
8
  path: "/announcements",
9
9
  routeRef: convertLegacyRouteRef(rootRouteRef),
10
- loader: async () => import('./Router.esm.js').then((m) => compatWrapper(/* @__PURE__ */ jsx(m.Router, {})))
10
+ loader: async () => import('../Router.esm.js').then((m) => compatWrapper(/* @__PURE__ */ jsx(m.Router, {})))
11
11
  }
12
12
  });
13
13
 
@@ -1 +1 @@
1
- {"version":3,"file":"pages.esm.js","sources":["../../src/alpha/pages.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 {\n compatWrapper,\n convertLegacyRouteRef,\n} from '@backstage/core-compat-api';\nimport { PageBlueprint } from '@backstage/frontend-plugin-api';\nimport { rootRouteRef } from '../routes';\n\n/**\n * @alpha\n */\nexport const announcementsPage = PageBlueprint.make({\n params: {\n path: '/announcements',\n routeRef: convertLegacyRouteRef(rootRouteRef),\n loader: async () =>\n import('./Router').then(m => compatWrapper(<m.Router />)),\n },\n});\n"],"names":[],"mappings":";;;;;AAyBa,MAAA,iBAAA,GAAoB,cAAc,IAAK,CAAA;AAAA,EAClD,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,gBAAA;AAAA,IACN,QAAA,EAAU,sBAAsB,YAAY,CAAA;AAAA,IAC5C,MAAQ,EAAA,YACN,OAAO,iBAAU,CAAE,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,aAAA,iBAAe,GAAA,CAAA,CAAA,CAAE,MAAF,EAAA,EAAS,CAAE,CAAC;AAAA;AAE9D,CAAC;;;;"}
1
+ {"version":3,"file":"pages.esm.js","sources":["../../src/alpha/pages.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 {\n compatWrapper,\n convertLegacyRouteRef,\n} from '@backstage/core-compat-api';\nimport { PageBlueprint } from '@backstage/frontend-plugin-api';\nimport { rootRouteRef } from '../routes';\n\n/**\n * @alpha\n */\nexport const announcementsPage = PageBlueprint.make({\n params: {\n path: '/announcements',\n routeRef: convertLegacyRouteRef(rootRouteRef),\n loader: async () =>\n import('../Router').then(m => compatWrapper(<m.Router />)),\n },\n});\n"],"names":[],"mappings":";;;;;AAyBa,MAAA,iBAAA,GAAoB,cAAc,IAAK,CAAA;AAAA,EAClD,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,gBAAA;AAAA,IACN,QAAA,EAAU,sBAAsB,YAAY,CAAA;AAAA,IAC5C,MAAQ,EAAA,YACN,OAAO,kBAAW,CAAE,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,aAAA,iBAAe,GAAA,CAAA,CAAA,CAAE,MAAF,EAAA,EAAS,CAAE,CAAC;AAAA;AAE/D,CAAC;;;;"}
@@ -1,20 +1,22 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { SearchResultListItemBlueprint, SearchFilterResultTypeBlueprint } from '@backstage/plugin-search-react/alpha';
3
- import NewReleasesIcon from '@material-ui/icons/NewReleases';
3
+ import RecordVoiceOverIcon from '@material-ui/icons/RecordVoiceOver';
4
4
 
5
5
  const announcementsSearchResultListItem = SearchResultListItemBlueprint.make({
6
6
  params: {
7
7
  component: () => import('../components/AnnouncementSearchResultListItem/index.esm.js').then(
8
8
  (m) => m.AnnouncementSearchResultListItem
9
9
  ),
10
- predicate: (result) => result.type === "announcements"
10
+ predicate: (result) => result.type === "announcements",
11
+ icon: /* @__PURE__ */ jsx(RecordVoiceOverIcon, {})
11
12
  }
12
13
  });
13
14
  const announcementsSearchFilterResultType = SearchFilterResultTypeBlueprint.make({
15
+ name: "announcements-results-type",
14
16
  params: {
15
17
  name: "Announcements",
16
18
  value: "announcements",
17
- icon: /* @__PURE__ */ jsx(NewReleasesIcon, {})
19
+ icon: /* @__PURE__ */ jsx(RecordVoiceOverIcon, {})
18
20
  }
19
21
  });
20
22
 
@@ -1 +1 @@
1
- {"version":3,"file":"search.esm.js","sources":["../../src/alpha/search.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 {\n SearchFilterResultTypeBlueprint,\n SearchResultListItemBlueprint,\n} from '@backstage/plugin-search-react/alpha';\nimport NewReleasesIcon from '@material-ui/icons/NewReleases';\n\nexport const announcementsSearchResultListItem =\n SearchResultListItemBlueprint.make({\n params: {\n component: () =>\n import('../components/AnnouncementSearchResultListItem').then(\n m => m.AnnouncementSearchResultListItem,\n ),\n predicate: result => result.type === 'announcements',\n },\n });\n\nexport const announcementsSearchFilterResultType =\n SearchFilterResultTypeBlueprint.make({\n params: {\n name: 'Announcements',\n value: 'announcements',\n icon: <NewReleasesIcon />,\n },\n });\n"],"names":[],"mappings":";;;;AAqBa,MAAA,iCAAA,GACX,8BAA8B,IAAK,CAAA;AAAA,EACjC,MAAQ,EAAA;AAAA,IACN,SAAW,EAAA,MACT,OAAO,6DAAgD,CAAE,CAAA,IAAA;AAAA,MACvD,OAAK,CAAE,CAAA;AAAA,KACT;AAAA,IACF,SAAA,EAAW,CAAU,MAAA,KAAA,MAAA,CAAO,IAAS,KAAA;AAAA;AAEzC,CAAC;AAEU,MAAA,mCAAA,GACX,gCAAgC,IAAK,CAAA;AAAA,EACnC,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,eAAA;AAAA,IACN,KAAO,EAAA,eAAA;AAAA,IACP,IAAA,sBAAO,eAAgB,EAAA,EAAA;AAAA;AAE3B,CAAC;;;;"}
1
+ {"version":3,"file":"search.esm.js","sources":["../../src/alpha/search.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 {\n SearchFilterResultTypeBlueprint,\n SearchResultListItemBlueprint,\n} from '@backstage/plugin-search-react/alpha';\nimport RecordVoiceOverIcon from '@material-ui/icons/RecordVoiceOver';\n\nexport const announcementsSearchResultListItem =\n SearchResultListItemBlueprint.make({\n params: {\n component: () =>\n import('../components/AnnouncementSearchResultListItem').then(\n m => m.AnnouncementSearchResultListItem,\n ),\n predicate: result => result.type === 'announcements',\n icon: <RecordVoiceOverIcon />,\n },\n });\n\nexport const announcementsSearchFilterResultType =\n SearchFilterResultTypeBlueprint.make({\n name: 'announcements-results-type',\n params: {\n name: 'Announcements',\n value: 'announcements',\n icon: <RecordVoiceOverIcon />,\n },\n });\n"],"names":[],"mappings":";;;;AAqBa,MAAA,iCAAA,GACX,8BAA8B,IAAK,CAAA;AAAA,EACjC,MAAQ,EAAA;AAAA,IACN,SAAW,EAAA,MACT,OAAO,6DAAgD,CAAE,CAAA,IAAA;AAAA,MACvD,OAAK,CAAE,CAAA;AAAA,KACT;AAAA,IACF,SAAA,EAAW,CAAU,MAAA,KAAA,MAAA,CAAO,IAAS,KAAA,eAAA;AAAA,IACrC,IAAA,sBAAO,mBAAoB,EAAA,EAAA;AAAA;AAE/B,CAAC;AAEU,MAAA,mCAAA,GACX,gCAAgC,IAAK,CAAA;AAAA,EACnC,IAAM,EAAA,4BAAA;AAAA,EACN,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,eAAA;AAAA,IACN,KAAO,EAAA,eAAA;AAAA,IACP,IAAA,sBAAO,mBAAoB,EAAA,EAAA;AAAA;AAE/B,CAAC;;;;"}
package/dist/alpha.d.ts CHANGED
@@ -109,9 +109,9 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
109
109
  routeRef?: _backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams> | undefined;
110
110
  };
111
111
  }>;
112
- "search-filter-result-type:announcements": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
112
+ "search-filter-result-type:announcements/announcements-results-type": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
113
113
  kind: "search-filter-result-type";
114
- name: undefined;
114
+ name: "announcements-results-type";
115
115
  config: {};
116
116
  configInput: {};
117
117
  output: _backstage_frontend_plugin_api.ExtensionDataRef<{
package/dist/index.d.ts CHANGED
@@ -5,51 +5,6 @@ import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
5
5
  import { JSX } from 'react';
6
6
  import { SearchResultListItemExtensionProps } from '@backstage/plugin-search-react';
7
7
 
8
- /**
9
- * Props for the AnnouncementsTimeline component.
10
- *
11
- * @public
12
- */
13
- type AnnouncementsTimelineProps = {
14
- /**
15
- * The maximum number of results to display.
16
- * Default: 10
17
- */
18
- maxResults?: number;
19
- /**
20
- * The alignment of the timeline items. Can be 'left', 'right', or 'alternate'.
21
- * Default: 'alternate'
22
- */
23
- timelineAlignment?: 'left' | 'right' | 'alternate';
24
- /**
25
- * The minimum width of the timeline.
26
- * Default: '425px'
27
- */
28
- timelineMinWidth?: string;
29
- /**
30
- * Whether to only show active announcements.
31
- * Default: false
32
- */
33
- hideInactive?: boolean;
34
- /**
35
- * The field by which date time to sort the announcements.
36
- * Can be 'created_at' or 'start_at'.
37
- * Default: 'created_at'
38
- */
39
- sortBy?: 'created_at' | 'start_at';
40
- /**
41
- * The order in which to sort the announcements.
42
- * Can be 'asc' for ascending (older first) or 'desc' for descending (new first).
43
- * Default: 'desc'
44
- */
45
- order?: 'asc' | 'desc';
46
- /**
47
- * Whether to show current announcements or not.
48
- * Default: false
49
- */
50
- current?: boolean;
51
- };
52
-
53
8
  /** @public */
54
9
  interface AnnouncementSearchResultProps {
55
10
  result?: IndexableDocument;
@@ -77,46 +32,12 @@ declare const announcementsPlugin: _backstage_core_plugin_api.BackstagePlugin<{
77
32
  * @public
78
33
  */
79
34
  declare const AnnouncementsPage: (props: {
80
- themeId?: string | undefined;
81
35
  title?: string | undefined;
82
- subtitle?: string | undefined;
83
36
  category?: string | undefined;
84
- hideContextMenu?: boolean | undefined;
85
- cardOptions?: {
86
- titleLength: number | undefined;
87
- } | undefined;
88
- buttonOptions?: {
89
- name: string | undefined;
90
- } | undefined;
91
- hideInactive?: boolean | undefined;
92
37
  hideStartAt?: boolean | undefined;
93
38
  markdownRenderer?: MarkdownRendererTypeProps | undefined;
94
39
  defaultInactive?: boolean | undefined;
95
40
  }) => react_jsx_runtime.JSX.Element;
96
- /**
97
- * @public @deprecated
98
- *
99
- * This exported component will not be migrated to new frontend system.
100
- *
101
- * Access will be via the context menu on the root announcements page and dedicated routes
102
- * (`/announcements/admin`, `/announcements/admin/categories`, `/announcements/admin/tags`)
103
- *
104
- * Please open an issue if you have concerns about this.
105
- */
106
- declare const AnnouncementsAdminPortal: (props?: {
107
- themeId?: string | undefined;
108
- title?: string | undefined;
109
- subtitle?: string | undefined;
110
- defaultInactive?: boolean | undefined;
111
- } | undefined) => react_jsx_runtime.JSX.Element;
112
- /**
113
- * @public @deprecated
114
- *
115
- * This exported component will not be migrated to new frontend system.
116
- *
117
- * Please open an issue if you have concerns about this.
118
- */
119
- declare const AnnouncementsTimeline: ({ maxResults, timelineAlignment, timelineMinWidth, hideInactive, sortBy, order, current, }: AnnouncementsTimelineProps) => react_jsx_runtime.JSX.Element;
120
41
  /**
121
42
  * @public
122
43
  */
@@ -152,4 +73,4 @@ declare const NewAnnouncementBanner: (props: {
152
73
  */
153
74
  declare const AnnouncementSearchResultListItem: (props: SearchResultListItemExtensionProps<AnnouncementSearchResultProps>) => JSX.Element | null;
154
75
 
155
- export { AnnouncementSearchResultListItem, type AnnouncementSearchResultProps, AnnouncementsAdminPortal, AnnouncementsCard, AnnouncementsPage, AnnouncementsTimeline, type AnnouncementsTimelineProps, type MarkdownRendererTypeProps, NewAnnouncementBanner, announcementsPlugin };
76
+ export { AnnouncementSearchResultListItem, type AnnouncementSearchResultProps, AnnouncementsCard, AnnouncementsPage, type MarkdownRendererTypeProps, NewAnnouncementBanner, announcementsPlugin };
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- export { AnnouncementSearchResultListItem, AnnouncementsAdminPortal, AnnouncementsCard, AnnouncementsPage, AnnouncementsTimeline, NewAnnouncementBanner, announcementsPlugin } from './plugin.esm.js';
1
+ export { AnnouncementSearchResultListItem, AnnouncementsCard, AnnouncementsPage, NewAnnouncementBanner, announcementsPlugin } from './plugin.esm.js';
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -31,26 +31,10 @@ const announcementsPlugin = createPlugin({
31
31
  const AnnouncementsPage = announcementsPlugin.provide(
32
32
  createRoutableExtension({
33
33
  name: "AnnouncementsPage",
34
- component: () => import('./components/Router.esm.js').then((m) => m.Router),
34
+ component: () => import('./Router.esm.js').then((m) => m.OldFrontendSystemCompatibleRouter),
35
35
  mountPoint: rootRouteRef
36
36
  })
37
37
  );
38
- const AnnouncementsAdminPortal = announcementsPlugin.provide(
39
- createComponentExtension({
40
- name: "AnnouncementsAdminPortal",
41
- component: {
42
- lazy: () => import('./components/Admin/index.esm.js').then((m) => m.AdminPortal)
43
- }
44
- })
45
- );
46
- const AnnouncementsTimeline = announcementsPlugin.provide(
47
- createComponentExtension({
48
- name: "AnnouncementsTimeline",
49
- component: {
50
- lazy: () => import('./components/index.esm.js').then((m) => m.AnnouncementsTimeline)
51
- }
52
- })
53
- );
54
38
  const AnnouncementsCard = announcementsPlugin.provide(
55
39
  createComponentExtension({
56
40
  name: "AnnouncementsCard",
@@ -79,5 +63,5 @@ const AnnouncementSearchResultListItem = announcementsPlugin.provide(
79
63
  })
80
64
  );
81
65
 
82
- export { AnnouncementSearchResultListItem, AnnouncementsAdminPortal, AnnouncementsCard, AnnouncementsPage, AnnouncementsTimeline, NewAnnouncementBanner, announcementsPlugin };
66
+ export { AnnouncementSearchResultListItem, AnnouncementsCard, AnnouncementsPage, NewAnnouncementBanner, announcementsPlugin };
83
67
  //# sourceMappingURL=plugin.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"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 { JSX } from 'react';\nimport {\n createApiFactory,\n createComponentExtension,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n errorApiRef,\n identityApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n createSearchResultListItemExtension,\n SearchResultListItemExtensionProps,\n} from '@backstage/plugin-search-react';\nimport { AnnouncementSearchResultProps } from './components/AnnouncementSearchResultListItem';\nimport { rootRouteRef } from './routes';\nimport {\n announcementsApiRef,\n AnnouncementsClient,\n} from '@backstage-community/plugin-announcements-react';\n\n/**\n * @public\n */\nexport const announcementsPlugin = createPlugin({\n id: 'announcements',\n routes: {\n root: rootRouteRef,\n },\n apis: [\n createApiFactory({\n api: announcementsApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n identityApi: identityApiRef,\n errorApi: errorApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ discoveryApi, identityApi, errorApi, fetchApi }) => {\n return new AnnouncementsClient({\n discoveryApi: discoveryApi,\n identityApi: identityApi,\n errorApi: errorApi,\n fetchApi: fetchApi,\n });\n },\n }),\n ],\n});\n\n/**\n * @public\n */\nexport const AnnouncementsPage = announcementsPlugin.provide(\n createRoutableExtension({\n name: 'AnnouncementsPage',\n component: () => import('./components/Router').then(m => m.Router),\n mountPoint: rootRouteRef,\n }),\n);\n\n/**\n * @public @deprecated\n *\n * This exported component will not be migrated to new frontend system.\n *\n * Access will be via the context menu on the root announcements page and dedicated routes\n * (`/announcements/admin`, `/announcements/admin/categories`, `/announcements/admin/tags`)\n *\n * Please open an issue if you have concerns about this.\n */\nexport const AnnouncementsAdminPortal = announcementsPlugin.provide(\n createComponentExtension({\n name: 'AnnouncementsAdminPortal',\n component: {\n lazy: () => import('./components/Admin').then(m => m.AdminPortal),\n },\n }),\n);\n\n/**\n * @public @deprecated\n *\n * This exported component will not be migrated to new frontend system.\n *\n * Please open an issue if you have concerns about this.\n */\nexport const AnnouncementsTimeline = announcementsPlugin.provide(\n createComponentExtension({\n name: 'AnnouncementsTimeline',\n component: {\n lazy: () => import('./components').then(m => m.AnnouncementsTimeline),\n },\n }),\n);\n\n/**\n * @public\n */\nexport const AnnouncementsCard = announcementsPlugin.provide(\n createComponentExtension({\n name: 'AnnouncementsCard',\n component: {\n lazy: () =>\n import('./components/AnnouncementsCard').then(m => m.AnnouncementsCard),\n },\n }),\n);\n\n/**\n * @public\n */\nexport const NewAnnouncementBanner = announcementsPlugin.provide(\n createComponentExtension({\n name: 'NewAnnouncementBanner',\n component: {\n lazy: () =>\n import('./components/NewAnnouncementBanner').then(\n m => m.NewAnnouncementBanner,\n ),\n },\n }),\n);\n\n/**\n * @public\n */\nexport const AnnouncementSearchResultListItem: (\n props: SearchResultListItemExtensionProps<AnnouncementSearchResultProps>,\n) => JSX.Element | null = announcementsPlugin.provide(\n createSearchResultListItemExtension({\n name: 'AnnouncementSearchResultListItem',\n component: () =>\n import('./components/AnnouncementSearchResultListItem').then(\n m => m.AnnouncementSearchResultListItem,\n ),\n predicate: result => result.type === 'announcements',\n }),\n);\n"],"names":[],"mappings":";;;;;AAwCO,MAAM,sBAAsB,YAAa,CAAA;AAAA,EAC9C,EAAI,EAAA,eAAA;AAAA,EACJ,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA;AAAA,GACR;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,mBAAA;AAAA,MACL,IAAM,EAAA;AAAA,QACJ,YAAc,EAAA,eAAA;AAAA,QACd,WAAa,EAAA,cAAA;AAAA,QACb,QAAU,EAAA,WAAA;AAAA,QACV,QAAU,EAAA;AAAA,OACZ;AAAA,MACA,SAAS,CAAC,EAAE,cAAc,WAAa,EAAA,QAAA,EAAU,UAAe,KAAA;AAC9D,QAAA,OAAO,IAAI,mBAAoB,CAAA;AAAA,UAC7B,YAAA;AAAA,UACA,WAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA;AACH,KACD;AAAA;AAEL,CAAC;AAKM,MAAM,oBAAoB,mBAAoB,CAAA,OAAA;AAAA,EACnD,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,mBAAA;AAAA,IACN,SAAA,EAAW,MAAM,OAAO,4BAAqB,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,MAAM,CAAA;AAAA,IACjE,UAAY,EAAA;AAAA,GACb;AACH;AAYO,MAAM,2BAA2B,mBAAoB,CAAA,OAAA;AAAA,EAC1D,wBAAyB,CAAA;AAAA,IACvB,IAAM,EAAA,0BAAA;AAAA,IACN,SAAW,EAAA;AAAA,MACT,IAAA,EAAM,MAAM,OAAO,iCAAoB,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,WAAW;AAAA;AAClE,GACD;AACH;AASO,MAAM,wBAAwB,mBAAoB,CAAA,OAAA;AAAA,EACvD,wBAAyB,CAAA;AAAA,IACvB,IAAM,EAAA,uBAAA;AAAA,IACN,SAAW,EAAA;AAAA,MACT,IAAA,EAAM,MAAM,OAAO,2BAAc,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,qBAAqB;AAAA;AACtE,GACD;AACH;AAKO,MAAM,oBAAoB,mBAAoB,CAAA,OAAA;AAAA,EACnD,wBAAyB,CAAA;AAAA,IACvB,IAAM,EAAA,mBAAA;AAAA,IACN,SAAW,EAAA;AAAA,MACT,IAAA,EAAM,MACJ,OAAO,6CAAgC,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,iBAAiB;AAAA;AAC1E,GACD;AACH;AAKO,MAAM,wBAAwB,mBAAoB,CAAA,OAAA;AAAA,EACvD,wBAAyB,CAAA;AAAA,IACvB,IAAM,EAAA,uBAAA;AAAA,IACN,SAAW,EAAA;AAAA,MACT,IAAM,EAAA,MACJ,OAAO,iDAAoC,CAAE,CAAA,IAAA;AAAA,QAC3C,OAAK,CAAE,CAAA;AAAA;AACT;AACJ,GACD;AACH;AAKO,MAAM,mCAEa,mBAAoB,CAAA,OAAA;AAAA,EAC5C,mCAAoC,CAAA;AAAA,IAClC,IAAM,EAAA,kCAAA;AAAA,IACN,SAAW,EAAA,MACT,OAAO,4DAA+C,CAAE,CAAA,IAAA;AAAA,MACtD,OAAK,CAAE,CAAA;AAAA,KACT;AAAA,IACF,SAAA,EAAW,CAAU,MAAA,KAAA,MAAA,CAAO,IAAS,KAAA;AAAA,GACtC;AACH;;;;"}
1
+ {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"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 { JSX } from 'react';\nimport {\n createApiFactory,\n createComponentExtension,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n errorApiRef,\n identityApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n createSearchResultListItemExtension,\n SearchResultListItemExtensionProps,\n} from '@backstage/plugin-search-react';\nimport { AnnouncementSearchResultProps } from './components/AnnouncementSearchResultListItem';\nimport { rootRouteRef } from './routes';\nimport {\n announcementsApiRef,\n AnnouncementsClient,\n} from '@backstage-community/plugin-announcements-react';\n\n/**\n * @public\n */\nexport const announcementsPlugin = createPlugin({\n id: 'announcements',\n routes: {\n root: rootRouteRef,\n },\n apis: [\n createApiFactory({\n api: announcementsApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n identityApi: identityApiRef,\n errorApi: errorApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ discoveryApi, identityApi, errorApi, fetchApi }) => {\n return new AnnouncementsClient({\n discoveryApi: discoveryApi,\n identityApi: identityApi,\n errorApi: errorApi,\n fetchApi: fetchApi,\n });\n },\n }),\n ],\n});\n\n/**\n * @public\n */\nexport const AnnouncementsPage = announcementsPlugin.provide(\n createRoutableExtension({\n name: 'AnnouncementsPage',\n component: () =>\n import('./Router').then(m => m.OldFrontendSystemCompatibleRouter),\n mountPoint: rootRouteRef,\n }),\n);\n\n/**\n * @public\n */\nexport const AnnouncementsCard = announcementsPlugin.provide(\n createComponentExtension({\n name: 'AnnouncementsCard',\n component: {\n lazy: () =>\n import('./components/AnnouncementsCard').then(m => m.AnnouncementsCard),\n },\n }),\n);\n\n/**\n * @public\n */\nexport const NewAnnouncementBanner = announcementsPlugin.provide(\n createComponentExtension({\n name: 'NewAnnouncementBanner',\n component: {\n lazy: () =>\n import('./components/NewAnnouncementBanner').then(\n m => m.NewAnnouncementBanner,\n ),\n },\n }),\n);\n\n/**\n * @public\n */\nexport const AnnouncementSearchResultListItem: (\n props: SearchResultListItemExtensionProps<AnnouncementSearchResultProps>,\n) => JSX.Element | null = announcementsPlugin.provide(\n createSearchResultListItemExtension({\n name: 'AnnouncementSearchResultListItem',\n component: () =>\n import('./components/AnnouncementSearchResultListItem').then(\n m => m.AnnouncementSearchResultListItem,\n ),\n predicate: result => result.type === 'announcements',\n }),\n);\n"],"names":[],"mappings":";;;;;AAwCO,MAAM,sBAAsB,YAAa,CAAA;AAAA,EAC9C,EAAI,EAAA,eAAA;AAAA,EACJ,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA;AAAA,GACR;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,mBAAA;AAAA,MACL,IAAM,EAAA;AAAA,QACJ,YAAc,EAAA,eAAA;AAAA,QACd,WAAa,EAAA,cAAA;AAAA,QACb,QAAU,EAAA,WAAA;AAAA,QACV,QAAU,EAAA;AAAA,OACZ;AAAA,MACA,SAAS,CAAC,EAAE,cAAc,WAAa,EAAA,QAAA,EAAU,UAAe,KAAA;AAC9D,QAAA,OAAO,IAAI,mBAAoB,CAAA;AAAA,UAC7B,YAAA;AAAA,UACA,WAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA;AACH,KACD;AAAA;AAEL,CAAC;AAKM,MAAM,oBAAoB,mBAAoB,CAAA,OAAA;AAAA,EACnD,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,mBAAA;AAAA,IACN,SAAA,EAAW,MACT,OAAO,iBAAU,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,iCAAiC,CAAA;AAAA,IAClE,UAAY,EAAA;AAAA,GACb;AACH;AAKO,MAAM,oBAAoB,mBAAoB,CAAA,OAAA;AAAA,EACnD,wBAAyB,CAAA;AAAA,IACvB,IAAM,EAAA,mBAAA;AAAA,IACN,SAAW,EAAA;AAAA,MACT,IAAA,EAAM,MACJ,OAAO,6CAAgC,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,iBAAiB;AAAA;AAC1E,GACD;AACH;AAKO,MAAM,wBAAwB,mBAAoB,CAAA,OAAA;AAAA,EACvD,wBAAyB,CAAA;AAAA,IACvB,IAAM,EAAA,uBAAA;AAAA,IACN,SAAW,EAAA;AAAA,MACT,IAAM,EAAA,MACJ,OAAO,iDAAoC,CAAE,CAAA,IAAA;AAAA,QAC3C,OAAK,CAAE,CAAA;AAAA;AACT;AACJ,GACD;AACH;AAKO,MAAM,mCAEa,mBAAoB,CAAA,OAAA;AAAA,EAC5C,mCAAoC,CAAA;AAAA,IAClC,IAAM,EAAA,kCAAA;AAAA,IACN,SAAW,EAAA,MACT,OAAO,4DAA+C,CAAE,CAAA,IAAA;AAAA,MACtD,OAAK,CAAE,CAAA;AAAA,KACT;AAAA,IACF,SAAA,EAAW,CAAU,MAAA,KAAA,MAAA,CAAO,IAAS,KAAA;AAAA,GACtC;AACH;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage-community/plugin-announcements",
3
- "version": "1.3.2",
3
+ "version": "2.0.0",
4
4
  "main": "./dist/index.esm.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "license": "Apache-2.0",
@@ -61,22 +61,22 @@
61
61
  "postpack": "backstage-cli package postpack"
62
62
  },
63
63
  "dependencies": {
64
- "@backstage-community/plugin-announcements-common": "^0.15.0",
65
- "@backstage-community/plugin-announcements-react": "^0.18.2",
64
+ "@backstage-community/plugin-announcements-common": "^0.16.0",
65
+ "@backstage-community/plugin-announcements-react": "^0.19.0",
66
66
  "@backstage/catalog-model": "^1.7.6",
67
67
  "@backstage/core-app-api": "^1.19.3",
68
- "@backstage/core-compat-api": "^0.5.5",
69
- "@backstage/core-components": "^0.18.4",
68
+ "@backstage/core-compat-api": "^0.5.6",
69
+ "@backstage/core-components": "^0.18.5",
70
70
  "@backstage/core-plugin-api": "^1.12.1",
71
71
  "@backstage/errors": "^1.2.7",
72
- "@backstage/frontend-plugin-api": "^0.13.2",
73
- "@backstage/plugin-catalog-react": "^1.21.4",
72
+ "@backstage/frontend-plugin-api": "^0.13.3",
73
+ "@backstage/plugin-catalog-react": "^1.21.5",
74
74
  "@backstage/plugin-permission-react": "^0.4.39",
75
75
  "@backstage/plugin-search-common": "^1.2.21",
76
- "@backstage/plugin-search-react": "^1.10.1",
76
+ "@backstage/plugin-search-react": "^1.10.2",
77
77
  "@backstage/plugin-signals-react": "^0.0.18",
78
78
  "@backstage/theme": "^0.7.1",
79
- "@backstage/ui": "^0.10.0",
79
+ "@backstage/ui": "^0.11.1",
80
80
  "@material-ui/core": "^4.12.2",
81
81
  "@material-ui/icons": "^4.11.3",
82
82
  "@material-ui/lab": "4.0.0-alpha.61",
@@ -95,10 +95,10 @@
95
95
  "react-router-dom": "^6.3.0"
96
96
  },
97
97
  "devDependencies": {
98
- "@backstage/cli": "^0.35.1",
99
- "@backstage/dev-utils": "^1.1.18",
100
- "@backstage/frontend-test-utils": "^0.4.2",
101
- "@backstage/plugin-signals": "^0.0.26",
98
+ "@backstage/cli": "^0.35.2",
99
+ "@backstage/dev-utils": "^1.1.19",
100
+ "@backstage/frontend-test-utils": "^0.4.4",
101
+ "@backstage/plugin-signals": "^0.0.27",
102
102
  "@backstage/test-utils": "^1.7.14",
103
103
  "@testing-library/jest-dom": "^6.3.0",
104
104
  "@testing-library/react": "^14.0.0",
@@ -1 +0,0 @@
1
- {"version":3,"file":"Router.esm.js","sources":["../../src/alpha/Router.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 { Routes, Route } from 'react-router-dom';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { announcementCreatePermission } from '@backstage-community/plugin-announcements-common';\nimport {\n AnnouncementsAdminPage,\n AnnouncementsContent,\n CategoriesContent,\n TagsContent,\n AnnouncementsPage,\n AnnouncementsPageProps,\n ViewAnnouncementPage,\n} from './components';\n\n// todo: pending rebuild for nfs with `@backstage/ui`\nimport { MarkdownRendererTypeProps } from '../components';\n\ntype RouterProps = {\n title?: string;\n category?: string;\n hideStartAt?: boolean;\n markdownRenderer?: MarkdownRendererTypeProps;\n defaultInactive?: boolean;\n};\n\nexport const Router = (props: RouterProps) => {\n const propsWithDefaults: AnnouncementsPageProps = {\n title: 'Announcements',\n hideStartAt: false,\n markdownRenderer: 'backstage',\n ...props,\n };\n\n return (\n <Routes>\n <Route path=\"/\" element={<AnnouncementsPage {...propsWithDefaults} />} />\n <Route\n path=\"/view/:id\"\n element={\n <ViewAnnouncementPage\n markdownRenderer={propsWithDefaults.markdownRenderer}\n title={propsWithDefaults.title}\n />\n }\n />\n <Route\n path=\"/admin\"\n element={\n <RequirePermission permission={announcementCreatePermission}>\n <AnnouncementsAdminPage\n title={props.title}\n defaultInactive={props.defaultInactive}\n />\n </RequirePermission>\n }\n >\n <Route\n path=\"\"\n element={\n <AnnouncementsContent\n formDefaults={{ defaultInactive: props.defaultInactive }}\n />\n }\n />\n <Route path=\"categories\" element={<CategoriesContent />} />\n <Route path=\"tags\" element={<TagsContent />} />\n </Route>\n </Routes>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;AAuCa,MAAA,MAAA,GAAS,CAAC,KAAuB,KAAA;AAC5C,EAAA,MAAM,iBAA4C,GAAA;AAAA,IAChD,KAAO,EAAA,eAAA;AAAA,IACP,WAAa,EAAA,KAAA;AAAA,IACb,gBAAkB,EAAA,WAAA;AAAA,IAClB,GAAG;AAAA,GACL;AAEA,EAAA,4BACG,MACC,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,KAAA,EAAA,EAAM,MAAK,GAAI,EAAA,OAAA,sBAAU,iBAAmB,EAAA,EAAA,GAAG,mBAAmB,CAAI,EAAA,CAAA;AAAA,oBACvE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAK,EAAA,WAAA;AAAA,QACL,OACE,kBAAA,GAAA;AAAA,UAAC,oBAAA;AAAA,UAAA;AAAA,YACC,kBAAkB,iBAAkB,CAAA,gBAAA;AAAA,YACpC,OAAO,iBAAkB,CAAA;AAAA;AAAA;AAC3B;AAAA,KAEJ;AAAA,oBACA,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAK,EAAA,QAAA;AAAA,QACL,OACE,kBAAA,GAAA,CAAC,iBAAkB,EAAA,EAAA,UAAA,EAAY,4BAC7B,EAAA,QAAA,kBAAA,GAAA;AAAA,UAAC,sBAAA;AAAA,UAAA;AAAA,YACC,OAAO,KAAM,CAAA,KAAA;AAAA,YACb,iBAAiB,KAAM,CAAA;AAAA;AAAA,SAE3B,EAAA,CAAA;AAAA,QAGF,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,IAAK,EAAA,EAAA;AAAA,cACL,OACE,kBAAA,GAAA;AAAA,gBAAC,oBAAA;AAAA,gBAAA;AAAA,kBACC,YAAc,EAAA,EAAE,eAAiB,EAAA,KAAA,CAAM,eAAgB;AAAA;AAAA;AACzD;AAAA,WAEJ;AAAA,8BACC,KAAM,EAAA,EAAA,IAAA,EAAK,cAAa,OAAS,kBAAA,GAAA,CAAC,qBAAkB,CAAI,EAAA,CAAA;AAAA,8BACxD,KAAM,EAAA,EAAA,IAAA,EAAK,QAAO,OAAS,kBAAA,GAAA,CAAC,eAAY,CAAI,EAAA;AAAA;AAAA;AAAA;AAC/C,GACF,EAAA,CAAA;AAEJ;;;;"}