@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 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:
@@ -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
  }
@@ -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\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\nexport const OldFrontendSystemCompatibleRouter = (props: RouterProps) => {\n return compatWrapper(<Router {...props} />);\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;AAEa,MAAA,iCAAA,GAAoC,CAAC,KAAuB,KAAA;AACvE,EAAA,OAAO,aAAc,iBAAA,GAAA,CAAC,MAAQ,EAAA,EAAA,GAAG,OAAO,CAAE,CAAA;AAC5C;;;;"}
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\nexport type AnnouncementsAdminPageProps = {\n title?: string;\n defaultInactive?: boolean;\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":";;;;;;AA8BO,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
+ {"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
- max: maxPerPage,
25
- page,
26
- category,
27
- tags,
28
- active,
29
- sortBy,
30
- order
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 {\n max: maxPerPage,\n page,\n category,\n tags,\n active,\n sortBy,\n order,\n },\n { dependencies: [maxPerPage, page, category, tags] },\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,EAAU,GAAA,gBAAA;AAAA,IACxC;AAAA,MACE,GAAK,EAAA,UAAA;AAAA,MACL,IAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,EAAE,YAAc,EAAA,CAAC,YAAY,IAAM,EAAA,QAAA,EAAU,IAAI,CAAE;AAAA,GACrD;AAEA,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
+ {"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":";;;;;;;;AAsCa,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;;;;"}
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;;;;"}
@@ -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.make({
7
- params: {
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((m) => compatWrapper(/* @__PURE__ */ jsx(m.Router, {})))
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.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
+ {"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.1.0",
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.20.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.8",
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"