@backstage-community/plugin-announcements 2.5.1 → 2.7.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 +25 -0
- package/README.md +9 -1
- package/dist/alpha/apis.esm.js.map +1 -1
- package/dist/alpha/banner.esm.js.map +1 -1
- package/dist/alpha/components/admin/announcements/AnnouncementForm/AnnouncementForm.esm.js +21 -17
- package/dist/alpha/components/admin/announcements/AnnouncementForm/AnnouncementForm.esm.js.map +1 -1
- package/dist/alpha/components/admin/announcements/AnnouncementsContent.esm.js +20 -17
- package/dist/alpha/components/admin/announcements/AnnouncementsContent.esm.js.map +1 -1
- package/dist/alpha/components/admin/categories/CategoriesContent.esm.js +15 -12
- package/dist/alpha/components/admin/categories/CategoriesContent.esm.js.map +1 -1
- package/dist/alpha/components/admin/tags/TagsContent.esm.js +17 -15
- package/dist/alpha/components/admin/tags/TagsContent.esm.js.map +1 -1
- package/dist/alpha/entityCards.esm.js.map +1 -1
- package/dist/alpha/navItems.esm.js.map +1 -1
- package/dist/alpha/pages.esm.js.map +1 -1
- package/dist/alpha/search.esm.js.map +1 -1
- package/dist/alpha.d.ts +2 -1
- package/dist/alpha.esm.js.map +1 -1
- package/package.json +19 -19
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# @backstage-community/plugin-announcements
|
|
2
2
|
|
|
3
|
+
## 2.7.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- e0c2eb4: Backstage version bump to v1.49.2
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- a24a1d0: Improved jsdocs for all alpha exports
|
|
12
|
+
- Updated dependencies [e0c2eb4]
|
|
13
|
+
- @backstage-community/plugin-announcements-common@0.19.0
|
|
14
|
+
- @backstage-community/plugin-announcements-react@0.24.0
|
|
15
|
+
|
|
16
|
+
## 2.6.0
|
|
17
|
+
|
|
18
|
+
### Minor Changes
|
|
19
|
+
|
|
20
|
+
- 8403fca: Backstage version bump to v1.49.1. This release also includes migration from `AlertApi` to the new `ToastApi`.
|
|
21
|
+
|
|
22
|
+
### Patch Changes
|
|
23
|
+
|
|
24
|
+
- 7397465: Updated dependency `slugify` to `1.6.8`.
|
|
25
|
+
- Updated dependencies [8403fca]
|
|
26
|
+
- @backstage-community/plugin-announcements-react@0.23.0
|
|
27
|
+
|
|
3
28
|
## 2.5.1
|
|
4
29
|
|
|
5
30
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -94,7 +94,7 @@ Banner params:
|
|
|
94
94
|
```yaml
|
|
95
95
|
app:
|
|
96
96
|
extensions:
|
|
97
|
-
- announcements/banner:
|
|
97
|
+
- app-root-element:announcements/banner:
|
|
98
98
|
config:
|
|
99
99
|
max: 2
|
|
100
100
|
category: updates
|
|
@@ -103,6 +103,14 @@ app:
|
|
|
103
103
|
tags: ['security', 'platform']
|
|
104
104
|
```
|
|
105
105
|
|
|
106
|
+
To disable the banner entirely:
|
|
107
|
+
|
|
108
|
+
```yaml
|
|
109
|
+
app:
|
|
110
|
+
extensions:
|
|
111
|
+
- app-root-element:announcements/banner: false
|
|
112
|
+
```
|
|
113
|
+
|
|
106
114
|
The entity card will only appear on components & systems by default, but you can override that
|
|
107
115
|
behavior by passing a filter into the card extension like so:
|
|
108
116
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apis.esm.js","sources":["../../src/alpha/apis.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n ApiBlueprint,\n discoveryApiRef,\n errorApiRef,\n fetchApiRef,\n identityApiRef,\n} from '@backstage/frontend-plugin-api';\nimport {\n announcementsApiRef,\n AnnouncementsClient,\n} from '@backstage-community/plugin-announcements-react';\n\n/**\n * @alpha\n */\nexport const announcementsApiExtension = ApiBlueprint.make({\n params: define =>\n define({\n api: announcementsApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n identityApi: identityApiRef,\n fetchApi: fetchApiRef,\n errorApi: errorApiRef,\n },\n factory: ({ discoveryApi, identityApi, fetchApi, errorApi }) =>\n new AnnouncementsClient({\n discoveryApi,\n identityApi,\n fetchApi,\n errorApi,\n }),\n }),\n});\n"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"apis.esm.js","sources":["../../src/alpha/apis.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n ApiBlueprint,\n discoveryApiRef,\n errorApiRef,\n fetchApiRef,\n identityApiRef,\n} from '@backstage/frontend-plugin-api';\nimport {\n announcementsApiRef,\n AnnouncementsClient,\n} from '@backstage-community/plugin-announcements-react';\n\n/**\n * Provides the frontend Announcements API\n * {@link @backstage-community/plugin-announcements-react#AnnouncementsClient}\n *\n * @remarks\n * Extension ID: `api:announcements`\n *\n * @alpha\n */\nexport const announcementsApiExtension = ApiBlueprint.make({\n params: define =>\n define({\n api: announcementsApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n identityApi: identityApiRef,\n fetchApi: fetchApiRef,\n errorApi: errorApiRef,\n },\n factory: ({ discoveryApi, identityApi, fetchApi, errorApi }) =>\n new AnnouncementsClient({\n discoveryApi,\n identityApi,\n fetchApi,\n errorApi,\n }),\n }),\n});\n"],"names":[],"mappings":";;;AAoCa,MAAA,yBAAA,GAA4B,aAAa,IAAK,CAAA;AAAA,EACzD,MAAA,EAAQ,YACN,MAAO,CAAA;AAAA,IACL,GAAK,EAAA,mBAAA;AAAA,IACL,IAAM,EAAA;AAAA,MACJ,YAAc,EAAA,eAAA;AAAA,MACd,WAAa,EAAA,cAAA;AAAA,MACb,QAAU,EAAA,WAAA;AAAA,MACV,QAAU,EAAA;AAAA,KACZ;AAAA,IACA,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,aAAa,QAAU,EAAA,QAAA,EAC/C,KAAA,IAAI,mBAAoB,CAAA;AAAA,MACtB,YAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACD;AAAA,GACJ;AACL,CAAC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"banner.esm.js","sources":["../../src/alpha/banner.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { compatWrapper } from '@backstage/core-compat-api';\nimport { AppRootElementBlueprint } from '@backstage/frontend-plugin-api';\nimport { NewAnnouncementBanner } from '../components/NewAnnouncementBanner';\n\n/**\n * @alpha\n */\nexport const announcementsBanner = AppRootElementBlueprint.makeWithOverrides({\n name: 'banner',\n config: {\n schema: {\n max: z => z.number().optional().default(1),\n category: z => z.string().optional(),\n active: z => z.boolean().optional(),\n current: z => z.boolean().optional(),\n tags: z => z.array(z.string()).optional(),\n },\n },\n factory: (originalFactory, { config }) => {\n return originalFactory({\n element: compatWrapper(<NewAnnouncementBanner {...config} />),\n });\n },\n});\n"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"banner.esm.js","sources":["../../src/alpha/banner.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { compatWrapper } from '@backstage/core-compat-api';\nimport { AppRootElementBlueprint } from '@backstage/frontend-plugin-api';\nimport { NewAnnouncementBanner } from '../components/NewAnnouncementBanner';\n\n/**\n * Displays unseen announcements as dismissable banners at the app root.\n *\n * @remarks\n * Extension ID: `app-root-element:announcements/banner`\n *\n * @alpha\n */\nexport const announcementsBanner = AppRootElementBlueprint.makeWithOverrides({\n name: 'banner',\n config: {\n schema: {\n max: z => z.number().optional().default(1),\n category: z => z.string().optional(),\n active: z => z.boolean().optional(),\n current: z => z.boolean().optional(),\n tags: z => z.array(z.string()).optional(),\n },\n },\n factory: (originalFactory, { config }) => {\n return originalFactory({\n element: compatWrapper(<NewAnnouncementBanner {...config} />),\n });\n },\n});\n"],"names":[],"mappings":";;;;;AA4Ba,MAAA,mBAAA,GAAsB,wBAAwB,iBAAkB,CAAA;AAAA,EAC3E,IAAM,EAAA,QAAA;AAAA,EACN,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA;AAAA,MACN,GAAA,EAAK,OAAK,CAAE,CAAA,MAAA,GAAS,QAAS,EAAA,CAAE,QAAQ,CAAC,CAAA;AAAA,MACzC,QAAU,EAAA,CAAA,CAAA,KAAK,CAAE,CAAA,MAAA,GAAS,QAAS,EAAA;AAAA,MACnC,MAAQ,EAAA,CAAA,CAAA,KAAK,CAAE,CAAA,OAAA,GAAU,QAAS,EAAA;AAAA,MAClC,OAAS,EAAA,CAAA,CAAA,KAAK,CAAE,CAAA,OAAA,GAAU,QAAS,EAAA;AAAA,MACnC,IAAA,EAAM,OAAK,CAAE,CAAA,KAAA,CAAM,EAAE,MAAO,EAAC,EAAE,QAAS;AAAA;AAC1C,GACF;AAAA,EACA,OAAS,EAAA,CAAC,eAAiB,EAAA,EAAE,QAAa,KAAA;AACxC,IAAA,OAAO,eAAgB,CAAA;AAAA,MACrB,SAAS,aAAc,iBAAA,GAAA,CAAC,qBAAuB,EAAA,EAAA,GAAG,QAAQ,CAAE;AAAA,KAC7D,CAAA;AAAA;AAEL,CAAC;;;;"}
|
|
@@ -3,16 +3,16 @@ import { useState } from 'react';
|
|
|
3
3
|
import MDEditor from '@uiw/react-md-editor';
|
|
4
4
|
import { DateTime } from 'luxon';
|
|
5
5
|
import slugify from 'slugify';
|
|
6
|
-
import { useApi, identityApiRef,
|
|
6
|
+
import { useApi, identityApiRef, toastApiRef } from '@backstage/frontend-plugin-api';
|
|
7
7
|
import { Card, CardHeader, Text, CardBody, Box, Grid, TextField, Flex, Button, Switch } from '@backstage/ui';
|
|
8
8
|
import { RiAddLine, RiSave2Line } from '@remixicon/react';
|
|
9
9
|
import { announcementsApiRef, useAnnouncementsTranslation, useCategories, useTags } from '@backstage-community/plugin-announcements-react';
|
|
10
|
-
import '@backstage/frontend-plugin-api';
|
|
11
10
|
import '../../../../../routes.esm.js';
|
|
12
11
|
import '@backstage/plugin-catalog-react';
|
|
13
12
|
import 'react-router-dom';
|
|
14
13
|
import { CategorySelectInput } from '../../../shared/CategorySelectInput/CategorySelectInput.esm.js';
|
|
15
14
|
import { TagsSelectInput } from '../../../shared/TagsSelectInput/TagsSelectInput.esm.js';
|
|
15
|
+
import '@backstage/core-plugin-api';
|
|
16
16
|
import { CreateCategoryDialog } from '../../categories/CreateCategoryDialog.esm.js';
|
|
17
17
|
import { CreateTagDialog } from '../../tags/CreateTagDialog.esm.js';
|
|
18
18
|
import OnBehalfTeamDropdown from './OnBehalfTeamDropdown.esm.js';
|
|
@@ -24,7 +24,7 @@ const AnnouncementForm = ({
|
|
|
24
24
|
}) => {
|
|
25
25
|
const identityApi = useApi(identityApiRef);
|
|
26
26
|
const announcementsApi = useApi(announcementsApiRef);
|
|
27
|
-
const
|
|
27
|
+
const toastApi = useApi(toastApiRef);
|
|
28
28
|
const { t } = useAnnouncementsTranslation();
|
|
29
29
|
const {
|
|
30
30
|
categories,
|
|
@@ -55,9 +55,10 @@ const AnnouncementForm = ({
|
|
|
55
55
|
(cat) => cat.slug === slugifiedTitle
|
|
56
56
|
);
|
|
57
57
|
if (existingCategory) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
toastApi.post({
|
|
59
|
+
title: t("categoriesForm.errors.alreadyExists"),
|
|
60
|
+
status: "warning",
|
|
61
|
+
timeout: 5e3
|
|
61
62
|
});
|
|
62
63
|
setForm((prevForm) => ({
|
|
63
64
|
...prevForm,
|
|
@@ -67,9 +68,10 @@ const AnnouncementForm = ({
|
|
|
67
68
|
} else {
|
|
68
69
|
try {
|
|
69
70
|
await announcementsApi.createCategory(request);
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
toastApi.post({
|
|
72
|
+
title: t("newCategoryDialog.createdMessage"),
|
|
73
|
+
status: "success",
|
|
74
|
+
timeout: 5e3
|
|
73
75
|
});
|
|
74
76
|
setShowCreateCategoryDialog(false);
|
|
75
77
|
refreshCategories();
|
|
@@ -81,7 +83,7 @@ const AnnouncementForm = ({
|
|
|
81
83
|
}
|
|
82
84
|
}));
|
|
83
85
|
} catch (err) {
|
|
84
|
-
|
|
86
|
+
toastApi.post({ title: err.message, status: "danger" });
|
|
85
87
|
}
|
|
86
88
|
}
|
|
87
89
|
};
|
|
@@ -89,9 +91,10 @@ const AnnouncementForm = ({
|
|
|
89
91
|
const slugifiedTitle = slugify(request.title.trim(), { lower: true });
|
|
90
92
|
const existingTag = tags?.find((tag) => tag.slug === slugifiedTitle);
|
|
91
93
|
if (existingTag) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
94
|
+
toastApi.post({
|
|
95
|
+
title: t("tagsForm.errors.alreadyExists"),
|
|
96
|
+
status: "warning",
|
|
97
|
+
timeout: 5e3
|
|
95
98
|
});
|
|
96
99
|
setForm((prevForm) => ({
|
|
97
100
|
...prevForm,
|
|
@@ -101,9 +104,10 @@ const AnnouncementForm = ({
|
|
|
101
104
|
} else {
|
|
102
105
|
try {
|
|
103
106
|
await announcementsApi.createTag(request);
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
+
toastApi.post({
|
|
108
|
+
title: t("newTagDialog.createdMessage"),
|
|
109
|
+
status: "success",
|
|
110
|
+
timeout: 5e3
|
|
107
111
|
});
|
|
108
112
|
setShowCreateTagDialog(false);
|
|
109
113
|
refreshTags();
|
|
@@ -113,7 +117,7 @@ const AnnouncementForm = ({
|
|
|
113
117
|
tags: [...prevForm.tags ?? [], newTag]
|
|
114
118
|
}));
|
|
115
119
|
} catch (err) {
|
|
116
|
-
|
|
120
|
+
toastApi.post({ title: err.message, status: "danger" });
|
|
117
121
|
}
|
|
118
122
|
}
|
|
119
123
|
};
|
package/dist/alpha/components/admin/announcements/AnnouncementForm/AnnouncementForm.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnnouncementForm.esm.js","sources":["../../../../../../src/alpha/components/admin/announcements/AnnouncementForm/AnnouncementForm.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, type FormEvent } from 'react';\nimport MDEditor from '@uiw/react-md-editor';\nimport { DateTime } from 'luxon';\nimport slugify from 'slugify';\nimport {\n identityApiRef,\n useApi,\n alertApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n Box,\n Button,\n Card,\n CardBody,\n CardHeader,\n Flex,\n Grid,\n Text,\n TextField,\n Switch,\n} from '@backstage/ui';\nimport { RiSave2Line, RiAddLine } from '@remixicon/react';\nimport {\n CreateAnnouncementRequest,\n CreateCategoryRequest,\n CreateTagRequest,\n useAnnouncementsTranslation,\n announcementsApiRef,\n useCategories,\n useTags,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n Announcement,\n Category,\n Tag,\n} from '@backstage-community/plugin-announcements-common';\n\nimport { CategorySelectInput, TagsSelectInput } from '../../../shared';\nimport { CreateCategoryDialog } from '../../categories';\nimport { CreateTagDialog } from '../../tags';\nimport OnBehalfTeamDropdown from './OnBehalfTeamDropdown';\n\nimport MuiTextField from '@mui/material/TextField';\n\ntype AnnouncementFormProps = {\n initialData: Announcement;\n onSubmit: (data: CreateAnnouncementRequest) => Promise<void>;\n};\n\nexport const AnnouncementForm = ({\n initialData,\n onSubmit,\n}: AnnouncementFormProps) => {\n const identityApi = useApi(identityApiRef);\n const announcementsApi = useApi(announcementsApiRef);\n const alertApi = useApi(alertApiRef);\n const { t } = useAnnouncementsTranslation();\n const {\n categories,\n loading: categoriesLoading,\n retry: refreshCategories,\n } = useCategories();\n const { tags, loading: tagsLoading, retry: refreshTags } = useTags();\n\n const formattedStartAt = initialData.start_at\n ? DateTime.fromISO(initialData.start_at).toISODate()\n : DateTime.now().toISODate();\n\n const formattedUntilDate = initialData.until_date\n ? DateTime.fromISO(initialData.until_date).toISODate()\n : DateTime.now().endOf('day').plus({ days: 7 }).toISODate();\n\n const [form, setForm] = useState({\n ...initialData,\n active: initialData.active ?? true,\n category: initialData.category ?? null,\n start_at: formattedStartAt || '',\n until_date: formattedUntilDate || '',\n tags: initialData.tags ?? null,\n sendNotification: initialData.sendNotification ?? false,\n });\n const [loading, setLoading] = useState(false);\n const [onBehalfOfSelectedTeam, setOnBehalfOfSelectedTeam] = useState(\n initialData.on_behalf_of || '',\n );\n const [showCreateCategoryDialog, setShowCreateCategoryDialog] =\n useState(false);\n const [showCreateTagDialog, setShowCreateTagDialog] = useState(false);\n\n const handleCreateCategory = async (request: CreateCategoryRequest) => {\n const slugifiedTitle = slugify(request.title.trim(), { lower: true });\n const existingCategory = categories.find(\n cat => cat.slug === slugifiedTitle,\n );\n\n if (existingCategory) {\n alertApi.post({\n message: t('categoriesForm.errors.alreadyExists'),\n severity: 'warning',\n });\n\n // Select the existing category in the form\n setForm(prevForm => ({\n ...prevForm,\n category: existingCategory,\n }));\n\n setShowCreateCategoryDialog(false);\n } else {\n try {\n await announcementsApi.createCategory(request);\n\n alertApi.post({\n message: t('newCategoryDialog.createdMessage'),\n severity: 'success',\n });\n\n setShowCreateCategoryDialog(false);\n refreshCategories();\n\n // Select the new category in the form\n setForm(prevForm => ({\n ...prevForm,\n category: {\n title: request.title,\n slug: slugifiedTitle,\n },\n }));\n } catch (err) {\n alertApi.post({ message: (err as Error).message, severity: 'error' });\n }\n }\n };\n\n const handleCreateTag = async (request: CreateTagRequest) => {\n const slugifiedTitle = slugify(request.title.trim(), { lower: true });\n const existingTag = tags?.find(tag => tag.slug === slugifiedTitle);\n\n if (existingTag) {\n alertApi.post({\n message: t('tagsForm.errors.alreadyExists'),\n severity: 'warning',\n });\n\n setForm(prevForm => ({\n ...prevForm,\n tags: [...(prevForm.tags ?? []), existingTag],\n }));\n\n setShowCreateTagDialog(false);\n } else {\n try {\n await announcementsApi.createTag(request);\n\n alertApi.post({\n message: t('newTagDialog.createdMessage'),\n severity: 'success',\n });\n\n setShowCreateTagDialog(false);\n refreshTags();\n\n const newTag = { title: request.title, slug: slugifiedTitle };\n\n setForm(prevForm => ({\n ...prevForm,\n tags: [...(prevForm.tags ?? []), newTag],\n }));\n } catch (err) {\n alertApi.post({ message: (err as Error).message, severity: 'error' });\n }\n }\n };\n\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n setLoading(true);\n event.preventDefault();\n\n const userIdentity = await identityApi.getBackstageIdentity();\n\n const {\n id,\n created_at,\n category,\n tags: formTags,\n ...announcementData\n } = form;\n\n const createRequest: CreateAnnouncementRequest = {\n ...announcementData,\n category: category?.slug,\n tags: formTags?.map(tag => tag.slug),\n publisher: userIdentity.userEntityRef,\n on_behalf_of: onBehalfOfSelectedTeam,\n };\n\n try {\n await onSubmit(createRequest);\n } catch (error) {\n throw error;\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <Card>\n <CardHeader>\n <Text variant=\"title-small\">\n {initialData.title\n ? t('announcementForm.editAnnouncement')\n : t('announcementForm.newAnnouncement')}\n </Text>\n </CardHeader>\n\n <CardBody>\n <Box p=\"3\">\n <form onSubmit={handleSubmit}>\n <Grid.Root columns=\"12\">\n <Grid.Item colSpan=\"12\">\n <TextField\n label={t('announcementForm.title')}\n value={form.title}\n onChange={title => setForm({ ...form, title })}\n isRequired\n />\n </Grid.Item>\n\n <Grid.Item colSpan=\"12\">\n <TextField\n label={t('announcementForm.excerpt')}\n value={form.excerpt}\n onChange={excerpt => setForm({ ...form, excerpt })}\n isRequired\n />\n </Grid.Item>\n\n <Grid.Item colSpan=\"12\">\n <MDEditor\n value={form.body}\n style={{ minHeight: '30rem' }}\n onChange={value =>\n setForm({ ...form, ...{ body: value || '' } })\n }\n />\n </Grid.Item>\n\n <Grid.Item colSpan={{ xs: '12', md: '4' }}>\n <Flex gap=\"2\" align=\"end\">\n <Box style={{ flex: 1 }}>\n <CategorySelectInput\n initialCategory={form.category ?? undefined}\n categories={categories}\n isLoading={categoriesLoading}\n setCategory={(category: Category | null) =>\n setForm(prev => ({ ...prev, category }))\n }\n />\n </Box>\n\n <Button\n data-testid=\"create-category-icon-button\"\n variant=\"secondary\"\n size=\"small\"\n iconStart={<RiAddLine />}\n onClick={() => setShowCreateCategoryDialog(true)}\n aria-label={t('admin.categoriesContent.createButton')}\n />\n </Flex>\n </Grid.Item>\n\n <Grid.Item colSpan={{ xs: '12', md: '4' }}>\n <OnBehalfTeamDropdown\n selectedTeam={onBehalfOfSelectedTeam}\n onChange={setOnBehalfOfSelectedTeam}\n />\n </Grid.Item>\n\n <Grid.Item colSpan={{ xs: '12', md: '4' }}>\n <Flex gap=\"2\" align=\"end\">\n <Box style={{ flex: 1 }}>\n <TagsSelectInput\n initialTags={form.tags ?? undefined}\n tags={tags}\n isLoading={tagsLoading}\n setTags={(selectedTags: Tag[] | null) =>\n setForm(prev => ({ ...prev, tags: selectedTags }))\n }\n />\n </Box>\n\n <Button\n data-testid=\"create-tag-icon-button\"\n variant=\"secondary\"\n size=\"small\"\n iconStart={<RiAddLine />}\n onClick={() => setShowCreateTagDialog(true)}\n aria-label={t('admin.tagsContent.createButton')}\n />\n </Flex>\n </Grid.Item>\n\n <Grid.Item colSpan={{ xs: '12', md: '4' }}>\n <MuiTextField\n variant=\"outlined\"\n label={t('announcementForm.startAt')}\n id=\"start-at-date\"\n type=\"date\"\n value={form.start_at}\n InputLabelProps={{ shrink: true }}\n required\n fullWidth\n onChange={e =>\n setForm({\n ...form,\n start_at: e.target.value,\n })\n }\n />\n </Grid.Item>\n\n <Grid.Item colSpan={{ xs: '12', md: '4' }}>\n <MuiTextField\n variant=\"outlined\"\n label={t('announcementForm.untilDate')}\n id=\"until-date\"\n type=\"date\"\n value={form.until_date}\n InputLabelProps={{ shrink: true }}\n fullWidth\n onChange={e =>\n setForm({\n ...form,\n until_date: e.target.value,\n })\n }\n inputProps={{\n min: DateTime.fromISO(form.start_at)\n .endOf('day')\n .plus({ days: 1 })\n .toISODate(),\n }}\n />\n </Grid.Item>\n\n <Grid.Item colSpan=\"12\">\n <Flex justify=\"end\">\n <Switch\n name=\"active\"\n label={t('announcementForm.active')}\n isSelected={form.active}\n onChange={isSelected =>\n setForm({ ...form, active: isSelected })\n }\n />\n <Switch\n name=\"sendNotification\"\n label={t('announcementForm.sendNotification')}\n isSelected={form.sendNotification}\n onChange={isSelected =>\n setForm({ ...form, sendNotification: isSelected })\n }\n />\n <Button\n type=\"submit\"\n isDisabled={loading || !form.body}\n iconStart={<RiSave2Line />}\n >\n {t('announcementForm.submit')}\n </Button>\n </Flex>\n </Grid.Item>\n </Grid.Root>\n </form>\n </Box>\n </CardBody>\n\n <CreateCategoryDialog\n open={showCreateCategoryDialog}\n onConfirm={handleCreateCategory}\n onCancel={() => setShowCreateCategoryDialog(false)}\n />\n\n <CreateTagDialog\n open={showCreateTagDialog}\n onConfirm={handleCreateTag}\n onCancel={() => setShowCreateTagDialog(false)}\n />\n </Card>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AnnouncementForm.esm.js","sources":["../../../../../../src/alpha/components/admin/announcements/AnnouncementForm/AnnouncementForm.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, type FormEvent } from 'react';\nimport MDEditor from '@uiw/react-md-editor';\nimport { DateTime } from 'luxon';\nimport slugify from 'slugify';\nimport {\n toastApiRef,\n identityApiRef,\n useApi,\n} from '@backstage/frontend-plugin-api';\nimport {\n Box,\n Button,\n Card,\n CardBody,\n CardHeader,\n Flex,\n Grid,\n Text,\n TextField,\n Switch,\n} from '@backstage/ui';\nimport { RiSave2Line, RiAddLine } from '@remixicon/react';\nimport {\n CreateAnnouncementRequest,\n CreateCategoryRequest,\n CreateTagRequest,\n useAnnouncementsTranslation,\n announcementsApiRef,\n useCategories,\n useTags,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n Announcement,\n Category,\n Tag,\n} from '@backstage-community/plugin-announcements-common';\n\nimport { CategorySelectInput, TagsSelectInput } from '../../../shared';\nimport { CreateCategoryDialog } from '../../categories';\nimport { CreateTagDialog } from '../../tags';\nimport OnBehalfTeamDropdown from './OnBehalfTeamDropdown';\n\nimport MuiTextField from '@mui/material/TextField';\n\ntype AnnouncementFormProps = {\n initialData: Announcement;\n onSubmit: (data: CreateAnnouncementRequest) => Promise<void>;\n};\n\nexport const AnnouncementForm = ({\n initialData,\n onSubmit,\n}: AnnouncementFormProps) => {\n const identityApi = useApi(identityApiRef);\n const announcementsApi = useApi(announcementsApiRef);\n const toastApi = useApi(toastApiRef);\n const { t } = useAnnouncementsTranslation();\n const {\n categories,\n loading: categoriesLoading,\n retry: refreshCategories,\n } = useCategories();\n const { tags, loading: tagsLoading, retry: refreshTags } = useTags();\n\n const formattedStartAt = initialData.start_at\n ? DateTime.fromISO(initialData.start_at).toISODate()\n : DateTime.now().toISODate();\n\n const formattedUntilDate = initialData.until_date\n ? DateTime.fromISO(initialData.until_date).toISODate()\n : DateTime.now().endOf('day').plus({ days: 7 }).toISODate();\n\n const [form, setForm] = useState({\n ...initialData,\n active: initialData.active ?? true,\n category: initialData.category ?? null,\n start_at: formattedStartAt || '',\n until_date: formattedUntilDate || '',\n tags: initialData.tags ?? null,\n sendNotification: initialData.sendNotification ?? false,\n });\n const [loading, setLoading] = useState(false);\n const [onBehalfOfSelectedTeam, setOnBehalfOfSelectedTeam] = useState(\n initialData.on_behalf_of || '',\n );\n const [showCreateCategoryDialog, setShowCreateCategoryDialog] =\n useState(false);\n const [showCreateTagDialog, setShowCreateTagDialog] = useState(false);\n\n const handleCreateCategory = async (request: CreateCategoryRequest) => {\n const slugifiedTitle = slugify(request.title.trim(), { lower: true });\n const existingCategory = categories.find(\n cat => cat.slug === slugifiedTitle,\n );\n\n if (existingCategory) {\n toastApi.post({\n title: t('categoriesForm.errors.alreadyExists'),\n status: 'warning',\n timeout: 5000,\n });\n\n // Select the existing category in the form\n setForm(prevForm => ({\n ...prevForm,\n category: existingCategory,\n }));\n\n setShowCreateCategoryDialog(false);\n } else {\n try {\n await announcementsApi.createCategory(request);\n\n toastApi.post({\n title: t('newCategoryDialog.createdMessage'),\n status: 'success',\n timeout: 5000,\n });\n\n setShowCreateCategoryDialog(false);\n refreshCategories();\n\n // Select the new category in the form\n setForm(prevForm => ({\n ...prevForm,\n category: {\n title: request.title,\n slug: slugifiedTitle,\n },\n }));\n } catch (err) {\n toastApi.post({ title: (err as Error).message, status: 'danger' });\n }\n }\n };\n\n const handleCreateTag = async (request: CreateTagRequest) => {\n const slugifiedTitle = slugify(request.title.trim(), { lower: true });\n const existingTag = tags?.find(tag => tag.slug === slugifiedTitle);\n\n if (existingTag) {\n toastApi.post({\n title: t('tagsForm.errors.alreadyExists'),\n status: 'warning',\n timeout: 5000,\n });\n\n setForm(prevForm => ({\n ...prevForm,\n tags: [...(prevForm.tags ?? []), existingTag],\n }));\n\n setShowCreateTagDialog(false);\n } else {\n try {\n await announcementsApi.createTag(request);\n\n toastApi.post({\n title: t('newTagDialog.createdMessage'),\n status: 'success',\n timeout: 5000,\n });\n\n setShowCreateTagDialog(false);\n refreshTags();\n\n const newTag = { title: request.title, slug: slugifiedTitle };\n\n setForm(prevForm => ({\n ...prevForm,\n tags: [...(prevForm.tags ?? []), newTag],\n }));\n } catch (err) {\n toastApi.post({ title: (err as Error).message, status: 'danger' });\n }\n }\n };\n\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n setLoading(true);\n event.preventDefault();\n\n const userIdentity = await identityApi.getBackstageIdentity();\n\n const {\n id,\n created_at,\n category,\n tags: formTags,\n ...announcementData\n } = form;\n\n const createRequest: CreateAnnouncementRequest = {\n ...announcementData,\n category: category?.slug,\n tags: formTags?.map(tag => tag.slug),\n publisher: userIdentity.userEntityRef,\n on_behalf_of: onBehalfOfSelectedTeam,\n };\n\n try {\n await onSubmit(createRequest);\n } catch (error) {\n throw error;\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <Card>\n <CardHeader>\n <Text variant=\"title-small\">\n {initialData.title\n ? t('announcementForm.editAnnouncement')\n : t('announcementForm.newAnnouncement')}\n </Text>\n </CardHeader>\n\n <CardBody>\n <Box p=\"3\">\n <form onSubmit={handleSubmit}>\n <Grid.Root columns=\"12\">\n <Grid.Item colSpan=\"12\">\n <TextField\n label={t('announcementForm.title')}\n value={form.title}\n onChange={title => setForm({ ...form, title })}\n isRequired\n />\n </Grid.Item>\n\n <Grid.Item colSpan=\"12\">\n <TextField\n label={t('announcementForm.excerpt')}\n value={form.excerpt}\n onChange={excerpt => setForm({ ...form, excerpt })}\n isRequired\n />\n </Grid.Item>\n\n <Grid.Item colSpan=\"12\">\n <MDEditor\n value={form.body}\n style={{ minHeight: '30rem' }}\n onChange={value =>\n setForm({ ...form, ...{ body: value || '' } })\n }\n />\n </Grid.Item>\n\n <Grid.Item colSpan={{ xs: '12', md: '4' }}>\n <Flex gap=\"2\" align=\"end\">\n <Box style={{ flex: 1 }}>\n <CategorySelectInput\n initialCategory={form.category ?? undefined}\n categories={categories}\n isLoading={categoriesLoading}\n setCategory={(category: Category | null) =>\n setForm(prev => ({ ...prev, category }))\n }\n />\n </Box>\n\n <Button\n data-testid=\"create-category-icon-button\"\n variant=\"secondary\"\n size=\"small\"\n iconStart={<RiAddLine />}\n onClick={() => setShowCreateCategoryDialog(true)}\n aria-label={t('admin.categoriesContent.createButton')}\n />\n </Flex>\n </Grid.Item>\n\n <Grid.Item colSpan={{ xs: '12', md: '4' }}>\n <OnBehalfTeamDropdown\n selectedTeam={onBehalfOfSelectedTeam}\n onChange={setOnBehalfOfSelectedTeam}\n />\n </Grid.Item>\n\n <Grid.Item colSpan={{ xs: '12', md: '4' }}>\n <Flex gap=\"2\" align=\"end\">\n <Box style={{ flex: 1 }}>\n <TagsSelectInput\n initialTags={form.tags ?? undefined}\n tags={tags}\n isLoading={tagsLoading}\n setTags={(selectedTags: Tag[] | null) =>\n setForm(prev => ({ ...prev, tags: selectedTags }))\n }\n />\n </Box>\n\n <Button\n data-testid=\"create-tag-icon-button\"\n variant=\"secondary\"\n size=\"small\"\n iconStart={<RiAddLine />}\n onClick={() => setShowCreateTagDialog(true)}\n aria-label={t('admin.tagsContent.createButton')}\n />\n </Flex>\n </Grid.Item>\n\n <Grid.Item colSpan={{ xs: '12', md: '4' }}>\n <MuiTextField\n variant=\"outlined\"\n label={t('announcementForm.startAt')}\n id=\"start-at-date\"\n type=\"date\"\n value={form.start_at}\n InputLabelProps={{ shrink: true }}\n required\n fullWidth\n onChange={e =>\n setForm({\n ...form,\n start_at: e.target.value,\n })\n }\n />\n </Grid.Item>\n\n <Grid.Item colSpan={{ xs: '12', md: '4' }}>\n <MuiTextField\n variant=\"outlined\"\n label={t('announcementForm.untilDate')}\n id=\"until-date\"\n type=\"date\"\n value={form.until_date}\n InputLabelProps={{ shrink: true }}\n fullWidth\n onChange={e =>\n setForm({\n ...form,\n until_date: e.target.value,\n })\n }\n inputProps={{\n min: DateTime.fromISO(form.start_at)\n .endOf('day')\n .plus({ days: 1 })\n .toISODate(),\n }}\n />\n </Grid.Item>\n\n <Grid.Item colSpan=\"12\">\n <Flex justify=\"end\">\n <Switch\n name=\"active\"\n label={t('announcementForm.active')}\n isSelected={form.active}\n onChange={isSelected =>\n setForm({ ...form, active: isSelected })\n }\n />\n <Switch\n name=\"sendNotification\"\n label={t('announcementForm.sendNotification')}\n isSelected={form.sendNotification}\n onChange={isSelected =>\n setForm({ ...form, sendNotification: isSelected })\n }\n />\n <Button\n type=\"submit\"\n isDisabled={loading || !form.body}\n iconStart={<RiSave2Line />}\n >\n {t('announcementForm.submit')}\n </Button>\n </Flex>\n </Grid.Item>\n </Grid.Root>\n </form>\n </Box>\n </CardBody>\n\n <CreateCategoryDialog\n open={showCreateCategoryDialog}\n onConfirm={handleCreateCategory}\n onCancel={() => setShowCreateCategoryDialog(false)}\n />\n\n <CreateTagDialog\n open={showCreateTagDialog}\n onConfirm={handleCreateTag}\n onCancel={() => setShowCreateTagDialog(false)}\n />\n </Card>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { useState, useMemo } from 'react';
|
|
3
|
-
import { useApi
|
|
3
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
4
4
|
import { announcementsApiRef, useAnnouncementsTranslation, useAnnouncementsPermissions, useAnnouncements } from '@backstage-community/plugin-announcements-react';
|
|
5
5
|
import { announcementCreatePermission } from '@backstage-community/plugin-announcements-common';
|
|
6
|
-
import { useRouteRef } from '@backstage/frontend-plugin-api';
|
|
6
|
+
import { toastApiRef, useRouteRef } from '@backstage/frontend-plugin-api';
|
|
7
7
|
import { useNavigate } from 'react-router-dom';
|
|
8
8
|
import { RequirePermission } from '@backstage/plugin-permission-react';
|
|
9
9
|
import { Grid, Box, Flex, Button } from '@backstage/ui';
|
|
@@ -25,7 +25,7 @@ const AnnouncementsContent = ({
|
|
|
25
25
|
formDefaults: { defaultInactive }
|
|
26
26
|
}) => {
|
|
27
27
|
const announcementsApi = useApi(announcementsApiRef);
|
|
28
|
-
const
|
|
28
|
+
const toastApi = useApi(toastApiRef);
|
|
29
29
|
const { t } = useAnnouncementsTranslation();
|
|
30
30
|
const permissions = useAnnouncementsPermissions();
|
|
31
31
|
const [showCreateAnnouncementForm, setShowCreateAnnouncementForm] = useState(false);
|
|
@@ -53,14 +53,15 @@ const AnnouncementsContent = ({
|
|
|
53
53
|
const onSubmit = async (request) => {
|
|
54
54
|
try {
|
|
55
55
|
await announcementsApi.createAnnouncement(request);
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
toastApi.post({
|
|
57
|
+
title: t("admin.announcementsContent.alertMessage"),
|
|
58
|
+
status: "success",
|
|
59
|
+
timeout: 5e3
|
|
59
60
|
});
|
|
60
61
|
setShowCreateAnnouncementForm(false);
|
|
61
62
|
refresh();
|
|
62
63
|
} catch (err) {
|
|
63
|
-
|
|
64
|
+
toastApi.post({ title: err.message, status: "danger" });
|
|
64
65
|
}
|
|
65
66
|
};
|
|
66
67
|
const onUpdate = async (request) => {
|
|
@@ -69,14 +70,15 @@ const AnnouncementsContent = ({
|
|
|
69
70
|
}
|
|
70
71
|
try {
|
|
71
72
|
await announcementsApi.updateAnnouncement(editingAnnouncementId, request);
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
toastApi.post({
|
|
74
|
+
title: t("editAnnouncementPage.updatedMessage"),
|
|
75
|
+
status: "success",
|
|
76
|
+
timeout: 5e3
|
|
75
77
|
});
|
|
76
78
|
setEditingAnnouncementId(null);
|
|
77
79
|
refresh();
|
|
78
80
|
} catch (err) {
|
|
79
|
-
|
|
81
|
+
toastApi.post({ title: err.message, status: "danger" });
|
|
80
82
|
}
|
|
81
83
|
};
|
|
82
84
|
const onCancelCreate = () => {
|
|
@@ -98,14 +100,15 @@ const AnnouncementsContent = ({
|
|
|
98
100
|
closeDeleteDialog();
|
|
99
101
|
try {
|
|
100
102
|
await announcementsApi.deleteAnnouncementByID(announcementToDelete.id);
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
103
|
+
toastApi.post({
|
|
104
|
+
title: t("admin.announcementsContent.deletedMessage"),
|
|
105
|
+
status: "success",
|
|
106
|
+
timeout: 5e3
|
|
104
107
|
});
|
|
105
108
|
} catch (err) {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
+
toastApi.post({
|
|
110
|
+
title: err.body?.error?.message || err.message,
|
|
111
|
+
status: "danger"
|
|
109
112
|
});
|
|
110
113
|
}
|
|
111
114
|
refresh();
|
|
@@ -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 /**\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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"}
|
|
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 } 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, toastApiRef } 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 toastApi = useApi(toastApiRef);\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 toastApi.post({\n title: t('admin.announcementsContent.alertMessage'),\n status: 'success',\n timeout: 5000,\n });\n\n setShowCreateAnnouncementForm(false);\n refresh();\n } catch (err) {\n toastApi.post({ title: (err as Error).message, status: 'danger' });\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 toastApi.post({\n title: t('editAnnouncementPage.updatedMessage'),\n status: 'success',\n timeout: 5000,\n });\n\n setEditingAnnouncementId(null);\n refresh();\n } catch (err) {\n toastApi.post({ title: (err as Error).message, status: 'danger' });\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 toastApi.post({\n title: t('admin.announcementsContent.deletedMessage'),\n status: 'success',\n timeout: 5000,\n });\n } catch (err) {\n toastApi.post({\n title:\n (err as ResponseError).body?.error?.message || (err as Error).message,\n status: 'danger',\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,6 +1,7 @@
|
|
|
1
1
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { useState } from 'react';
|
|
3
|
-
import { useApi
|
|
3
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
4
|
+
import { toastApiRef } from '@backstage/frontend-plugin-api';
|
|
4
5
|
import { announcementsApiRef, useAnnouncementsTranslation, useAnnouncementsPermissions, useCategories } from '@backstage-community/plugin-announcements-react';
|
|
5
6
|
import { useDeleteConfirmationDialogState } from '../shared/DeleteConfirmationDialog/useDeleteConfirmationDialogState.esm.js';
|
|
6
7
|
import { DeleteConfirmationDialog } from '../shared/DeleteConfirmationDialog/DeleteConfirmationDialog.esm.js';
|
|
@@ -10,7 +11,7 @@ import { CategoriesTableCard } from './CategoriesTableCard.esm.js';
|
|
|
10
11
|
|
|
11
12
|
const CategoriesContent = () => {
|
|
12
13
|
const announcementsApi = useApi(announcementsApiRef);
|
|
13
|
-
const
|
|
14
|
+
const toastApi = useApi(toastApiRef);
|
|
14
15
|
const [showNewCategoryForm, setShowNewCategoryForm] = useState(false);
|
|
15
16
|
const { t } = useAnnouncementsTranslation();
|
|
16
17
|
const permissions = useAnnouncementsPermissions();
|
|
@@ -27,14 +28,15 @@ const CategoriesContent = () => {
|
|
|
27
28
|
await announcementsApi.createCategory({
|
|
28
29
|
title
|
|
29
30
|
});
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
toastApi.post({
|
|
32
|
+
title: `${title} ${t("admin.categoriesContent.createdMessage")}`,
|
|
33
|
+
status: "success",
|
|
34
|
+
timeout: 5e3
|
|
33
35
|
});
|
|
34
36
|
setShowNewCategoryForm(false);
|
|
35
37
|
refresh();
|
|
36
38
|
} catch (err) {
|
|
37
|
-
|
|
39
|
+
toastApi.post({ title: err.message, status: "danger" });
|
|
38
40
|
}
|
|
39
41
|
};
|
|
40
42
|
const onCreateButtonClick = () => {
|
|
@@ -50,14 +52,15 @@ const CategoriesContent = () => {
|
|
|
50
52
|
closeDeleteDialog();
|
|
51
53
|
try {
|
|
52
54
|
await announcementsApi.deleteCategory(categoryToDelete.slug);
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
55
|
+
toastApi.post({
|
|
56
|
+
title: t("admin.categoriesContent.table.categoryDeleted"),
|
|
57
|
+
status: "success",
|
|
58
|
+
timeout: 5e3
|
|
56
59
|
});
|
|
57
60
|
} catch (err) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
+
toastApi.post({
|
|
62
|
+
title: err.body.error.message,
|
|
63
|
+
status: "danger"
|
|
61
64
|
});
|
|
62
65
|
}
|
|
63
66
|
refresh();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CategoriesContent.esm.js","sources":["../../../../../src/alpha/components/admin/categories/CategoriesContent.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 { useApi
|
|
1
|
+
{"version":3,"file":"CategoriesContent.esm.js","sources":["../../../../../src/alpha/components/admin/categories/CategoriesContent.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 { useApi } from '@backstage/core-plugin-api';\nimport { toastApiRef } from '@backstage/frontend-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport {\n CreateCategoryRequest,\n announcementsApiRef,\n useAnnouncementsTranslation,\n useCategories,\n useAnnouncementsPermissions,\n} from '@backstage-community/plugin-announcements-react';\nimport { Category } from '@backstage-community/plugin-announcements-common';\n\nimport {\n useDeleteConfirmationDialogState,\n DeleteConfirmationDialog,\n} from '../shared';\nimport { CreateCategoryDialog } from './CreateCategoryDialog';\nimport { CategoriesTableCard } from './CategoriesTableCard';\n\n/**\n * @internal\n */\nexport const CategoriesContent = () => {\n const announcementsApi = useApi(announcementsApiRef);\n const toastApi = useApi(toastApiRef);\n\n const [showNewCategoryForm, setShowNewCategoryForm] = useState(false);\n const { t } = useAnnouncementsTranslation();\n const permissions = useAnnouncementsPermissions();\n\n const { categories, retry: refresh } = useCategories();\n\n const {\n isOpen: isDeleteDialogOpen,\n close: closeDeleteDialog,\n open: openDeleteDialog,\n item: categoryToDelete,\n } = useDeleteConfirmationDialogState<Category>();\n\n const onConfirmCreate = async (request: CreateCategoryRequest) => {\n const { title } = request;\n\n try {\n await announcementsApi.createCategory({\n title,\n });\n\n toastApi.post({\n title: `${title} ${t('admin.categoriesContent.createdMessage')}`,\n status: 'success',\n timeout: 5000,\n });\n\n setShowNewCategoryForm(false);\n refresh();\n } catch (err) {\n toastApi.post({ title: (err as Error).message, status: 'danger' });\n }\n };\n\n const onCreateButtonClick = () => {\n setShowNewCategoryForm(true);\n };\n\n const onCancelCreate = () => {\n setShowNewCategoryForm(false);\n };\n\n const onCancelDelete = () => {\n closeDeleteDialog();\n };\n\n const onConfirmDelete = async () => {\n closeDeleteDialog();\n\n try {\n await announcementsApi.deleteCategory(categoryToDelete!.slug);\n\n toastApi.post({\n title: t('admin.categoriesContent.table.categoryDeleted'),\n status: 'success',\n timeout: 5000,\n });\n } catch (err) {\n toastApi.post({\n title: (err as ResponseError).body.error.message,\n status: 'danger',\n });\n }\n\n refresh();\n };\n\n const onDeleteClick = (category: Category) => {\n openDeleteDialog(category);\n };\n\n const canCreate = !permissions.create.loading && permissions.create.allowed;\n const canDelete = !permissions.delete.loading && permissions.delete.allowed;\n\n return (\n <>\n <CategoriesTableCard\n categories={categories ?? []}\n onCreateClick={onCreateButtonClick}\n onDeleteClick={onDeleteClick}\n canCreate={canCreate}\n canDelete={canDelete}\n />\n\n <CreateCategoryDialog\n open={showNewCategoryForm}\n onConfirm={onConfirmCreate}\n onCancel={onCancelCreate}\n canSubmit={canCreate}\n />\n\n <DeleteConfirmationDialog\n type=\"category\"\n itemTitle={categoryToDelete?.title}\n open={isDeleteDialogOpen}\n onCancel={onCancelDelete}\n onConfirm={onConfirmDelete}\n canDelete={canDelete}\n />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { useState } from 'react';
|
|
3
3
|
import { useTags, announcementsApiRef, useAnnouncementsTranslation, useAnnouncementsPermissions } from '@backstage-community/plugin-announcements-react';
|
|
4
|
-
import { useApi,
|
|
4
|
+
import { useApi, toastApiRef } from '@backstage/frontend-plugin-api';
|
|
5
5
|
import { useDeleteConfirmationDialogState } from '../shared/DeleteConfirmationDialog/useDeleteConfirmationDialogState.esm.js';
|
|
6
6
|
import { DeleteConfirmationDialog } from '../shared/DeleteConfirmationDialog/DeleteConfirmationDialog.esm.js';
|
|
7
7
|
import '@backstage/ui';
|
|
@@ -12,7 +12,7 @@ const TagsContent = () => {
|
|
|
12
12
|
const [showNewTagForm, setShowNewTagForm] = useState(false);
|
|
13
13
|
const { tags, retry: refresh } = useTags();
|
|
14
14
|
const announcementsApi = useApi(announcementsApiRef);
|
|
15
|
-
const
|
|
15
|
+
const toastApi = useApi(toastApiRef);
|
|
16
16
|
const { t } = useAnnouncementsTranslation();
|
|
17
17
|
const permissions = useAnnouncementsPermissions();
|
|
18
18
|
const {
|
|
@@ -27,20 +27,21 @@ const TagsContent = () => {
|
|
|
27
27
|
await announcementsApi.createTag({
|
|
28
28
|
title
|
|
29
29
|
});
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
toastApi.post({
|
|
31
|
+
title: `${title} ${t("admin.tagsContent.createdMessage")}`,
|
|
32
|
+
status: "success",
|
|
33
|
+
timeout: 5e3
|
|
33
34
|
});
|
|
34
35
|
setShowNewTagForm(false);
|
|
35
36
|
refresh();
|
|
36
37
|
} catch (err) {
|
|
37
38
|
if (err.response?.status === 409) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
toastApi.post({
|
|
40
|
+
title: t("admin.tagsContent.errors.alreadyExists"),
|
|
41
|
+
status: "danger"
|
|
41
42
|
});
|
|
42
43
|
} else {
|
|
43
|
-
|
|
44
|
+
toastApi.post({ title: err.message, status: "danger" });
|
|
44
45
|
}
|
|
45
46
|
}
|
|
46
47
|
};
|
|
@@ -57,14 +58,15 @@ const TagsContent = () => {
|
|
|
57
58
|
closeDeleteDialog();
|
|
58
59
|
try {
|
|
59
60
|
await announcementsApi.deleteTag(tagToDelete.slug);
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
toastApi.post({
|
|
62
|
+
title: t("admin.tagsContent.table.tagDeleted"),
|
|
63
|
+
status: "success",
|
|
64
|
+
timeout: 5e3
|
|
63
65
|
});
|
|
64
66
|
} catch (err) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
toastApi.post({
|
|
68
|
+
title: err.body.error.message,
|
|
69
|
+
status: "danger"
|
|
68
70
|
});
|
|
69
71
|
}
|
|
70
72
|
refresh();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TagsContent.esm.js","sources":["../../../../../src/alpha/components/admin/tags/TagsContent.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 CreateTagRequest,\n announcementsApiRef,\n useAnnouncementsTranslation,\n useTags,\n useAnnouncementsPermissions,\n} from '@backstage-community/plugin-announcements-react';\nimport { Tag } from '@backstage-community/plugin-announcements-common';\nimport {
|
|
1
|
+
{"version":3,"file":"TagsContent.esm.js","sources":["../../../../../src/alpha/components/admin/tags/TagsContent.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 CreateTagRequest,\n announcementsApiRef,\n useAnnouncementsTranslation,\n useTags,\n useAnnouncementsPermissions,\n} from '@backstage-community/plugin-announcements-react';\nimport { Tag } from '@backstage-community/plugin-announcements-common';\nimport { toastApiRef, useApi } from '@backstage/frontend-plugin-api';\nimport { ResponseError } from '@backstage/errors';\n\nimport {\n useDeleteConfirmationDialogState,\n DeleteConfirmationDialog,\n} from '../shared';\nimport { CreateTagDialog } from './CreateTagDialog';\nimport { TagsTableCard } from './TagsTableCard';\n\n/**\n * @internal\n */\nexport const TagsContent = () => {\n const [showNewTagForm, setShowNewTagForm] = useState(false);\n const { tags, retry: refresh } = useTags();\n const announcementsApi = useApi(announcementsApiRef);\n const toastApi = useApi(toastApiRef);\n const { t } = useAnnouncementsTranslation();\n const permissions = useAnnouncementsPermissions();\n\n const {\n isOpen: isDeleteDialogOpen,\n close: closeDeleteDialog,\n open: openDeleteDialog,\n item: tagToDelete,\n } = useDeleteConfirmationDialogState<Tag>();\n\n const onConfirmCreate = async (request: CreateTagRequest) => {\n const { title } = request;\n\n try {\n await announcementsApi.createTag({\n title,\n });\n\n toastApi.post({\n title: `${title} ${t('admin.tagsContent.createdMessage')}`,\n status: 'success',\n timeout: 5000,\n });\n\n setShowNewTagForm(false);\n refresh();\n } catch (err: any) {\n if (err.response?.status === 409) {\n toastApi.post({\n title: t('admin.tagsContent.errors.alreadyExists'),\n status: 'danger',\n });\n } else {\n toastApi.post({ title: (err as Error).message, status: 'danger' });\n }\n }\n };\n\n const onCreateButtonClick = () => {\n setShowNewTagForm(true);\n };\n\n const onCancelCreate = () => {\n setShowNewTagForm(false);\n };\n\n const onCancelDelete = () => {\n closeDeleteDialog();\n };\n\n const onConfirmDelete = async () => {\n closeDeleteDialog();\n\n try {\n await announcementsApi.deleteTag(tagToDelete!.slug);\n\n toastApi.post({\n title: t('admin.tagsContent.table.tagDeleted'),\n status: 'success',\n timeout: 5000,\n });\n } catch (err) {\n toastApi.post({\n title: (err as ResponseError).body.error.message,\n status: 'danger',\n });\n }\n\n refresh();\n };\n\n const onDeleteClick = (tag: Tag) => {\n openDeleteDialog(tag);\n };\n\n const canCreate = !permissions.create.loading && permissions.create.allowed;\n const canDelete = !permissions.delete.loading && permissions.delete.allowed;\n\n return (\n <>\n <TagsTableCard\n tags={tags ?? []}\n onCreateClick={onCreateButtonClick}\n onDeleteClick={onDeleteClick}\n canCreate={canCreate}\n canDelete={canDelete}\n />\n\n <CreateTagDialog\n open={showNewTagForm}\n onConfirm={onConfirmCreate}\n onCancel={onCancelCreate}\n canSubmit={canCreate}\n />\n\n <DeleteConfirmationDialog\n type=\"tag\"\n itemTitle={tagToDelete?.title}\n open={isDeleteDialogOpen}\n onCancel={onCancelDelete}\n onConfirm={onConfirmDelete}\n canDelete={canDelete}\n />\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AAqCO,MAAM,cAAc,MAAM;AAC/B,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,EAAE,IAAA,EAAM,KAAO,EAAA,OAAA,KAAY,OAAQ,EAAA;AACzC,EAAM,MAAA,gBAAA,GAAmB,OAAO,mBAAmB,CAAA;AACnD,EAAM,MAAA,QAAA,GAAW,OAAO,WAAW,CAAA;AACnC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAC1C,EAAA,MAAM,cAAc,2BAA4B,EAAA;AAEhD,EAAM,MAAA;AAAA,IACJ,MAAQ,EAAA,kBAAA;AAAA,IACR,KAAO,EAAA,iBAAA;AAAA,IACP,IAAM,EAAA,gBAAA;AAAA,IACN,IAAM,EAAA;AAAA,MACJ,gCAAsC,EAAA;AAE1C,EAAM,MAAA,eAAA,GAAkB,OAAO,OAA8B,KAAA;AAC3D,IAAM,MAAA,EAAE,OAAU,GAAA,OAAA;AAElB,IAAI,IAAA;AACF,MAAA,MAAM,iBAAiB,SAAU,CAAA;AAAA,QAC/B;AAAA,OACD,CAAA;AAED,MAAA,QAAA,CAAS,IAAK,CAAA;AAAA,QACZ,OAAO,CAAG,EAAA,KAAK,CAAI,CAAA,EAAA,CAAA,CAAE,kCAAkC,CAAC,CAAA,CAAA;AAAA,QACxD,MAAQ,EAAA,SAAA;AAAA,QACR,OAAS,EAAA;AAAA,OACV,CAAA;AAED,MAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,MAAQ,OAAA,EAAA;AAAA,aACD,GAAU,EAAA;AACjB,MAAI,IAAA,GAAA,CAAI,QAAU,EAAA,MAAA,KAAW,GAAK,EAAA;AAChC,QAAA,QAAA,CAAS,IAAK,CAAA;AAAA,UACZ,KAAA,EAAO,EAAE,wCAAwC,CAAA;AAAA,UACjD,MAAQ,EAAA;AAAA,SACT,CAAA;AAAA,OACI,MAAA;AACL,QAAA,QAAA,CAAS,KAAK,EAAE,KAAA,EAAQ,IAAc,OAAS,EAAA,MAAA,EAAQ,UAAU,CAAA;AAAA;AACnE;AACF,GACF;AAEA,EAAA,MAAM,sBAAsB,MAAM;AAChC,IAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,GACxB;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,GACzB;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAkB,iBAAA,EAAA;AAAA,GACpB;AAEA,EAAA,MAAM,kBAAkB,YAAY;AAClC,IAAkB,iBAAA,EAAA;AAElB,IAAI,IAAA;AACF,MAAM,MAAA,gBAAA,CAAiB,SAAU,CAAA,WAAA,CAAa,IAAI,CAAA;AAElD,MAAA,QAAA,CAAS,IAAK,CAAA;AAAA,QACZ,KAAA,EAAO,EAAE,oCAAoC,CAAA;AAAA,QAC7C,MAAQ,EAAA,SAAA;AAAA,QACR,OAAS,EAAA;AAAA,OACV,CAAA;AAAA,aACM,GAAK,EAAA;AACZ,MAAA,QAAA,CAAS,IAAK,CAAA;AAAA,QACZ,KAAA,EAAQ,GAAsB,CAAA,IAAA,CAAK,KAAM,CAAA,OAAA;AAAA,QACzC,MAAQ,EAAA;AAAA,OACT,CAAA;AAAA;AAGH,IAAQ,OAAA,EAAA;AAAA,GACV;AAEA,EAAM,MAAA,aAAA,GAAgB,CAAC,GAAa,KAAA;AAClC,IAAA,gBAAA,CAAiB,GAAG,CAAA;AAAA,GACtB;AAEA,EAAA,MAAM,YAAY,CAAC,WAAA,CAAY,MAAO,CAAA,OAAA,IAAW,YAAY,MAAO,CAAA,OAAA;AACpE,EAAA,MAAM,YAAY,CAAC,WAAA,CAAY,MAAO,CAAA,OAAA,IAAW,YAAY,MAAO,CAAA,OAAA;AAEpE,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,QAAQ,EAAC;AAAA,QACf,aAAe,EAAA,mBAAA;AAAA,QACf,aAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,oBAEA,GAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,IAAM,EAAA,cAAA;AAAA,QACN,SAAW,EAAA,eAAA;AAAA,QACX,QAAU,EAAA,cAAA;AAAA,QACV,SAAW,EAAA;AAAA;AAAA,KACb;AAAA,oBAEA,GAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,IAAK,EAAA,KAAA;AAAA,QACL,WAAW,WAAa,EAAA,KAAA;AAAA,QACxB,IAAM,EAAA,kBAAA;AAAA,QACN,QAAU,EAAA,cAAA;AAAA,QACV,SAAW,EAAA,eAAA;AAAA,QACX;AAAA;AAAA;AACF,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entityCards.esm.js","sources":["../../src/alpha/entityCards.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 { compatWrapper } from '@backstage/core-compat-api';\nimport { EntityCardBlueprint } from '@backstage/plugin-catalog-react/alpha';\n\n/**\n * @alpha\n */\nexport const entityAnnouncementsCard = EntityCardBlueprint.make({\n name: 'announcements',\n disabled: true,\n params: {\n filter: 'kind:component,system',\n loader: async () =>\n import('../components/AnnouncementsCard').then(m =>\n compatWrapper(<m.AnnouncementsCard />),\n ),\n },\n});\n"],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"entityCards.esm.js","sources":["../../src/alpha/entityCards.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 { compatWrapper } from '@backstage/core-compat-api';\nimport { EntityCardBlueprint } from '@backstage/plugin-catalog-react/alpha';\n\n/**\n * An entity card that displays announcements relevant to a catalog entity.\n *\n * @remarks\n * Extension ID: `entity-card:announcements/announcements`\n *\n * Disabled by default — must be explicitly enabled in `app-config.yaml`.\n *\n * @alpha\n */\nexport const entityAnnouncementsCard = EntityCardBlueprint.make({\n name: 'announcements',\n disabled: true,\n params: {\n filter: 'kind:component,system',\n loader: async () =>\n import('../components/AnnouncementsCard').then(m =>\n compatWrapper(<m.AnnouncementsCard />),\n ),\n },\n});\n"],"names":[],"mappings":";;;;AA4Ba,MAAA,uBAAA,GAA0B,oBAAoB,IAAK,CAAA;AAAA,EAC9D,IAAM,EAAA,eAAA;AAAA,EACN,QAAU,EAAA,IAAA;AAAA,EACV,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA,uBAAA;AAAA,IACR,MAAQ,EAAA,YACN,OAAO,8CAAiC,CAAE,CAAA,IAAA;AAAA,MAAK,OAC7C,aAAc,iBAAA,GAAA,CAAC,CAAE,CAAA,iBAAA,EAAF,EAAoB,CAAE;AAAA;AACvC;AAEN,CAAC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navItems.esm.js","sources":["../../src/alpha/navItems.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 IconComponent,\n NavItemBlueprint,\n} from '@backstage/frontend-plugin-api';\nimport { convertLegacyRouteRef } from '@backstage/core-compat-api';\nimport { rootRouteRef } from '../routes';\nimport { RiMegaphoneLine } from '@remixicon/react';\n/**\n * @alpha\n */\nexport const announcementsNavItem = NavItemBlueprint.make({\n params: {\n title: 'Announcements',\n routeRef: convertLegacyRouteRef(rootRouteRef),\n icon: RiMegaphoneLine as IconComponent,\n },\n});\n\nexport default [announcementsNavItem];\n"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"navItems.esm.js","sources":["../../src/alpha/navItems.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 IconComponent,\n NavItemBlueprint,\n} from '@backstage/frontend-plugin-api';\nimport { convertLegacyRouteRef } from '@backstage/core-compat-api';\nimport { rootRouteRef } from '../routes';\nimport { RiMegaphoneLine } from '@remixicon/react';\n/**\n * Sidebar navigation item linking to the announcements page.\n *\n * @remarks\n * Extension ID: `nav-item:announcements`\n *\n * @alpha\n */\nexport const announcementsNavItem = NavItemBlueprint.make({\n params: {\n title: 'Announcements',\n routeRef: convertLegacyRouteRef(rootRouteRef),\n icon: RiMegaphoneLine as IconComponent,\n },\n});\n\nexport default [announcementsNavItem];\n"],"names":[],"mappings":";;;;;AA8Ba,MAAA,oBAAA,GAAuB,iBAAiB,IAAK,CAAA;AAAA,EACxD,MAAQ,EAAA;AAAA,IACN,KAAO,EAAA,eAAA;AAAA,IACP,QAAA,EAAU,sBAAsB,YAAY,CAAA;AAAA,IAC5C,IAAM,EAAA;AAAA;AAEV,CAAC;;;;"}
|
|
@@ -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.makeWithOverrides({\n config: {\n schema: {\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":";;;;;
|
|
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 * The announcements page provides a filterable list of announcements.\n *\n * @remarks\n * Extension ID: `page:announcements`\n *\n * @alpha\n */\nexport const announcementsPage = PageBlueprint.makeWithOverrides({\n config: {\n schema: {\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":";;;;;AA8Ba,MAAA,iBAAA,GAAoB,cAAc,iBAAkB,CAAA;AAAA,EAC/D,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA;AAAA;AAAA;AAAA;AAAA,MAIN,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;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.esm.js","sources":["../../src/alpha/search.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n SearchFilterResultTypeBlueprint,\n SearchResultListItemBlueprint,\n} from '@backstage/plugin-search-react/alpha';\nimport { RiMegaphoneLine } from '@remixicon/react';\n\nexport const announcementsSearchResultListItem =\n SearchResultListItemBlueprint.make({\n params: {\n component: () =>\n import('../components/AnnouncementSearchResultListItem').then(\n m => m.AnnouncementSearchResultListItem,\n ),\n predicate: result => result.type === 'announcements',\n icon: <RiMegaphoneLine />,\n },\n });\n\nexport const announcementsSearchFilterResultType =\n SearchFilterResultTypeBlueprint.make({\n name: 'announcements-results-type',\n params: {\n name: 'Announcements',\n value: 'announcements',\n icon: <RiMegaphoneLine />,\n },\n });\n"],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"search.esm.js","sources":["../../src/alpha/search.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n SearchFilterResultTypeBlueprint,\n SearchResultListItemBlueprint,\n} from '@backstage/plugin-search-react/alpha';\nimport { RiMegaphoneLine } from '@remixicon/react';\n\n/**\n * Search result list item that renders announcement search results.\n *\n * @remarks\n * Extension ID: `search-result-list-item:announcements`\n *\n * @alpha\n */\nexport const announcementsSearchResultListItem =\n SearchResultListItemBlueprint.make({\n params: {\n component: () =>\n import('../components/AnnouncementSearchResultListItem').then(\n m => m.AnnouncementSearchResultListItem,\n ),\n predicate: result => result.type === 'announcements',\n icon: <RiMegaphoneLine />,\n },\n });\n\n/**\n * Search filter result type that adds \"Announcements\" as a filterable\n * result type in the search page.\n *\n * @remarks\n * Extension ID: `search-filter-result-type:announcements/announcements-results-type`\n *\n * @alpha\n */\nexport const announcementsSearchFilterResultType =\n SearchFilterResultTypeBlueprint.make({\n name: 'announcements-results-type',\n params: {\n name: 'Announcements',\n value: 'announcements',\n icon: <RiMegaphoneLine />,\n },\n });\n"],"names":[],"mappings":";;;;AA6Ba,MAAA,iCAAA,GACX,8BAA8B,IAAK,CAAA;AAAA,EACjC,MAAQ,EAAA;AAAA,IACN,SAAW,EAAA,MACT,OAAO,6DAAgD,CAAE,CAAA,IAAA;AAAA,MACvD,OAAK,CAAE,CAAA;AAAA,KACT;AAAA,IACF,SAAA,EAAW,CAAU,MAAA,KAAA,MAAA,CAAO,IAAS,KAAA,eAAA;AAAA,IACrC,IAAA,sBAAO,eAAgB,EAAA,EAAA;AAAA;AAE3B,CAAC;AAWU,MAAA,mCAAA,GACX,gCAAgC,IAAK,CAAA;AAAA,EACnC,IAAM,EAAA,4BAAA;AAAA,EACN,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,eAAA;AAAA,IACN,KAAO,EAAA,eAAA;AAAA,IACP,IAAA,sBAAO,eAAgB,EAAA,EAAA;AAAA;AAE3B,CAAC;;;;"}
|
package/dist/alpha.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ import * as react from 'react';
|
|
|
7
7
|
import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
+
* The announcements frontend plugin for the new frontend system.
|
|
11
|
+
*
|
|
10
12
|
* @alpha
|
|
11
13
|
*/
|
|
12
14
|
declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin<{
|
|
@@ -128,7 +130,6 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
|
|
|
128
130
|
kind: "page";
|
|
129
131
|
name: undefined;
|
|
130
132
|
params: {
|
|
131
|
-
defaultPath?: [Error: "Use the 'path' param instead"] | undefined;
|
|
132
133
|
path: string;
|
|
133
134
|
title?: string | undefined;
|
|
134
135
|
icon?: _backstage_frontend_plugin_api.IconElement | undefined;
|
package/dist/alpha.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alpha.esm.js","sources":["../src/alpha.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { convertLegacyRouteRefs } from '@backstage/core-compat-api';\nimport { createFrontendPlugin } from '@backstage/frontend-plugin-api';\nimport { announcementsApiExtension } from './alpha/apis';\nimport { entityAnnouncementsCard } from './alpha/entityCards';\nimport { announcementsNavItem } from './alpha/navItems';\nimport { announcementsPage } from './alpha/pages';\nimport { announcementsBanner } from './alpha/banner';\nimport {\n announcementsSearchFilterResultType,\n announcementsSearchResultListItem,\n} from './alpha/search';\nimport { rootRouteRef } from './routes';\n\n/**\n * @alpha\n */\nexport default createFrontendPlugin({\n pluginId: 'announcements',\n routes: convertLegacyRouteRefs({\n root: rootRouteRef,\n }),\n extensions: [\n announcementsApiExtension,\n entityAnnouncementsCard,\n announcementsPage,\n announcementsNavItem,\n announcementsSearchResultListItem,\n announcementsSearchFilterResultType,\n announcementsBanner,\n ],\n});\n"],"names":[],"mappings":";;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"alpha.esm.js","sources":["../src/alpha.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { convertLegacyRouteRefs } from '@backstage/core-compat-api';\nimport { createFrontendPlugin } from '@backstage/frontend-plugin-api';\nimport { announcementsApiExtension } from './alpha/apis';\nimport { entityAnnouncementsCard } from './alpha/entityCards';\nimport { announcementsNavItem } from './alpha/navItems';\nimport { announcementsPage } from './alpha/pages';\nimport { announcementsBanner } from './alpha/banner';\nimport {\n announcementsSearchFilterResultType,\n announcementsSearchResultListItem,\n} from './alpha/search';\nimport { rootRouteRef } from './routes';\n\n/**\n * The announcements frontend plugin for the new frontend system.\n *\n * @alpha\n */\nexport default createFrontendPlugin({\n pluginId: 'announcements',\n routes: convertLegacyRouteRefs({\n root: rootRouteRef,\n }),\n extensions: [\n announcementsApiExtension,\n entityAnnouncementsCard,\n announcementsPage,\n announcementsNavItem,\n announcementsSearchResultListItem,\n announcementsSearchFilterResultType,\n announcementsBanner,\n ],\n});\n"],"names":[],"mappings":";;;;;;;;;;AAiCA,YAAe,oBAAqB,CAAA;AAAA,EAClC,QAAU,EAAA,eAAA;AAAA,EACV,QAAQ,sBAAuB,CAAA;AAAA,IAC7B,IAAM,EAAA;AAAA,GACP,CAAA;AAAA,EACD,UAAY,EAAA;AAAA,IACV,yBAAA;AAAA,IACA,uBAAA;AAAA,IACA,iBAAA;AAAA,IACA,oBAAA;AAAA,IACA,iCAAA;AAAA,IACA,mCAAA;AAAA,IACA;AAAA;AAEJ,CAAC,CAAA;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage-community/plugin-announcements",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.7.0",
|
|
4
4
|
"main": "./dist/index.esm.js",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -61,21 +61,21 @@
|
|
|
61
61
|
"postpack": "backstage-cli package postpack"
|
|
62
62
|
},
|
|
63
63
|
"dependencies": {
|
|
64
|
-
"@backstage-community/plugin-announcements-common": "^0.
|
|
65
|
-
"@backstage-community/plugin-announcements-react": "^0.
|
|
66
|
-
"@backstage/catalog-model": "^1.7.
|
|
67
|
-
"@backstage/core-compat-api": "^0.5.
|
|
68
|
-
"@backstage/core-components": "^0.18.
|
|
69
|
-
"@backstage/core-plugin-api": "^1.12.
|
|
64
|
+
"@backstage-community/plugin-announcements-common": "^0.19.0",
|
|
65
|
+
"@backstage-community/plugin-announcements-react": "^0.24.0",
|
|
66
|
+
"@backstage/catalog-model": "^1.7.7",
|
|
67
|
+
"@backstage/core-compat-api": "^0.5.9",
|
|
68
|
+
"@backstage/core-components": "^0.18.8",
|
|
69
|
+
"@backstage/core-plugin-api": "^1.12.4",
|
|
70
70
|
"@backstage/errors": "^1.2.7",
|
|
71
|
-
"@backstage/frontend-plugin-api": "^0.
|
|
72
|
-
"@backstage/plugin-catalog-react": "^2.
|
|
73
|
-
"@backstage/plugin-permission-react": "^0.4.
|
|
71
|
+
"@backstage/frontend-plugin-api": "^0.15.1",
|
|
72
|
+
"@backstage/plugin-catalog-react": "^2.1.0",
|
|
73
|
+
"@backstage/plugin-permission-react": "^0.4.41",
|
|
74
74
|
"@backstage/plugin-search-common": "^1.2.22",
|
|
75
|
-
"@backstage/plugin-search-react": "^1.
|
|
76
|
-
"@backstage/plugin-signals-react": "^0.0.
|
|
75
|
+
"@backstage/plugin-search-react": "^1.11.0",
|
|
76
|
+
"@backstage/plugin-signals-react": "^0.0.20",
|
|
77
77
|
"@backstage/theme": "^0.7.2",
|
|
78
|
-
"@backstage/ui": "^0.
|
|
78
|
+
"@backstage/ui": "^0.13.1",
|
|
79
79
|
"@material-ui/core": "^4.12.2",
|
|
80
80
|
"@material-ui/icons": "^4.11.3",
|
|
81
81
|
"@material-ui/lab": "4.0.0-alpha.61",
|
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
"@uiw/react-md-editor": "^4.0.11",
|
|
86
86
|
"luxon": "^3.2.0",
|
|
87
87
|
"react-use": "^17.2.4",
|
|
88
|
-
"slugify": "1.6.
|
|
88
|
+
"slugify": "1.6.8"
|
|
89
89
|
},
|
|
90
90
|
"peerDependencies": {
|
|
91
91
|
"react": "^17.0.0 || ^18.0.0",
|
|
@@ -93,11 +93,11 @@
|
|
|
93
93
|
"react-router-dom": "^6.3.0"
|
|
94
94
|
},
|
|
95
95
|
"devDependencies": {
|
|
96
|
-
"@backstage/cli": "^0.
|
|
97
|
-
"@backstage/dev-utils": "^1.1.
|
|
98
|
-
"@backstage/frontend-test-utils": "^0.5.
|
|
99
|
-
"@backstage/plugin-signals": "^0.0.
|
|
100
|
-
"@backstage/test-utils": "^1.7.
|
|
96
|
+
"@backstage/cli": "^0.36.0",
|
|
97
|
+
"@backstage/dev-utils": "^1.1.21",
|
|
98
|
+
"@backstage/frontend-test-utils": "^0.5.1",
|
|
99
|
+
"@backstage/plugin-signals": "^0.0.29",
|
|
100
|
+
"@backstage/test-utils": "^1.7.16",
|
|
101
101
|
"@testing-library/jest-dom": "^6.3.0",
|
|
102
102
|
"@testing-library/react": "^14.0.0",
|
|
103
103
|
"@testing-library/user-event": "^14.5.1",
|