@backstage-community/plugin-announcements 2.1.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/README.md +38 -1
- package/dist/Router.esm.js +2 -8
- package/dist/Router.esm.js.map +1 -1
- package/dist/alpha/components/admin/AnnouncementsAdminPage.esm.js.map +1 -1
- package/dist/alpha/components/admin/announcements/AnnouncementsContent.esm.js.map +1 -1
- package/dist/alpha/components/announcements/AnnouncementsGrid.esm.js +9 -12
- package/dist/alpha/components/announcements/AnnouncementsGrid.esm.js.map +1 -1
- package/dist/alpha/components/announcements/AnnouncementsPage.esm.js.map +1 -1
- package/dist/alpha/pages.esm.js +32 -4
- package/dist/alpha/pages.esm.js.map +1 -1
- package/dist/alpha.d.ts +12 -2
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @backstage-community/plugin-announcements
|
|
2
2
|
|
|
3
|
+
## 2.3.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 5a984ed: - Added support for overriding `title`, `hideStartAt` and `markdownRenderer` via app-config for announcements page.
|
|
8
|
+
- `category` and `defaultInactive` props are now deprecated and will be removed in future releases. Use URL state to filter by category (e.g. `?category=...`). Inactive announcements are now hidden by default.
|
|
9
|
+
- Update @uiw/react-md-editor dependency to version 4.0.11.
|
|
10
|
+
|
|
11
|
+
## 2.2.0
|
|
12
|
+
|
|
13
|
+
### Minor Changes
|
|
14
|
+
|
|
15
|
+
- 57c349e: `AnnouncementsOptions` has been dropped as an optional arg for the `useAnnouncements` hook in favor of handling state and dependencies internally.
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- Updated dependencies [57c349e]
|
|
20
|
+
- @backstage-community/plugin-announcements-react@0.21.0
|
|
21
|
+
|
|
3
22
|
## 2.1.0
|
|
4
23
|
|
|
5
24
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -73,6 +73,37 @@ app:
|
|
|
73
73
|
- nav-item:announcements
|
|
74
74
|
```
|
|
75
75
|
|
|
76
|
+
### Configure extension params (New Frontend System)
|
|
77
|
+
|
|
78
|
+
You can pass params for the new frontend system by adding a `config` block to the relevant extension in `app-config.yaml`.
|
|
79
|
+
|
|
80
|
+
Announcements page params:
|
|
81
|
+
|
|
82
|
+
```yaml
|
|
83
|
+
app:
|
|
84
|
+
extensions:
|
|
85
|
+
- page:announcements:
|
|
86
|
+
config:
|
|
87
|
+
title: Company announcements
|
|
88
|
+
hideStartAt: true
|
|
89
|
+
markdownRenderer: md-editor
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Banner params:
|
|
93
|
+
|
|
94
|
+
```yaml
|
|
95
|
+
app:
|
|
96
|
+
extensions:
|
|
97
|
+
- announcements/banner:
|
|
98
|
+
config:
|
|
99
|
+
variant: floating
|
|
100
|
+
max: 2
|
|
101
|
+
category: updates
|
|
102
|
+
active: true
|
|
103
|
+
current: true
|
|
104
|
+
tags: ['security', 'platform']
|
|
105
|
+
```
|
|
106
|
+
|
|
76
107
|
The entity card will only appear on components & systems by default, but you can override that
|
|
77
108
|
behavior by passing a filter into the card extension like so:
|
|
78
109
|
|
|
@@ -92,7 +123,7 @@ app:
|
|
|
92
123
|
|
|
93
124
|
## Customization
|
|
94
125
|
|
|
95
|
-
### Defaulting new announcements to inactive
|
|
126
|
+
### Defaulting new announcements to inactive (deprecated)
|
|
96
127
|
|
|
97
128
|
It is possible to set the initial value of the `active` switch, displayed in the new announcement form, as false by passing a `defaultInactive` prop to the `AnnouncementsPage`.
|
|
98
129
|
|
|
@@ -100,6 +131,8 @@ It is possible to set the initial value of the `active` switch, displayed in the
|
|
|
100
131
|
<AnnouncementsPage defaultInactive />
|
|
101
132
|
```
|
|
102
133
|
|
|
134
|
+
Note: `defaultInactive` is deprecated. The create form defaults to active and this option will be removed.
|
|
135
|
+
|
|
103
136
|
### Overriding the AnnouncementCard
|
|
104
137
|
|
|
105
138
|
It is possible to specify the length of the title for announcements rendered on the `AnnouncementsPage`. You can do this by passing a `cardOptions` prop to the `AnnouncementsPage` component. The `cardOptions` prop accepts an object with the following properties:
|
|
@@ -130,6 +163,10 @@ Example
|
|
|
130
163
|
<AnnouncementsPage category="conferences" />
|
|
131
164
|
```
|
|
132
165
|
|
|
166
|
+
Note: The `category` prop is deprecated. Prefer using URL state like
|
|
167
|
+
`/announcements?category=conferences` to filter the page instead. The `tags` prop
|
|
168
|
+
remains supported.
|
|
169
|
+
|
|
133
170
|
### Overriding the AnnouncementCreateButton
|
|
134
171
|
|
|
135
172
|
It is possible to specify the text for the "New announcement" button rendered on the `AnnouncementsPage`. You can do this by passing a `buttonOptions` prop to the `AnnouncementsPage` component. The `buttonOptions` prop accepts an object with the following properties:
|
package/dist/Router.esm.js
CHANGED
|
@@ -39,13 +39,7 @@ const Router = (props) => {
|
|
|
39
39
|
Route,
|
|
40
40
|
{
|
|
41
41
|
path: "/admin",
|
|
42
|
-
element: /* @__PURE__ */ jsx(RequirePermission, { permission: announcementCreatePermission, children: /* @__PURE__ */ jsx(
|
|
43
|
-
AnnouncementsAdminPage,
|
|
44
|
-
{
|
|
45
|
-
title: props.title,
|
|
46
|
-
defaultInactive: props.defaultInactive
|
|
47
|
-
}
|
|
48
|
-
) }),
|
|
42
|
+
element: /* @__PURE__ */ jsx(RequirePermission, { permission: announcementCreatePermission, children: /* @__PURE__ */ jsx(AnnouncementsAdminPage, { title: props.title }) }),
|
|
49
43
|
children: [
|
|
50
44
|
/* @__PURE__ */ jsx(
|
|
51
45
|
Route,
|
|
@@ -54,7 +48,7 @@ const Router = (props) => {
|
|
|
54
48
|
element: /* @__PURE__ */ jsx(
|
|
55
49
|
AnnouncementsContent,
|
|
56
50
|
{
|
|
57
|
-
formDefaults: { defaultInactive: props.defaultInactive }
|
|
51
|
+
formDefaults: { defaultInactive: props.defaultInactive ?? true }
|
|
58
52
|
}
|
|
59
53
|
)
|
|
60
54
|
}
|
package/dist/Router.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Router.esm.js","sources":["../src/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 './alpha/components';\nimport { MarkdownRendererTypeProps } from './components';\n\nimport { compatWrapper } from '@backstage/core-compat-api';\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
|
|
1
|
+
{"version":3,"file":"Router.esm.js","sources":["../src/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 './alpha/components';\nimport { MarkdownRendererTypeProps } from './components';\n\nimport { compatWrapper } from '@backstage/core-compat-api';\n\ntype RouterProps = {\n title?: string;\n /**\n * @deprecated Filter by category using URL state (e.g. ?category=...). This option will be removed.\n */\n category?: string;\n hideStartAt?: boolean;\n markdownRenderer?: MarkdownRendererTypeProps;\n /**\n * @deprecated Inactive announcement are hidden by default. This option will be removed.\n */\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 title={props.title} />\n </RequirePermission>\n }\n >\n <Route\n path=\"\"\n element={\n <AnnouncementsContent\n formDefaults={{ defaultInactive: props.defaultInactive ?? true }}\n />\n }\n />\n <Route path=\"categories\" element={<CategoriesContent />} />\n <Route path=\"tags\" element={<TagsContent />} />\n </Route>\n </Routes>\n );\n};\n\nexport const OldFrontendSystemCompatibleRouter = (props: RouterProps) => {\n return compatWrapper(<Router {...props} />);\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AA6Ca,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,OAAA,kBACG,GAAA,CAAA,iBAAA,EAAA,EAAkB,UAAY,EAAA,4BAAA,EAC7B,8BAAC,sBAAuB,EAAA,EAAA,KAAA,EAAO,KAAM,CAAA,KAAA,EAAO,CAC9C,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,mBAAmB,IAAK;AAAA;AAAA;AACjE;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;AAEa,MAAA,iCAAA,GAAoC,CAAC,KAAuB,KAAA;AACvE,EAAA,OAAO,aAAc,iBAAA,GAAA,CAAC,MAAQ,EAAA,EAAA,GAAG,OAAO,CAAE,CAAA;AAC5C;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnnouncementsAdminPage.esm.js","sources":["../../../../src/alpha/components/admin/AnnouncementsAdminPage.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 { Container, HeaderPage } from '@backstage/ui';\nimport { Outlet } from 'react-router-dom';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n adminCategoriesRouteRef,\n announcementAdminRouteRef,\n adminTagsRouteRef,\n rootRouteRef,\n} from '../../../routes';\n\
|
|
1
|
+
{"version":3,"file":"AnnouncementsAdminPage.esm.js","sources":["../../../../src/alpha/components/admin/AnnouncementsAdminPage.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 { Container, HeaderPage } from '@backstage/ui';\nimport { Outlet } from 'react-router-dom';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n adminCategoriesRouteRef,\n announcementAdminRouteRef,\n adminTagsRouteRef,\n rootRouteRef,\n} from '../../../routes';\n\ntype AnnouncementsAdminPageProps = {\n title?: string;\n};\n\nexport function AnnouncementsAdminPage(props: AnnouncementsAdminPageProps) {\n const { title } = props;\n\n const announcementsRoute = useRouteRef(rootRouteRef);\n const adminRoute = useRouteRef(announcementAdminRouteRef);\n const adminCategoriesRoute = useRouteRef(adminCategoriesRouteRef);\n const adminTagsRoute = useRouteRef(adminTagsRouteRef);\n\n return (\n <>\n <HeaderPage\n title={title ?? 'Admin Portal'}\n breadcrumbs={[{ label: 'Announcements', href: announcementsRoute() }]}\n tabs={[\n {\n id: 'announcements',\n label: 'Announcements',\n href: adminRoute(),\n },\n {\n id: 'categories',\n label: 'Categories',\n href: adminCategoriesRoute(),\n },\n {\n id: 'tags',\n label: 'Tags',\n href: adminTagsRoute(),\n },\n ]}\n />\n\n <Container data-testid=\"announcements-admin-page-container-outlet\">\n <Outlet />\n </Container>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;AA6BO,SAAS,uBAAuB,KAAoC,EAAA;AACzE,EAAM,MAAA,EAAE,OAAU,GAAA,KAAA;AAElB,EAAM,MAAA,kBAAA,GAAqB,YAAY,YAAY,CAAA;AACnD,EAAM,MAAA,UAAA,GAAa,YAAY,yBAAyB,CAAA;AACxD,EAAM,MAAA,oBAAA,GAAuB,YAAY,uBAAuB,CAAA;AAChE,EAAM,MAAA,cAAA,GAAiB,YAAY,iBAAiB,CAAA;AAEpD,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAO,KAAS,IAAA,cAAA;AAAA,QAChB,WAAA,EAAa,CAAC,EAAE,KAAA,EAAO,iBAAiB,IAAM,EAAA,kBAAA,IAAsB,CAAA;AAAA,QACpE,IAAM,EAAA;AAAA,UACJ;AAAA,YACE,EAAI,EAAA,eAAA;AAAA,YACJ,KAAO,EAAA,eAAA;AAAA,YACP,MAAM,UAAW;AAAA,WACnB;AAAA,UACA;AAAA,YACE,EAAI,EAAA,YAAA;AAAA,YACJ,KAAO,EAAA,YAAA;AAAA,YACP,MAAM,oBAAqB;AAAA,WAC7B;AAAA,UACA;AAAA,YACE,EAAI,EAAA,MAAA;AAAA,YACJ,KAAO,EAAA,MAAA;AAAA,YACP,MAAM,cAAe;AAAA;AACvB;AACF;AAAA,KACF;AAAA,wBAEC,SAAU,EAAA,EAAA,aAAA,EAAY,2CACrB,EAAA,QAAA,kBAAA,GAAA,CAAC,UAAO,CACV,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnnouncementsContent.esm.js","sources":["../../../../../src/alpha/components/admin/announcements/AnnouncementsContent.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 { useState, useMemo } from 'react';\nimport { useApi, alertApiRef } from '@backstage/core-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport {\n CreateAnnouncementRequest,\n announcementsApiRef,\n useAnnouncementsTranslation,\n useAnnouncements,\n useAnnouncementsPermissions,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n Announcement,\n announcementCreatePermission,\n} from '@backstage-community/plugin-announcements-common';\nimport { useRouteRef } from '@backstage/frontend-plugin-api';\nimport { useNavigate } from 'react-router-dom';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { Box, Grid, Flex, Button } from '@backstage/ui';\n\nimport {\n useDeleteConfirmationDialogState,\n DeleteConfirmationDialog,\n} from '../shared';\nimport { AnnouncementForm } from './AnnouncementForm';\nimport { AnnouncementsTableCard } from './AnnouncementsTableCard';\nimport { announcementViewRouteRef } from '../../../../routes';\n\n/**\n * @internal\n */\nexport type AnnouncementsContentProps = {\n /** default form values when creating a new announcement */\n formDefaults: {\n /** sets active switch form input to false by default when creating a new announcement */\n defaultInactive?: boolean;\n };\n};\n\nconst AnnouncementFormContent = (props: {\n onCancel: () => void;\n onSubmit: (request: CreateAnnouncementRequest) => Promise<void>;\n initialData: Announcement;\n}) => {\n const { t } = useAnnouncementsTranslation();\n\n const { onCancel, onSubmit, initialData } = props;\n\n return (\n <Box mb=\"2\">\n <Flex justify=\"end\" align=\"center\" pb=\"3\">\n <Button variant=\"secondary\" onClick={onCancel}>\n {t('admin.announcementsContent.cancelButton')}\n </Button>\n </Flex>\n\n <AnnouncementForm initialData={initialData} onSubmit={onSubmit} />\n </Box>\n );\n};\n\n/**\n * @internal\n */\nexport const AnnouncementsContent = ({\n formDefaults: { defaultInactive },\n}: AnnouncementsContentProps) => {\n const announcementsApi = useApi(announcementsApiRef);\n const alertApi = useApi(alertApiRef);\n const { t } = useAnnouncementsTranslation();\n const permissions = useAnnouncementsPermissions();\n\n const [showCreateAnnouncementForm, setShowCreateAnnouncementForm] =\n useState(false);\n const [editingAnnouncementId, setEditingAnnouncementId] = useState<\n string | null\n >(null);\n\n const { announcements, retry: refresh } = useAnnouncements({});\n\n const {\n isOpen: isDeleteDialogOpen,\n close: closeDeleteDialog,\n open: openDeleteDialog,\n item: announcementToDelete,\n } = useDeleteConfirmationDialogState<Announcement>();\n\n const viewAnnouncementLink = useRouteRef(announcementViewRouteRef);\n const navigate = useNavigate();\n\n const onCreateButtonClick = () => {\n setShowCreateAnnouncementForm(true);\n };\n\n const onPreviewClick = (announcement: Announcement) => {\n const link = viewAnnouncementLink?.({ id: announcement.id }) ?? '';\n navigate(`${link}?from=admin`);\n };\n\n const onEditClick = (announcement: Announcement) => {\n setEditingAnnouncementId(announcement.id);\n setShowCreateAnnouncementForm(false);\n };\n\n const onSubmit = async (request: CreateAnnouncementRequest) => {\n try {\n await announcementsApi.createAnnouncement(request);\n\n alertApi.post({\n message: t('admin.announcementsContent.alertMessage'),\n severity: 'success',\n });\n\n setShowCreateAnnouncementForm(false);\n refresh();\n } catch (err) {\n alertApi.post({ message: (err as Error).message, severity: 'error' });\n }\n };\n\n const onUpdate = async (request: CreateAnnouncementRequest) => {\n if (!editingAnnouncementId) {\n return;\n }\n\n try {\n await announcementsApi.updateAnnouncement(editingAnnouncementId, request);\n alertApi.post({\n message: t('editAnnouncementPage.updatedMessage'),\n severity: 'success',\n });\n\n setEditingAnnouncementId(null);\n refresh();\n } catch (err) {\n alertApi.post({ message: (err as Error).message, severity: 'error' });\n }\n };\n\n const onCancelCreate = () => {\n setShowCreateAnnouncementForm(false);\n };\n\n const onCancelEdit = () => {\n setEditingAnnouncementId(null);\n };\n\n const announcementToEdit = useMemo(() => {\n if (!editingAnnouncementId || !announcements?.results) {\n return null;\n }\n return (\n announcements.results.find(a => a.id === editingAnnouncementId) ?? null\n );\n }, [editingAnnouncementId, announcements?.results]);\n\n const onCancelDelete = () => {\n closeDeleteDialog();\n };\n\n const onConfirmDelete = async () => {\n closeDeleteDialog();\n\n try {\n await announcementsApi.deleteAnnouncementByID(announcementToDelete!.id);\n\n alertApi.post({\n message: t('admin.announcementsContent.deletedMessage'),\n severity: 'success',\n });\n } catch (err) {\n alertApi.post({\n message:\n (err as ResponseError).body?.error?.message || (err as Error).message,\n severity: 'error',\n });\n }\n\n refresh();\n };\n\n const onDeleteClick = (announcement: Announcement) => {\n openDeleteDialog(announcement);\n };\n\n const canCreate = !permissions.create.loading && permissions.create.allowed;\n const canEdit = !permissions.update.loading && permissions.update.allowed;\n const canDelete = !permissions.delete.loading && permissions.delete.allowed;\n\n return (\n <RequirePermission permission={announcementCreatePermission}>\n <Grid.Root columns=\"1\">\n {showCreateAnnouncementForm && (\n <Grid.Item>\n <AnnouncementFormContent\n onCancel={onCancelCreate}\n onSubmit={onSubmit}\n initialData={{ active: !defaultInactive } as Announcement}\n />\n </Grid.Item>\n )}\n\n {editingAnnouncementId && announcementToEdit && (\n <Grid.Item>\n <AnnouncementFormContent\n onCancel={onCancelEdit}\n onSubmit={onUpdate}\n initialData={announcementToEdit}\n />\n </Grid.Item>\n )}\n\n <Grid.Item>\n <Box mb=\"12\">\n <AnnouncementsTableCard\n announcements={announcements?.results ?? []}\n onPreviewClick={onPreviewClick}\n onEditClick={onEditClick}\n onDeleteClick={onDeleteClick}\n onCreateClick={onCreateButtonClick}\n canEdit={canEdit}\n canDelete={canDelete}\n canCreate={canCreate}\n editingAnnouncementId={editingAnnouncementId}\n />\n </Box>\n\n <DeleteConfirmationDialog\n type=\"announcement\"\n itemTitle={announcementToDelete?.title}\n open={isDeleteDialogOpen}\n onCancel={onCancelDelete}\n onConfirm={onConfirmDelete}\n canDelete={canDelete}\n />\n </Grid.Item>\n </Grid.Root>\n </RequirePermission>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AnnouncementsContent.esm.js","sources":["../../../../../src/alpha/components/admin/announcements/AnnouncementsContent.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 { useState, useMemo } from 'react';\nimport { useApi, alertApiRef } from '@backstage/core-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport {\n CreateAnnouncementRequest,\n announcementsApiRef,\n useAnnouncementsTranslation,\n useAnnouncements,\n useAnnouncementsPermissions,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n Announcement,\n announcementCreatePermission,\n} from '@backstage-community/plugin-announcements-common';\nimport { useRouteRef } from '@backstage/frontend-plugin-api';\nimport { useNavigate } from 'react-router-dom';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { Box, Grid, Flex, Button } from '@backstage/ui';\n\nimport {\n useDeleteConfirmationDialogState,\n DeleteConfirmationDialog,\n} from '../shared';\nimport { AnnouncementForm } from './AnnouncementForm';\nimport { AnnouncementsTableCard } from './AnnouncementsTableCard';\nimport { announcementViewRouteRef } from '../../../../routes';\n\n/**\n * @internal\n */\nexport type AnnouncementsContentProps = {\n /** default form values when creating a new announcement */\n formDefaults: {\n /**\n * @deprecated Inactive announcement are hidden by default. This option will be removed.\n */\n defaultInactive?: boolean;\n };\n};\n\nconst AnnouncementFormContent = (props: {\n onCancel: () => void;\n onSubmit: (request: CreateAnnouncementRequest) => Promise<void>;\n initialData: Announcement;\n}) => {\n const { t } = useAnnouncementsTranslation();\n\n const { onCancel, onSubmit, initialData } = props;\n\n return (\n <Box mb=\"2\">\n <Flex justify=\"end\" align=\"center\" pb=\"3\">\n <Button variant=\"secondary\" onClick={onCancel}>\n {t('admin.announcementsContent.cancelButton')}\n </Button>\n </Flex>\n\n <AnnouncementForm initialData={initialData} onSubmit={onSubmit} />\n </Box>\n );\n};\n\n/**\n * @internal\n */\nexport const AnnouncementsContent = ({\n formDefaults: { defaultInactive },\n}: AnnouncementsContentProps) => {\n const announcementsApi = useApi(announcementsApiRef);\n const alertApi = useApi(alertApiRef);\n const { t } = useAnnouncementsTranslation();\n const permissions = useAnnouncementsPermissions();\n\n const [showCreateAnnouncementForm, setShowCreateAnnouncementForm] =\n useState(false);\n const [editingAnnouncementId, setEditingAnnouncementId] = useState<\n string | null\n >(null);\n\n const { announcements, retry: refresh } = useAnnouncements({});\n\n const {\n isOpen: isDeleteDialogOpen,\n close: closeDeleteDialog,\n open: openDeleteDialog,\n item: announcementToDelete,\n } = useDeleteConfirmationDialogState<Announcement>();\n\n const viewAnnouncementLink = useRouteRef(announcementViewRouteRef);\n const navigate = useNavigate();\n\n const onCreateButtonClick = () => {\n setShowCreateAnnouncementForm(true);\n };\n\n const onPreviewClick = (announcement: Announcement) => {\n const link = viewAnnouncementLink?.({ id: announcement.id }) ?? '';\n navigate(`${link}?from=admin`);\n };\n\n const onEditClick = (announcement: Announcement) => {\n setEditingAnnouncementId(announcement.id);\n setShowCreateAnnouncementForm(false);\n };\n\n const onSubmit = async (request: CreateAnnouncementRequest) => {\n try {\n await announcementsApi.createAnnouncement(request);\n\n alertApi.post({\n message: t('admin.announcementsContent.alertMessage'),\n severity: 'success',\n });\n\n setShowCreateAnnouncementForm(false);\n refresh();\n } catch (err) {\n alertApi.post({ message: (err as Error).message, severity: 'error' });\n }\n };\n\n const onUpdate = async (request: CreateAnnouncementRequest) => {\n if (!editingAnnouncementId) {\n return;\n }\n\n try {\n await announcementsApi.updateAnnouncement(editingAnnouncementId, request);\n alertApi.post({\n message: t('editAnnouncementPage.updatedMessage'),\n severity: 'success',\n });\n\n setEditingAnnouncementId(null);\n refresh();\n } catch (err) {\n alertApi.post({ message: (err as Error).message, severity: 'error' });\n }\n };\n\n const onCancelCreate = () => {\n setShowCreateAnnouncementForm(false);\n };\n\n const onCancelEdit = () => {\n setEditingAnnouncementId(null);\n };\n\n const announcementToEdit = useMemo(() => {\n if (!editingAnnouncementId || !announcements?.results) {\n return null;\n }\n return (\n announcements.results.find(a => a.id === editingAnnouncementId) ?? null\n );\n }, [editingAnnouncementId, announcements?.results]);\n\n const onCancelDelete = () => {\n closeDeleteDialog();\n };\n\n const onConfirmDelete = async () => {\n closeDeleteDialog();\n\n try {\n await announcementsApi.deleteAnnouncementByID(announcementToDelete!.id);\n\n alertApi.post({\n message: t('admin.announcementsContent.deletedMessage'),\n severity: 'success',\n });\n } catch (err) {\n alertApi.post({\n message:\n (err as ResponseError).body?.error?.message || (err as Error).message,\n severity: 'error',\n });\n }\n\n refresh();\n };\n\n const onDeleteClick = (announcement: Announcement) => {\n openDeleteDialog(announcement);\n };\n\n const canCreate = !permissions.create.loading && permissions.create.allowed;\n const canEdit = !permissions.update.loading && permissions.update.allowed;\n const canDelete = !permissions.delete.loading && permissions.delete.allowed;\n\n return (\n <RequirePermission permission={announcementCreatePermission}>\n <Grid.Root columns=\"1\">\n {showCreateAnnouncementForm && (\n <Grid.Item>\n <AnnouncementFormContent\n onCancel={onCancelCreate}\n onSubmit={onSubmit}\n initialData={{ active: !defaultInactive } as Announcement}\n />\n </Grid.Item>\n )}\n\n {editingAnnouncementId && announcementToEdit && (\n <Grid.Item>\n <AnnouncementFormContent\n onCancel={onCancelEdit}\n onSubmit={onUpdate}\n initialData={announcementToEdit}\n />\n </Grid.Item>\n )}\n\n <Grid.Item>\n <Box mb=\"12\">\n <AnnouncementsTableCard\n announcements={announcements?.results ?? []}\n onPreviewClick={onPreviewClick}\n onEditClick={onEditClick}\n onDeleteClick={onDeleteClick}\n onCreateClick={onCreateButtonClick}\n canEdit={canEdit}\n canDelete={canDelete}\n canCreate={canCreate}\n editingAnnouncementId={editingAnnouncementId}\n />\n </Box>\n\n <DeleteConfirmationDialog\n type=\"announcement\"\n itemTitle={announcementToDelete?.title}\n open={isDeleteDialogOpen}\n onCancel={onCancelDelete}\n onConfirm={onConfirmDelete}\n canDelete={canDelete}\n />\n </Grid.Item>\n </Grid.Root>\n </RequirePermission>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -19,18 +19,15 @@ const AnnouncementsGrid = ({
|
|
|
19
19
|
const handleChange = (_event, value) => {
|
|
20
20
|
setPage(value);
|
|
21
21
|
};
|
|
22
|
-
const { announcements, loading, error } = useAnnouncements(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
},
|
|
32
|
-
{ dependencies: [maxPerPage, page, category, tags] }
|
|
33
|
-
);
|
|
22
|
+
const { announcements, loading, error } = useAnnouncements({
|
|
23
|
+
max: maxPerPage,
|
|
24
|
+
page,
|
|
25
|
+
category,
|
|
26
|
+
tags,
|
|
27
|
+
active,
|
|
28
|
+
sortBy,
|
|
29
|
+
order
|
|
30
|
+
});
|
|
34
31
|
if (error) {
|
|
35
32
|
return /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsx(CardBody, { children: /* @__PURE__ */ jsx(Text, { color: "danger", children: t("announcementsPage.errorLoadingAnnouncements") }) }) });
|
|
36
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnnouncementsGrid.esm.js","sources":["../../../../src/alpha/components/announcements/AnnouncementsGrid.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 } from 'react';\nimport {\n useAnnouncements,\n useAnnouncementsTranslation,\n} from '@backstage-community/plugin-announcements-react';\nimport { Pagination } from '@material-ui/lab';\nimport { Flex, Grid, Skeleton, Text, Card, CardBody } from '@backstage/ui';\nimport { AnnouncementCard } from './AnnouncementCard';\n\ntype AnnouncementsGridProps = {\n maxPerPage: number;\n category?: string;\n tags?: string[];\n active?: boolean;\n sortBy?: 'created_at' | 'start_at';\n order?: 'asc' | 'desc';\n hideStartAt?: boolean;\n};\n\nexport const AnnouncementsGrid = ({\n maxPerPage,\n category,\n tags,\n active,\n sortBy,\n order,\n hideStartAt,\n}: AnnouncementsGridProps) => {\n const { t } = useAnnouncementsTranslation();\n\n const [page, setPage] = useState(1);\n const handleChange = (_event: any, value: number) => {\n setPage(value);\n };\n\n const { announcements, loading, error } = useAnnouncements(\n
|
|
1
|
+
{"version":3,"file":"AnnouncementsGrid.esm.js","sources":["../../../../src/alpha/components/announcements/AnnouncementsGrid.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 } from 'react';\nimport {\n useAnnouncements,\n useAnnouncementsTranslation,\n} from '@backstage-community/plugin-announcements-react';\nimport { Pagination } from '@material-ui/lab';\nimport { Flex, Grid, Skeleton, Text, Card, CardBody } from '@backstage/ui';\nimport { AnnouncementCard } from './AnnouncementCard';\n\ntype AnnouncementsGridProps = {\n maxPerPage: number;\n category?: string;\n tags?: string[];\n active?: boolean;\n sortBy?: 'created_at' | 'start_at';\n order?: 'asc' | 'desc';\n hideStartAt?: boolean;\n};\n\nexport const AnnouncementsGrid = ({\n maxPerPage,\n category,\n tags,\n active,\n sortBy,\n order,\n hideStartAt,\n}: AnnouncementsGridProps) => {\n const { t } = useAnnouncementsTranslation();\n\n const [page, setPage] = useState(1);\n const handleChange = (_event: any, value: number) => {\n setPage(value);\n };\n\n const { announcements, loading, error } = useAnnouncements({\n max: maxPerPage,\n page,\n category,\n tags,\n active,\n sortBy,\n order,\n });\n\n if (error) {\n return (\n <Card>\n <CardBody>\n <Text color=\"danger\">\n {t('announcementsPage.errorLoadingAnnouncements')}\n </Text>\n </CardBody>\n </Card>\n );\n }\n\n return (\n <>\n {!loading ? (\n <Grid.Root columns={{ xs: '12', md: '2', lg: '3' }}>\n {announcements.results.length > 0 &&\n announcements.results.map(announcement => (\n <Grid.Item key={announcement.id}>\n <AnnouncementCard\n announcement={announcement}\n hideStartAt={hideStartAt}\n />\n </Grid.Item>\n ))}\n\n {announcements.results.length === 0 && (\n <Grid.Item colSpan=\"12\">\n <Card>\n <CardBody>\n {category || tags ? (\n <Text>\n {t(\n 'announcementsPage.filter.noFilteredAnnouncementsFound',\n )}\n </Text>\n ) : (\n <Text>{t('announcementsPage.noAnnouncementsFound')}</Text>\n )}\n </CardBody>\n </Card>\n </Grid.Item>\n )}\n </Grid.Root>\n ) : (\n <Skeleton />\n )}\n\n {announcements.count > 0 && (\n <Flex justify=\"center\" my=\"10\">\n <Pagination\n count={Math.ceil(announcements.count / maxPerPage)}\n page={page}\n onChange={handleChange}\n />\n </Flex>\n )}\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAkCO,MAAM,oBAAoB,CAAC;AAAA,EAChC,UAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAA8B,KAAA;AAC5B,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAE1C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,CAAC,CAAA;AAClC,EAAM,MAAA,YAAA,GAAe,CAAC,MAAA,EAAa,KAAkB,KAAA;AACnD,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,GACf;AAEA,EAAA,MAAM,EAAE,aAAA,EAAe,OAAS,EAAA,KAAA,KAAU,gBAAiB,CAAA;AAAA,IACzD,GAAK,EAAA,UAAA;AAAA,IACL,IAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,uBACG,GAAA,CAAA,IAAA,EAAA,EACC,QAAC,kBAAA,GAAA,CAAA,QAAA,EAAA,EACC,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,KAAM,EAAA,QAAA,EACT,QAAE,EAAA,CAAA,CAAA,6CAA6C,CAClD,EAAA,CAAA,EACF,CACF,EAAA,CAAA;AAAA;AAIJ,EAAA,uBAEK,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,IAAA,CAAC,OACA,mBAAA,IAAA,CAAC,IAAK,CAAA,IAAA,EAAL,EAAU,OAAA,EAAS,EAAE,EAAA,EAAI,IAAM,EAAA,EAAA,EAAI,GAAK,EAAA,EAAA,EAAI,KAC1C,EAAA,QAAA,EAAA;AAAA,MAAc,aAAA,CAAA,OAAA,CAAQ,MAAS,GAAA,CAAA,IAC9B,aAAc,CAAA,OAAA,CAAQ,IAAI,CACxB,YAAA,qBAAA,GAAA,CAAC,IAAK,CAAA,IAAA,EAAL,EACC,QAAA,kBAAA,GAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,YAAA;AAAA,UACA;AAAA;AAAA,OACF,EAAA,EAJc,YAAa,CAAA,EAK7B,CACD,CAAA;AAAA,MAEF,cAAc,OAAQ,CAAA,MAAA,KAAW,CAChC,oBAAA,GAAA,CAAC,KAAK,IAAL,EAAA,EAAU,OAAQ,EAAA,IAAA,EACjB,8BAAC,IACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,YACE,QAAY,EAAA,QAAA,IAAA,IAAA,uBACV,IACE,EAAA,EAAA,QAAA,EAAA,CAAA;AAAA,QACC;AAAA,OACF,EACF,oBAEC,GAAA,CAAA,IAAA,EAAA,EAAM,YAAE,wCAAwC,CAAA,EAAE,CAEvD,EAAA,CAAA,EACF,CACF,EAAA;AAAA,KAEJ,EAAA,CAAA,uBAEC,QAAS,EAAA,EAAA,CAAA;AAAA,IAGX,aAAA,CAAc,QAAQ,CACrB,oBAAA,GAAA,CAAC,QAAK,OAAQ,EAAA,QAAA,EAAS,IAAG,IACxB,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAO,EAAA,IAAA,CAAK,IAAK,CAAA,aAAA,CAAc,QAAQ,UAAU,CAAA;AAAA,QACjD,IAAA;AAAA,QACA,QAAU,EAAA;AAAA;AAAA,KAEd,EAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnnouncementsPage.esm.js","sources":["../../../../src/alpha/components/announcements/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 { useSearchParams } from 'react-router-dom';\nimport {\n useAnnouncementsPermissions,\n useAnnouncementsTranslation,\n} from '@backstage-community/plugin-announcements-react';\nimport { Container, Flex, HeaderPage } from '@backstage/ui';\n\nimport { AnnouncementsGrid } from './AnnouncementsGrid';\nimport { AnnouncementsFilterBar } from './AnnouncementsFilterBar';\nimport { ContextMenu } from './ContextMenu';\nimport { MarkdownRendererTypeProps } from '../../../components';\n\nexport type AnnouncementsPageProps = {\n title: string;\n maxPerPage?: number;\n category?: string;\n tags?: string[];\n hideStartAt?: boolean;\n markdownRenderer?: MarkdownRendererTypeProps;\n sortby?: 'created_at' | 'start_at';\n order?: 'asc' | 'desc';\n};\n\nexport const AnnouncementsPage = (props: AnnouncementsPageProps) => {\n const [searchParams] = useSearchParams();\n const permissions = useAnnouncementsPermissions();\n const { t } = useAnnouncementsTranslation();\n\n const { hideStartAt, title, maxPerPage, category, sortby, order, tags } =\n props;\n\n const canManageAnnouncements =\n !permissions.create.loading && permissions.create.allowed;\n\n return (\n <>\n <HeaderPage\n title={title ?? t('announcementsPage.announcements')}\n customActions={canManageAnnouncements && <ContextMenu />}\n />\n\n <Container>\n <Flex direction=\"column\">\n <AnnouncementsFilterBar />\n <AnnouncementsGrid\n maxPerPage={maxPerPage ?? 10}\n category={category ?? searchParams.get('category') ?? undefined}\n tags={\n tags ??\n (searchParams.get('tags')\n ? searchParams.get('tags')?.split(',')\n : undefined)\n }\n sortBy={sortby ?? 'created_at'}\n order={order ?? 'desc'}\n hideStartAt={hideStartAt}\n active\n />\n </Flex>\n </Container>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"AnnouncementsPage.esm.js","sources":["../../../../src/alpha/components/announcements/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 { useSearchParams } from 'react-router-dom';\nimport {\n useAnnouncementsPermissions,\n useAnnouncementsTranslation,\n} from '@backstage-community/plugin-announcements-react';\nimport { Container, Flex, HeaderPage } from '@backstage/ui';\n\nimport { AnnouncementsGrid } from './AnnouncementsGrid';\nimport { AnnouncementsFilterBar } from './AnnouncementsFilterBar';\nimport { ContextMenu } from './ContextMenu';\nimport { MarkdownRendererTypeProps } from '../../../components';\n\nexport type AnnouncementsPageProps = {\n title: string;\n maxPerPage?: number;\n /**\n * @deprecated Use URL state (e.g. ?category=...) to filter category instead.\n */\n category?: string;\n tags?: string[];\n hideStartAt?: boolean;\n markdownRenderer?: MarkdownRendererTypeProps;\n sortby?: 'created_at' | 'start_at';\n order?: 'asc' | 'desc';\n};\n\nexport const AnnouncementsPage = (props: AnnouncementsPageProps) => {\n const [searchParams] = useSearchParams();\n const permissions = useAnnouncementsPermissions();\n const { t } = useAnnouncementsTranslation();\n\n const { hideStartAt, title, maxPerPage, category, sortby, order, tags } =\n props;\n\n const canManageAnnouncements =\n !permissions.create.loading && permissions.create.allowed;\n\n return (\n <>\n <HeaderPage\n title={title ?? t('announcementsPage.announcements')}\n customActions={canManageAnnouncements && <ContextMenu />}\n />\n\n <Container>\n <Flex direction=\"column\">\n <AnnouncementsFilterBar />\n <AnnouncementsGrid\n maxPerPage={maxPerPage ?? 10}\n category={category ?? searchParams.get('category') ?? undefined}\n tags={\n tags ??\n (searchParams.get('tags')\n ? searchParams.get('tags')?.split(',')\n : undefined)\n }\n sortBy={sortby ?? 'created_at'}\n order={order ?? 'desc'}\n hideStartAt={hideStartAt}\n active\n />\n </Flex>\n </Container>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAyCa,MAAA,iBAAA,GAAoB,CAAC,KAAkC,KAAA;AAClE,EAAM,MAAA,CAAC,YAAY,CAAA,GAAI,eAAgB,EAAA;AACvC,EAAA,MAAM,cAAc,2BAA4B,EAAA;AAChD,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAE1C,EAAM,MAAA,EAAE,aAAa,KAAO,EAAA,UAAA,EAAY,UAAU,MAAQ,EAAA,KAAA,EAAO,MAC/D,GAAA,KAAA;AAEF,EAAA,MAAM,yBACJ,CAAC,WAAA,CAAY,MAAO,CAAA,OAAA,IAAW,YAAY,MAAO,CAAA,OAAA;AAEpD,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,KAAS,IAAA,CAAA,CAAE,iCAAiC,CAAA;AAAA,QACnD,aAAA,EAAe,sBAA0B,oBAAA,GAAA,CAAC,WAAY,EAAA,EAAA;AAAA;AAAA,KACxD;AAAA,oBAEC,GAAA,CAAA,SAAA,EAAA,EACC,QAAC,kBAAA,IAAA,CAAA,IAAA,EAAA,EAAK,WAAU,QACd,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,sBAAuB,EAAA,EAAA,CAAA;AAAA,sBACxB,GAAA;AAAA,QAAC,iBAAA;AAAA,QAAA;AAAA,UACC,YAAY,UAAc,IAAA,EAAA;AAAA,UAC1B,QAAU,EAAA,QAAA,IAAY,YAAa,CAAA,GAAA,CAAI,UAAU,CAAK,IAAA,KAAA,CAAA;AAAA,UACtD,IACE,EAAA,IAAA,KACC,YAAa,CAAA,GAAA,CAAI,MAAM,CAAA,GACpB,YAAa,CAAA,GAAA,CAAI,MAAM,CAAA,EAAG,KAAM,CAAA,GAAG,CACnC,GAAA,KAAA,CAAA,CAAA;AAAA,UAEN,QAAQ,MAAU,IAAA,YAAA;AAAA,UAClB,OAAO,KAAS,IAAA,MAAA;AAAA,UAChB,WAAA;AAAA,UACA,MAAM,EAAA;AAAA;AAAA;AACR,KAAA,EACF,CACF,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
|
package/dist/alpha/pages.esm.js
CHANGED
|
@@ -3,12 +3,40 @@ import { convertLegacyRouteRef, compatWrapper } from '@backstage/core-compat-api
|
|
|
3
3
|
import { PageBlueprint } from '@backstage/frontend-plugin-api';
|
|
4
4
|
import { rootRouteRef } from '../routes.esm.js';
|
|
5
5
|
|
|
6
|
-
const announcementsPage = PageBlueprint.
|
|
7
|
-
|
|
6
|
+
const announcementsPage = PageBlueprint.makeWithOverrides({
|
|
7
|
+
config: {
|
|
8
|
+
schema: {
|
|
9
|
+
title: (z) => z.string().optional(),
|
|
10
|
+
/**
|
|
11
|
+
* @deprecated Filter by category using URL state (e.g. ?category=...). This option will be removed.
|
|
12
|
+
*/
|
|
13
|
+
category: (z) => z.string().optional(),
|
|
14
|
+
hideStartAt: (z) => z.boolean().optional(),
|
|
15
|
+
markdownRenderer: (z) => z.enum(["backstage", "md-editor"]).optional(),
|
|
16
|
+
/**
|
|
17
|
+
* @deprecated Inactive announcement are hidden by default. This option will be removed.
|
|
18
|
+
*/
|
|
19
|
+
defaultInactive: (z) => z.boolean().optional()
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
factory: (originalFactory, { config }) => originalFactory({
|
|
8
23
|
path: "/announcements",
|
|
9
24
|
routeRef: convertLegacyRouteRef(rootRouteRef),
|
|
10
|
-
loader: async () => import('../Router.esm.js').then(
|
|
11
|
-
|
|
25
|
+
loader: async () => import('../Router.esm.js').then(
|
|
26
|
+
(m) => compatWrapper(
|
|
27
|
+
/* @__PURE__ */ jsx(
|
|
28
|
+
m.Router,
|
|
29
|
+
{
|
|
30
|
+
title: config.title,
|
|
31
|
+
category: config.category,
|
|
32
|
+
hideStartAt: config.hideStartAt,
|
|
33
|
+
markdownRenderer: config.markdownRenderer,
|
|
34
|
+
defaultInactive: config.defaultInactive
|
|
35
|
+
}
|
|
36
|
+
)
|
|
37
|
+
)
|
|
38
|
+
)
|
|
39
|
+
})
|
|
12
40
|
});
|
|
13
41
|
|
|
14
42
|
export { announcementsPage };
|
|
@@ -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.
|
|
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.makeWithOverrides({\n config: {\n schema: {\n title: z => z.string().optional(),\n /**\n * @deprecated Filter by category using URL state (e.g. ?category=...). This option will be removed.\n */\n category: z => z.string().optional(),\n hideStartAt: z => z.boolean().optional(),\n markdownRenderer: z => z.enum(['backstage', 'md-editor']).optional(),\n /**\n * @deprecated Inactive announcement are hidden by default. This option will be removed.\n */\n defaultInactive: z => z.boolean().optional(),\n },\n },\n factory: (originalFactory, { config }) =>\n originalFactory({\n path: '/announcements',\n routeRef: convertLegacyRouteRef(rootRouteRef),\n loader: async () =>\n import('../Router').then(m =>\n compatWrapper(\n <m.Router\n title={config.title}\n category={config.category}\n hideStartAt={config.hideStartAt}\n markdownRenderer={config.markdownRenderer}\n defaultInactive={config.defaultInactive}\n />,\n ),\n ),\n }),\n});\n"],"names":[],"mappings":";;;;;AAyBa,MAAA,iBAAA,GAAoB,cAAc,iBAAkB,CAAA;AAAA,EAC/D,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA;AAAA,MACN,KAAO,EAAA,CAAA,CAAA,KAAK,CAAE,CAAA,MAAA,GAAS,QAAS,EAAA;AAAA;AAAA;AAAA;AAAA,MAIhC,QAAU,EAAA,CAAA,CAAA,KAAK,CAAE,CAAA,MAAA,GAAS,QAAS,EAAA;AAAA,MACnC,WAAa,EAAA,CAAA,CAAA,KAAK,CAAE,CAAA,OAAA,GAAU,QAAS,EAAA;AAAA,MACvC,gBAAA,EAAkB,OAAK,CAAE,CAAA,IAAA,CAAK,CAAC,WAAa,EAAA,WAAW,CAAC,CAAA,CAAE,QAAS,EAAA;AAAA;AAAA;AAAA;AAAA,MAInE,eAAiB,EAAA,CAAA,CAAA,KAAK,CAAE,CAAA,OAAA,GAAU,QAAS;AAAA;AAC7C,GACF;AAAA,EACA,SAAS,CAAC,eAAA,EAAiB,EAAE,MAAA,OAC3B,eAAgB,CAAA;AAAA,IACd,IAAM,EAAA,gBAAA;AAAA,IACN,QAAA,EAAU,sBAAsB,YAAY,CAAA;AAAA,IAC5C,MAAQ,EAAA,YACN,OAAO,kBAAW,CAAE,CAAA,IAAA;AAAA,MAAK,CACvB,CAAA,KAAA,aAAA;AAAA,wBACE,GAAA;AAAA,UAAC,CAAE,CAAA,MAAA;AAAA,UAAF;AAAA,YACC,OAAO,MAAO,CAAA,KAAA;AAAA,YACd,UAAU,MAAO,CAAA,QAAA;AAAA,YACjB,aAAa,MAAO,CAAA,WAAA;AAAA,YACpB,kBAAkB,MAAO,CAAA,gBAAA;AAAA,YACzB,iBAAiB,MAAO,CAAA;AAAA;AAAA;AAC1B;AACF;AACF,GACH;AACL,CAAC;;;;"}
|
package/dist/alpha.d.ts
CHANGED
|
@@ -90,18 +90,28 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
|
|
|
90
90
|
};
|
|
91
91
|
}>;
|
|
92
92
|
"page:announcements": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
|
|
93
|
-
kind: "page";
|
|
94
|
-
name: undefined;
|
|
95
93
|
config: {
|
|
94
|
+
title: string | undefined;
|
|
95
|
+
category: string | undefined;
|
|
96
|
+
hideStartAt: boolean | undefined;
|
|
97
|
+
markdownRenderer: "backstage" | "md-editor" | undefined;
|
|
98
|
+
defaultInactive: boolean | undefined;
|
|
96
99
|
path: string | undefined;
|
|
97
100
|
};
|
|
98
101
|
configInput: {
|
|
102
|
+
title?: string | undefined;
|
|
103
|
+
category?: string | undefined;
|
|
104
|
+
defaultInactive?: boolean | undefined;
|
|
105
|
+
hideStartAt?: boolean | undefined;
|
|
106
|
+
markdownRenderer?: "backstage" | "md-editor" | undefined;
|
|
99
107
|
path?: string | undefined;
|
|
100
108
|
};
|
|
101
109
|
output: _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
|
|
102
110
|
optional: true;
|
|
103
111
|
}>;
|
|
104
112
|
inputs: {};
|
|
113
|
+
kind: "page";
|
|
114
|
+
name: undefined;
|
|
105
115
|
params: {
|
|
106
116
|
defaultPath?: [Error: "Use the 'path' param instead"] | undefined;
|
|
107
117
|
path: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage-community/plugin-announcements",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"main": "./dist/index.esm.js",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
},
|
|
63
63
|
"dependencies": {
|
|
64
64
|
"@backstage-community/plugin-announcements-common": "^0.17.0",
|
|
65
|
-
"@backstage-community/plugin-announcements-react": "^0.
|
|
65
|
+
"@backstage-community/plugin-announcements-react": "^0.21.0",
|
|
66
66
|
"@backstage/catalog-model": "^1.7.6",
|
|
67
67
|
"@backstage/core-app-api": "^1.19.4",
|
|
68
68
|
"@backstage/core-compat-api": "^0.5.7",
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
"@mui/material": "^5.15.6",
|
|
85
85
|
"@remixicon/react": "^4.7.0",
|
|
86
86
|
"@types/react": "^17.0.0 || ^18.0.0",
|
|
87
|
-
"@uiw/react-md-editor": "^4.0.
|
|
87
|
+
"@uiw/react-md-editor": "^4.0.11",
|
|
88
88
|
"luxon": "^3.2.0",
|
|
89
89
|
"react-use": "^17.2.4",
|
|
90
90
|
"slugify": "1.6.6"
|