@backstage-community/plugin-announcements 2.5.1 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @backstage-community/plugin-announcements
2
2
 
3
+ ## 2.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 8403fca: Backstage version bump to v1.49.1. This release also includes migration from `AlertApi` to the new `ToastApi`.
8
+
9
+ ### Patch Changes
10
+
11
+ - 7397465: Updated dependency `slugify` to `1.6.8`.
12
+ - Updated dependencies [8403fca]
13
+ - @backstage-community/plugin-announcements-react@0.23.0
14
+
3
15
  ## 2.5.1
4
16
 
5
17
  ### Patch Changes
@@ -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, alertApiRef } from '@backstage/core-plugin-api';
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 alertApi = useApi(alertApiRef);
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
- alertApi.post({
59
- message: t("categoriesForm.errors.alreadyExists"),
60
- severity: "warning"
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
- alertApi.post({
71
- message: t("newCategoryDialog.createdMessage"),
72
- severity: "success"
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
- alertApi.post({ message: err.message, severity: "error" });
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
- alertApi.post({
93
- message: t("tagsForm.errors.alreadyExists"),
94
- severity: "warning"
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
- alertApi.post({
105
- message: t("newTagDialog.createdMessage"),
106
- severity: "success"
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
- alertApi.post({ message: err.message, severity: "error" });
120
+ toastApi.post({ title: err.message, status: "danger" });
117
121
  }
118
122
  }
119
123
  };
@@ -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":";;;;;;;;;;;;;;;;;;;;AAgEO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,WAAA;AAAA,EACA;AACF,CAA6B,KAAA;AAC3B,EAAM,MAAA,WAAA,GAAc,OAAO,cAAc,CAAA;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,EAAM,MAAA;AAAA,IACJ,UAAA;AAAA,IACA,OAAS,EAAA,iBAAA;AAAA,IACT,KAAO,EAAA;AAAA,MACL,aAAc,EAAA;AAClB,EAAA,MAAM,EAAE,IAAM,EAAA,OAAA,EAAS,aAAa,KAAO,EAAA,WAAA,KAAgB,OAAQ,EAAA;AAEnE,EAAA,MAAM,gBAAmB,GAAA,WAAA,CAAY,QACjC,GAAA,QAAA,CAAS,OAAQ,CAAA,WAAA,CAAY,QAAQ,CAAA,CAAE,SAAU,EAAA,GACjD,QAAS,CAAA,GAAA,GAAM,SAAU,EAAA;AAE7B,EAAM,MAAA,kBAAA,GAAqB,YAAY,UACnC,GAAA,QAAA,CAAS,QAAQ,WAAY,CAAA,UAAU,CAAE,CAAA,SAAA,EACzC,GAAA,QAAA,CAAS,KAAM,CAAA,KAAA,CAAM,KAAK,CAAE,CAAA,IAAA,CAAK,EAAE,IAAM,EAAA,CAAA,EAAG,CAAA,CAAE,SAAU,EAAA;AAE5D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,QAAS,CAAA;AAAA,IAC/B,GAAG,WAAA;AAAA,IACH,MAAA,EAAQ,YAAY,MAAU,IAAA,IAAA;AAAA,IAC9B,QAAA,EAAU,YAAY,QAAY,IAAA,IAAA;AAAA,IAClC,UAAU,gBAAoB,IAAA,EAAA;AAAA,IAC9B,YAAY,kBAAsB,IAAA,EAAA;AAAA,IAClC,IAAA,EAAM,YAAY,IAAQ,IAAA,IAAA;AAAA,IAC1B,gBAAA,EAAkB,YAAY,gBAAoB,IAAA;AAAA,GACnD,CAAA;AACD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAM,MAAA,CAAC,sBAAwB,EAAA,yBAAyB,CAAI,GAAA,QAAA;AAAA,IAC1D,YAAY,YAAgB,IAAA;AAAA,GAC9B;AACA,EAAA,MAAM,CAAC,wBAAA,EAA0B,2BAA2B,CAAA,GAC1D,SAAS,KAAK,CAAA;AAChB,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAI,SAAS,KAAK,CAAA;AAEpE,EAAM,MAAA,oBAAA,GAAuB,OAAO,OAAmC,KAAA;AACrE,IAAM,MAAA,cAAA,GAAiB,QAAQ,OAAQ,CAAA,KAAA,CAAM,MAAQ,EAAA,EAAE,KAAO,EAAA,IAAA,EAAM,CAAA;AACpE,IAAA,MAAM,mBAAmB,UAAW,CAAA,IAAA;AAAA,MAClC,CAAA,GAAA,KAAO,IAAI,IAAS,KAAA;AAAA,KACtB;AAEA,IAAA,IAAI,gBAAkB,EAAA;AACpB,MAAA,QAAA,CAAS,IAAK,CAAA;AAAA,QACZ,KAAA,EAAO,EAAE,qCAAqC,CAAA;AAAA,QAC9C,MAAQ,EAAA,SAAA;AAAA,QACR,OAAS,EAAA;AAAA,OACV,CAAA;AAGD,MAAA,OAAA,CAAQ,CAAa,QAAA,MAAA;AAAA,QACnB,GAAG,QAAA;AAAA,QACH,QAAU,EAAA;AAAA,OACV,CAAA,CAAA;AAEF,MAAA,2BAAA,CAA4B,KAAK,CAAA;AAAA,KAC5B,MAAA;AACL,MAAI,IAAA;AACF,QAAM,MAAA,gBAAA,CAAiB,eAAe,OAAO,CAAA;AAE7C,QAAA,QAAA,CAAS,IAAK,CAAA;AAAA,UACZ,KAAA,EAAO,EAAE,kCAAkC,CAAA;AAAA,UAC3C,MAAQ,EAAA,SAAA;AAAA,UACR,OAAS,EAAA;AAAA,SACV,CAAA;AAED,QAAA,2BAAA,CAA4B,KAAK,CAAA;AACjC,QAAkB,iBAAA,EAAA;AAGlB,QAAA,OAAA,CAAQ,CAAa,QAAA,MAAA;AAAA,UACnB,GAAG,QAAA;AAAA,UACH,QAAU,EAAA;AAAA,YACR,OAAO,OAAQ,CAAA,KAAA;AAAA,YACf,IAAM,EAAA;AAAA;AACR,SACA,CAAA,CAAA;AAAA,eACK,GAAK,EAAA;AACZ,QAAA,QAAA,CAAS,KAAK,EAAE,KAAA,EAAQ,IAAc,OAAS,EAAA,MAAA,EAAQ,UAAU,CAAA;AAAA;AACnE;AACF,GACF;AAEA,EAAM,MAAA,eAAA,GAAkB,OAAO,OAA8B,KAAA;AAC3D,IAAM,MAAA,cAAA,GAAiB,QAAQ,OAAQ,CAAA,KAAA,CAAM,MAAQ,EAAA,EAAE,KAAO,EAAA,IAAA,EAAM,CAAA;AACpE,IAAA,MAAM,cAAc,IAAM,EAAA,IAAA,CAAK,CAAO,GAAA,KAAA,GAAA,CAAI,SAAS,cAAc,CAAA;AAEjE,IAAA,IAAI,WAAa,EAAA;AACf,MAAA,QAAA,CAAS,IAAK,CAAA;AAAA,QACZ,KAAA,EAAO,EAAE,+BAA+B,CAAA;AAAA,QACxC,MAAQ,EAAA,SAAA;AAAA,QACR,OAAS,EAAA;AAAA,OACV,CAAA;AAED,MAAA,OAAA,CAAQ,CAAa,QAAA,MAAA;AAAA,QACnB,GAAG,QAAA;AAAA,QACH,MAAM,CAAC,GAAI,SAAS,IAAQ,IAAA,IAAK,WAAW;AAAA,OAC5C,CAAA,CAAA;AAEF,MAAA,sBAAA,CAAuB,KAAK,CAAA;AAAA,KACvB,MAAA;AACL,MAAI,IAAA;AACF,QAAM,MAAA,gBAAA,CAAiB,UAAU,OAAO,CAAA;AAExC,QAAA,QAAA,CAAS,IAAK,CAAA;AAAA,UACZ,KAAA,EAAO,EAAE,6BAA6B,CAAA;AAAA,UACtC,MAAQ,EAAA,SAAA;AAAA,UACR,OAAS,EAAA;AAAA,SACV,CAAA;AAED,QAAA,sBAAA,CAAuB,KAAK,CAAA;AAC5B,QAAY,WAAA,EAAA;AAEZ,QAAA,MAAM,SAAS,EAAE,KAAA,EAAO,OAAQ,CAAA,KAAA,EAAO,MAAM,cAAe,EAAA;AAE5D,QAAA,OAAA,CAAQ,CAAa,QAAA,MAAA;AAAA,UACnB,GAAG,QAAA;AAAA,UACH,MAAM,CAAC,GAAI,SAAS,IAAQ,IAAA,IAAK,MAAM;AAAA,SACvC,CAAA,CAAA;AAAA,eACK,GAAK,EAAA;AACZ,QAAA,QAAA,CAAS,KAAK,EAAE,KAAA,EAAQ,IAAc,OAAS,EAAA,MAAA,EAAQ,UAAU,CAAA;AAAA;AACnE;AACF,GACF;AAEA,EAAM,MAAA,YAAA,GAAe,OAAO,KAAsC,KAAA;AAChE,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,KAAA,CAAM,cAAe,EAAA;AAErB,IAAM,MAAA,YAAA,GAAe,MAAM,WAAA,CAAY,oBAAqB,EAAA;AAE5D,IAAM,MAAA;AAAA,MACJ,EAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAM,EAAA,QAAA;AAAA,MACN,GAAG;AAAA,KACD,GAAA,IAAA;AAEJ,IAAA,MAAM,aAA2C,GAAA;AAAA,MAC/C,GAAG,gBAAA;AAAA,MACH,UAAU,QAAU,EAAA,IAAA;AAAA,MACpB,IAAM,EAAA,QAAA,EAAU,GAAI,CAAA,CAAA,GAAA,KAAO,IAAI,IAAI,CAAA;AAAA,MACnC,WAAW,YAAa,CAAA,aAAA;AAAA,MACxB,YAAc,EAAA;AAAA,KAChB;AAEA,IAAI,IAAA;AACF,MAAA,MAAM,SAAS,aAAa,CAAA;AAAA,aACrB,KAAO,EAAA;AACd,MAAM,MAAA,KAAA;AAAA,KACN,SAAA;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA;AAClB,GACF;AAEA,EAAA,4BACG,IACC,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,OAAA,EAAQ,aACX,EAAA,QAAA,EAAA,WAAA,CAAY,KACT,GAAA,CAAA,CAAE,mCAAmC,CAAA,GACrC,CAAE,CAAA,kCAAkC,GAC1C,CACF,EAAA,CAAA;AAAA,oBAEC,GAAA,CAAA,QAAA,EAAA,EACC,QAAC,kBAAA,GAAA,CAAA,GAAA,EAAA,EAAI,GAAE,GACL,EAAA,QAAA,kBAAA,GAAA,CAAC,MAAK,EAAA,EAAA,QAAA,EAAU,cACd,QAAC,kBAAA,IAAA,CAAA,IAAA,CAAK,IAAL,EAAA,EAAU,SAAQ,IACjB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAK,CAAA,IAAA,EAAL,EAAU,OAAA,EAAQ,IACjB,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,EAAE,wBAAwB,CAAA;AAAA,UACjC,OAAO,IAAK,CAAA,KAAA;AAAA,UACZ,UAAU,CAAS,KAAA,KAAA,OAAA,CAAQ,EAAE,GAAG,IAAA,EAAM,OAAO,CAAA;AAAA,UAC7C,UAAU,EAAA;AAAA;AAAA,OAEd,EAAA,CAAA;AAAA,sBAEC,GAAA,CAAA,IAAA,CAAK,IAAL,EAAA,EAAU,SAAQ,IACjB,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,EAAE,0BAA0B,CAAA;AAAA,UACnC,OAAO,IAAK,CAAA,OAAA;AAAA,UACZ,UAAU,CAAW,OAAA,KAAA,OAAA,CAAQ,EAAE,GAAG,IAAA,EAAM,SAAS,CAAA;AAAA,UACjD,UAAU,EAAA;AAAA;AAAA,OAEd,EAAA,CAAA;AAAA,sBAEC,GAAA,CAAA,IAAA,CAAK,IAAL,EAAA,EAAU,SAAQ,IACjB,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAO,IAAK,CAAA,IAAA;AAAA,UACZ,KAAA,EAAO,EAAE,SAAA,EAAW,OAAQ,EAAA;AAAA,UAC5B,QAAU,EAAA,CAAA,KAAA,KACR,OAAQ,CAAA,EAAE,GAAG,IAAA,EAAM,GAAG,EAAE,IAAM,EAAA,KAAA,IAAS,EAAG,EAAA,EAAG;AAAA;AAAA,OAGnD,EAAA,CAAA;AAAA,0BAEC,IAAK,CAAA,IAAA,EAAL,EAAU,OAAA,EAAS,EAAE,EAAI,EAAA,IAAA,EAAM,EAAI,EAAA,GAAA,IAClC,QAAC,kBAAA,IAAA,CAAA,IAAA,EAAA,EAAK,GAAI,EAAA,GAAA,EAAI,OAAM,KAClB,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,GAAI,EAAA,EAAA,KAAA,EAAO,EAAE,IAAA,EAAM,GAClB,EAAA,QAAA,kBAAA,GAAA;AAAA,UAAC,mBAAA;AAAA,UAAA;AAAA,YACC,eAAA,EAAiB,KAAK,QAAY,IAAA,KAAA,CAAA;AAAA,YAClC,UAAA;AAAA,YACA,SAAW,EAAA,iBAAA;AAAA,YACX,WAAA,EAAa,CAAC,QACZ,KAAA,OAAA,CAAQ,WAAS,EAAE,GAAG,IAAM,EAAA,QAAA,EAAW,CAAA;AAAA;AAAA,SAG7C,EAAA,CAAA;AAAA,wBAEA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAY,EAAA,6BAAA;AAAA,YACZ,OAAQ,EAAA,WAAA;AAAA,YACR,IAAK,EAAA,OAAA;AAAA,YACL,SAAA,sBAAY,SAAU,EAAA,EAAA,CAAA;AAAA,YACtB,OAAA,EAAS,MAAM,2BAAA,CAA4B,IAAI,CAAA;AAAA,YAC/C,YAAA,EAAY,EAAE,sCAAsC;AAAA;AAAA;AACtD,OAAA,EACF,CACF,EAAA,CAAA;AAAA,sBAEA,GAAA,CAAC,IAAK,CAAA,IAAA,EAAL,EAAU,OAAA,EAAS,EAAE,EAAI,EAAA,IAAA,EAAM,EAAI,EAAA,GAAA,EAClC,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,oBAAA;AAAA,QAAA;AAAA,UACC,YAAc,EAAA,sBAAA;AAAA,UACd,QAAU,EAAA;AAAA;AAAA,OAEd,EAAA,CAAA;AAAA,0BAEC,IAAK,CAAA,IAAA,EAAL,EAAU,OAAA,EAAS,EAAE,EAAI,EAAA,IAAA,EAAM,EAAI,EAAA,GAAA,IAClC,QAAC,kBAAA,IAAA,CAAA,IAAA,EAAA,EAAK,GAAI,EAAA,GAAA,EAAI,OAAM,KAClB,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,GAAI,EAAA,EAAA,KAAA,EAAO,EAAE,IAAA,EAAM,GAClB,EAAA,QAAA,kBAAA,GAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAa,KAAK,IAAQ,IAAA,KAAA,CAAA;AAAA,YAC1B,IAAA;AAAA,YACA,SAAW,EAAA,WAAA;AAAA,YACX,OAAA,EAAS,CAAC,YAAA,KACR,OAAQ,CAAA,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,IAAM,EAAA,YAAA,EAAe,CAAA;AAAA;AAAA,SAGvD,EAAA,CAAA;AAAA,wBAEA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAY,EAAA,wBAAA;AAAA,YACZ,OAAQ,EAAA,WAAA;AAAA,YACR,IAAK,EAAA,OAAA;AAAA,YACL,SAAA,sBAAY,SAAU,EAAA,EAAA,CAAA;AAAA,YACtB,OAAA,EAAS,MAAM,sBAAA,CAAuB,IAAI,CAAA;AAAA,YAC1C,YAAA,EAAY,EAAE,gCAAgC;AAAA;AAAA;AAChD,OAAA,EACF,CACF,EAAA,CAAA;AAAA,sBAEA,GAAA,CAAC,IAAK,CAAA,IAAA,EAAL,EAAU,OAAA,EAAS,EAAE,EAAI,EAAA,IAAA,EAAM,EAAI,EAAA,GAAA,EAClC,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,OAAQ,EAAA,UAAA;AAAA,UACR,KAAA,EAAO,EAAE,0BAA0B,CAAA;AAAA,UACnC,EAAG,EAAA,eAAA;AAAA,UACH,IAAK,EAAA,MAAA;AAAA,UACL,OAAO,IAAK,CAAA,QAAA;AAAA,UACZ,eAAA,EAAiB,EAAE,MAAA,EAAQ,IAAK,EAAA;AAAA,UAChC,QAAQ,EAAA,IAAA;AAAA,UACR,SAAS,EAAA,IAAA;AAAA,UACT,QAAA,EAAU,OACR,OAAQ,CAAA;AAAA,YACN,GAAG,IAAA;AAAA,YACH,QAAA,EAAU,EAAE,MAAO,CAAA;AAAA,WACpB;AAAA;AAAA,OAGP,EAAA,CAAA;AAAA,sBAEA,GAAA,CAAC,IAAK,CAAA,IAAA,EAAL,EAAU,OAAA,EAAS,EAAE,EAAI,EAAA,IAAA,EAAM,EAAI,EAAA,GAAA,EAClC,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,OAAQ,EAAA,UAAA;AAAA,UACR,KAAA,EAAO,EAAE,4BAA4B,CAAA;AAAA,UACrC,EAAG,EAAA,YAAA;AAAA,UACH,IAAK,EAAA,MAAA;AAAA,UACL,OAAO,IAAK,CAAA,UAAA;AAAA,UACZ,eAAA,EAAiB,EAAE,MAAA,EAAQ,IAAK,EAAA;AAAA,UAChC,SAAS,EAAA,IAAA;AAAA,UACT,QAAA,EAAU,OACR,OAAQ,CAAA;AAAA,YACN,GAAG,IAAA;AAAA,YACH,UAAA,EAAY,EAAE,MAAO,CAAA;AAAA,WACtB,CAAA;AAAA,UAEH,UAAY,EAAA;AAAA,YACV,GAAK,EAAA,QAAA,CAAS,OAAQ,CAAA,IAAA,CAAK,QAAQ,CAChC,CAAA,KAAA,CAAM,KAAK,CAAA,CACX,KAAK,EAAE,IAAA,EAAM,CAAE,EAAC,EAChB,SAAU;AAAA;AACf;AAAA,OAEJ,EAAA,CAAA;AAAA,sBAEA,GAAA,CAAC,KAAK,IAAL,EAAA,EAAU,SAAQ,IACjB,EAAA,QAAA,kBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,OAAA,EAAQ,KACZ,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAK,EAAA,QAAA;AAAA,YACL,KAAA,EAAO,EAAE,yBAAyB,CAAA;AAAA,YAClC,YAAY,IAAK,CAAA,MAAA;AAAA,YACjB,QAAA,EAAU,gBACR,OAAQ,CAAA,EAAE,GAAG,IAAM,EAAA,MAAA,EAAQ,YAAY;AAAA;AAAA,SAE3C;AAAA,wBACA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAK,EAAA,kBAAA;AAAA,YACL,KAAA,EAAO,EAAE,mCAAmC,CAAA;AAAA,YAC5C,YAAY,IAAK,CAAA,gBAAA;AAAA,YACjB,QAAA,EAAU,gBACR,OAAQ,CAAA,EAAE,GAAG,IAAM,EAAA,gBAAA,EAAkB,YAAY;AAAA;AAAA,SAErD;AAAA,wBACA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAK,EAAA,QAAA;AAAA,YACL,UAAA,EAAY,OAAW,IAAA,CAAC,IAAK,CAAA,IAAA;AAAA,YAC7B,SAAA,sBAAY,WAAY,EAAA,EAAA,CAAA;AAAA,YAEvB,YAAE,yBAAyB;AAAA;AAAA;AAC9B,OAAA,EACF,CACF,EAAA;AAAA,KACF,EAAA,CAAA,EACF,GACF,CACF,EAAA,CAAA;AAAA,oBAEA,GAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QACC,IAAM,EAAA,wBAAA;AAAA,QACN,SAAW,EAAA,oBAAA;AAAA,QACX,QAAA,EAAU,MAAM,2BAAA,CAA4B,KAAK;AAAA;AAAA,KACnD;AAAA,oBAEA,GAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,IAAM,EAAA,mBAAA;AAAA,QACN,SAAW,EAAA,eAAA;AAAA,QACX,QAAA,EAAU,MAAM,sBAAA,CAAuB,KAAK;AAAA;AAAA;AAC9C,GACF,EAAA,CAAA;AAEJ;;;;"}
@@ -1,9 +1,9 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { useState, useMemo } from 'react';
3
- import { useApi, alertApiRef } from '@backstage/core-plugin-api';
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 alertApi = useApi(alertApiRef);
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
- alertApi.post({
57
- message: t("admin.announcementsContent.alertMessage"),
58
- severity: "success"
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
- alertApi.post({ message: err.message, severity: "error" });
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
- alertApi.post({
73
- message: t("editAnnouncementPage.updatedMessage"),
74
- severity: "success"
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
- alertApi.post({ message: err.message, severity: "error" });
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
- alertApi.post({
102
- message: t("admin.announcementsContent.deletedMessage"),
103
- severity: "success"
103
+ toastApi.post({
104
+ title: t("admin.announcementsContent.deletedMessage"),
105
+ status: "success",
106
+ timeout: 5e3
104
107
  });
105
108
  } catch (err) {
106
- alertApi.post({
107
- message: err.body?.error?.message || err.message,
108
- severity: "error"
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, alertApiRef } from '@backstage/core-plugin-api';
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 alertApi = useApi(alertApiRef);
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
- alertApi.post({
31
- message: `${title} ${t("admin.categoriesContent.createdMessage")}`,
32
- severity: "success"
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
- alertApi.post({ message: err.message, severity: "error" });
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
- alertApi.post({
54
- message: t("admin.categoriesContent.table.categoryDeleted"),
55
- severity: "success"
55
+ toastApi.post({
56
+ title: t("admin.categoriesContent.table.categoryDeleted"),
57
+ status: "success",
58
+ timeout: 5e3
56
59
  });
57
60
  } catch (err) {
58
- alertApi.post({
59
- message: err.body.error.message,
60
- severity: "error"
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, alertApiRef } from '@backstage/core-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 alertApi = useApi(alertApiRef);\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 alertApi.post({\n message: `${title} ${t('admin.categoriesContent.createdMessage')}`,\n severity: 'success',\n });\n\n setShowNewCategoryForm(false);\n refresh();\n } catch (err) {\n alertApi.post({ message: (err as Error).message, severity: 'error' });\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 alertApi.post({\n message: t('admin.categoriesContent.table.categoryDeleted'),\n severity: 'success',\n });\n } catch (err) {\n alertApi.post({\n message: (err as ResponseError).body.error.message,\n severity: 'error',\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
+ {"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, alertApiRef } from '@backstage/core-plugin-api';
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 alertApi = useApi(alertApiRef);
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
- alertApi.post({
31
- message: `${title} ${t("admin.tagsContent.createdMessage")}`,
32
- severity: "success"
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
- alertApi.post({
39
- message: t("admin.tagsContent.errors.alreadyExists"),
40
- severity: "error"
39
+ toastApi.post({
40
+ title: t("admin.tagsContent.errors.alreadyExists"),
41
+ status: "danger"
41
42
  });
42
43
  } else {
43
- alertApi.post({ message: err.message, severity: "error" });
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
- alertApi.post({
61
- message: t("admin.tagsContent.table.tagDeleted"),
62
- severity: "success"
61
+ toastApi.post({
62
+ title: t("admin.tagsContent.table.tagDeleted"),
63
+ status: "success",
64
+ timeout: 5e3
63
65
  });
64
66
  } catch (err) {
65
- alertApi.post({
66
- message: err.body.error.message,
67
- severity: "error"
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 { useApi, alertApiRef } from '@backstage/core-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 alertApi = useApi(alertApiRef);\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 alertApi.post({\n message: `${title} ${t('admin.tagsContent.createdMessage')}`,\n severity: 'success',\n });\n\n setShowNewTagForm(false);\n refresh();\n } catch (err: any) {\n if (err.response?.status === 409) {\n alertApi.post({\n message: t('admin.tagsContent.errors.alreadyExists'),\n severity: 'error',\n });\n } else {\n alertApi.post({ message: (err as Error).message, severity: 'error' });\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 alertApi.post({\n message: t('admin.tagsContent.table.tagDeleted'),\n severity: 'success',\n });\n } catch (err) {\n alertApi.post({\n message: (err as ResponseError).body.error.message,\n severity: 'error',\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":"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"}
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":"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"}
package/dist/alpha.d.ts CHANGED
@@ -128,7 +128,6 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
128
128
  kind: "page";
129
129
  name: undefined;
130
130
  params: {
131
- defaultPath?: [Error: "Use the 'path' param instead"] | undefined;
132
131
  path: string;
133
132
  title?: string | undefined;
134
133
  icon?: _backstage_frontend_plugin_api.IconElement | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage-community/plugin-announcements",
3
- "version": "2.5.1",
3
+ "version": "2.6.0",
4
4
  "main": "./dist/index.esm.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "license": "Apache-2.0",
@@ -62,20 +62,20 @@
62
62
  },
63
63
  "dependencies": {
64
64
  "@backstage-community/plugin-announcements-common": "^0.18.0",
65
- "@backstage-community/plugin-announcements-react": "^0.22.0",
66
- "@backstage/catalog-model": "^1.7.6",
67
- "@backstage/core-compat-api": "^0.5.8",
68
- "@backstage/core-components": "^0.18.7",
69
- "@backstage/core-plugin-api": "^1.12.3",
65
+ "@backstage-community/plugin-announcements-react": "^0.23.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.14.1",
72
- "@backstage/plugin-catalog-react": "^2.0.0",
73
- "@backstage/plugin-permission-react": "^0.4.40",
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.10.4",
76
- "@backstage/plugin-signals-react": "^0.0.19",
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.12.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.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.35.4",
97
- "@backstage/dev-utils": "^1.1.20",
98
- "@backstage/frontend-test-utils": "^0.5.0",
99
- "@backstage/plugin-signals": "^0.0.28",
100
- "@backstage/test-utils": "^1.7.15",
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",