@backstage-community/plugin-announcements 1.0.0 → 1.1.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 +30 -0
- package/dist/components/Admin/AnnouncementsContent/AnnouncementsContent.esm.js +13 -21
- package/dist/components/Admin/AnnouncementsContent/AnnouncementsContent.esm.js.map +1 -1
- package/dist/components/Admin/CategoriesContent/CategoriesContent.esm.js +12 -17
- package/dist/components/Admin/CategoriesContent/CategoriesContent.esm.js.map +1 -1
- package/dist/components/Admin/CategoriesContent/CategoriesForm.esm.js +3 -7
- package/dist/components/Admin/CategoriesContent/CategoriesForm.esm.js.map +1 -1
- package/dist/components/Admin/DeleteDialog/DeleteDialog.esm.js +30 -0
- package/dist/components/Admin/DeleteDialog/DeleteDialog.esm.js.map +1 -0
- package/dist/components/Admin/{TagsContent/useDeleteTagDialogState.esm.js → DeleteDialog/useDeleteDialogState.esm.js} +7 -7
- package/dist/components/Admin/DeleteDialog/useDeleteDialogState.esm.js.map +1 -0
- package/dist/components/Admin/TagsContent/TagsContent.esm.js +12 -17
- package/dist/components/Admin/TagsContent/TagsContent.esm.js.map +1 -1
- package/dist/components/Admin/TagsContent/TagsForm.esm.js +3 -7
- package/dist/components/Admin/TagsContent/TagsForm.esm.js.map +1 -1
- package/dist/components/AnnouncementsCard/AnnouncementsCard.esm.js +3 -8
- package/dist/components/AnnouncementsCard/AnnouncementsCard.esm.js.map +1 -1
- package/dist/components/AnnouncementsPage/AnnouncementsPage.esm.js +3 -5
- package/dist/components/AnnouncementsPage/AnnouncementsPage.esm.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/plugin.esm.js.map +1 -1
- package/package.json +2 -2
- package/dist/components/Admin/AnnouncementsContent/DeleteAnnouncementDialog.esm.js +0 -31
- package/dist/components/Admin/AnnouncementsContent/DeleteAnnouncementDialog.esm.js.map +0 -1
- package/dist/components/Admin/AnnouncementsContent/useDeleteAnnouncementDialogState.esm.js +0 -29
- package/dist/components/Admin/AnnouncementsContent/useDeleteAnnouncementDialogState.esm.js.map +0 -1
- package/dist/components/Admin/CategoriesContent/DeleteCategoryDialog.esm.js +0 -16
- package/dist/components/Admin/CategoriesContent/DeleteCategoryDialog.esm.js.map +0 -1
- package/dist/components/Admin/CategoriesContent/useDeleteCategoryDialogState.esm.js +0 -29
- package/dist/components/Admin/CategoriesContent/useDeleteCategoryDialogState.esm.js.map +0 -1
- package/dist/components/Admin/TagsContent/DeleteTagDialog.esm.js +0 -16
- package/dist/components/Admin/TagsContent/DeleteTagDialog.esm.js.map +0 -1
- package/dist/components/Admin/TagsContent/useDeleteTagDialogState.esm.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# @backstage-community/plugin-announcements
|
|
2
2
|
|
|
3
|
+
## 1.1.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 40b8d32: Internal refactor to consolidate delete dialog state management in the admin portal. Refactoring categories and tags to the shared component added support for translations which was previously missing.
|
|
8
|
+
|
|
9
|
+
The refactor includes a new set of translation keys for the generic delete dialog.
|
|
10
|
+
|
|
11
|
+
### Translation Changes
|
|
12
|
+
|
|
13
|
+
Added new translation keys for the delete dialog:
|
|
14
|
+
|
|
15
|
+
- `confirmDeleteDialog.title`
|
|
16
|
+
- `confirmDeleteDialog.cancel`
|
|
17
|
+
- `confirmDeleteDialog.delete`
|
|
18
|
+
|
|
19
|
+
Deprecated the following translation keys:
|
|
20
|
+
|
|
21
|
+
- `deleteDialog.title`
|
|
22
|
+
- `deleteDialog.cancel`
|
|
23
|
+
- `deleteDialog.delete`
|
|
24
|
+
|
|
25
|
+
### Patch Changes
|
|
26
|
+
|
|
27
|
+
- e6b9dd8: Replaces global `JSX` namespace with `React.JSX` to resolve deprecation
|
|
28
|
+
- 6b45ee7: Adds a new useAnnouncementsPermissions hook users can leverage when needing quick access to all permissions, something we commonly do throughout the admin portal. All components now leverage this hook instead of using the usePermission hook directly.
|
|
29
|
+
- Updated dependencies [6b45ee7]
|
|
30
|
+
- Updated dependencies [40b8d32]
|
|
31
|
+
- @backstage-community/plugin-announcements-react@0.16.0
|
|
32
|
+
|
|
3
33
|
## 1.0.0
|
|
4
34
|
|
|
5
35
|
### Major Changes
|
|
@@ -2,15 +2,15 @@ import { jsx, jsxs } from 'react/jsx-runtime';
|
|
|
2
2
|
import { useState, useMemo } from 'react';
|
|
3
3
|
import { Progress, ErrorPanel, StatusOK, StatusPending, Table } from '@backstage/core-components';
|
|
4
4
|
import { useApi, alertApiRef } from '@backstage/core-plugin-api';
|
|
5
|
-
import { announcementsApiRef, useCategories, useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';
|
|
6
|
-
import { announcementCreatePermission
|
|
5
|
+
import { announcementsApiRef, useCategories, useAnnouncementsTranslation, useAnnouncementsPermissions } from '@backstage-community/plugin-announcements-react';
|
|
6
|
+
import { announcementCreatePermission } from '@backstage-community/plugin-announcements-common';
|
|
7
7
|
import useAsyncRetry from 'react-use/esm/useAsyncRetry';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { useDeleteDialogState } from '../DeleteDialog/useDeleteDialogState.esm.js';
|
|
9
|
+
import { DeleteDialog } from '../DeleteDialog/DeleteDialog.esm.js';
|
|
10
10
|
import { useNavigate } from 'react-router-dom';
|
|
11
11
|
import { AnnouncementForm } from './AnnouncementForm/AnnouncementForm.esm.js';
|
|
12
12
|
import slugify from 'slugify';
|
|
13
|
-
import {
|
|
13
|
+
import { RequirePermission } from '@backstage/plugin-permission-react';
|
|
14
14
|
import { Typography, Box, IconButton, Grid, Button } from '@material-ui/core';
|
|
15
15
|
import DeleteIcon from '@material-ui/icons/Delete';
|
|
16
16
|
import EditIcon from '@material-ui/icons/Edit';
|
|
@@ -25,15 +25,7 @@ const AnnouncementsContent = ({
|
|
|
25
25
|
const navigate = useNavigate();
|
|
26
26
|
const { categories } = useCategories();
|
|
27
27
|
const { t } = useAnnouncementsTranslation();
|
|
28
|
-
const
|
|
29
|
-
permission: announcementCreatePermission
|
|
30
|
-
});
|
|
31
|
-
const { loading: loadingUpdatePermission, allowed: canUpdateAnnouncement } = usePermission({
|
|
32
|
-
permission: announcementUpdatePermission
|
|
33
|
-
});
|
|
34
|
-
const { loading: loadingDeletePermission, allowed: canDeleteAnnouncement } = usePermission({
|
|
35
|
-
permission: announcementDeletePermission
|
|
36
|
-
});
|
|
28
|
+
const permissions = useAnnouncementsPermissions();
|
|
37
29
|
const [showCreateAnnouncementForm, setShowCreateAnnouncementForm] = useState(false);
|
|
38
30
|
const [editingAnnouncementId, setEditingAnnouncementId] = useState(null);
|
|
39
31
|
const {
|
|
@@ -46,8 +38,8 @@ const AnnouncementsContent = ({
|
|
|
46
38
|
isOpen: isDeleteDialogOpen,
|
|
47
39
|
open: openDeleteDialog,
|
|
48
40
|
close: closeDeleteDialog,
|
|
49
|
-
|
|
50
|
-
} =
|
|
41
|
+
item: announcementToDelete
|
|
42
|
+
} = useDeleteDialogState();
|
|
51
43
|
const onCreateButtonClick = () => {
|
|
52
44
|
setShowCreateAnnouncementForm(!showCreateAnnouncementForm);
|
|
53
45
|
setEditingAnnouncementId(null);
|
|
@@ -228,7 +220,7 @@ const AnnouncementsContent = ({
|
|
|
228
220
|
IconButton,
|
|
229
221
|
{
|
|
230
222
|
"aria-label": "edit",
|
|
231
|
-
disabled:
|
|
223
|
+
disabled: permissions.update.loading || !permissions.update.allowed || editingAnnouncementId === rowData.id,
|
|
232
224
|
onClick: () => onEdit(rowData),
|
|
233
225
|
size: "small",
|
|
234
226
|
children: /* @__PURE__ */ jsx(EditIcon, { fontSize: "small", "data-testid": "edit-icon" })
|
|
@@ -238,7 +230,7 @@ const AnnouncementsContent = ({
|
|
|
238
230
|
IconButton,
|
|
239
231
|
{
|
|
240
232
|
"aria-label": "delete",
|
|
241
|
-
disabled:
|
|
233
|
+
disabled: permissions.delete.loading || !permissions.delete.allowed,
|
|
242
234
|
onClick: () => openDeleteDialog(rowData),
|
|
243
235
|
size: "small",
|
|
244
236
|
children: /* @__PURE__ */ jsx(DeleteIcon, { fontSize: "small", "data-testid": "delete-icon" })
|
|
@@ -252,7 +244,7 @@ const AnnouncementsContent = ({
|
|
|
252
244
|
!editingAnnouncementId && /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
|
|
253
245
|
Button,
|
|
254
246
|
{
|
|
255
|
-
disabled:
|
|
247
|
+
disabled: permissions.create.loading || !permissions.create.allowed,
|
|
256
248
|
variant: "contained",
|
|
257
249
|
onClick: () => onCreateButtonClick(),
|
|
258
250
|
children: showCreateAnnouncementForm ? t("admin.announcementsContent.cancelButton") : t("admin.announcementsContent.createButton")
|
|
@@ -298,9 +290,9 @@ const AnnouncementsContent = ({
|
|
|
298
290
|
}
|
|
299
291
|
),
|
|
300
292
|
/* @__PURE__ */ jsx(
|
|
301
|
-
|
|
293
|
+
DeleteDialog,
|
|
302
294
|
{
|
|
303
|
-
|
|
295
|
+
isOpen: isDeleteDialogOpen,
|
|
304
296
|
onCancel: onCancelDelete,
|
|
305
297
|
onConfirm: onConfirmDelete
|
|
306
298
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnnouncementsContent.esm.js","sources":["../../../../src/components/Admin/AnnouncementsContent/AnnouncementsContent.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useState, useMemo } from 'react';\nimport {\n ErrorPanel,\n Progress,\n Table,\n TableColumn,\n StatusOK,\n StatusPending,\n} from '@backstage/core-components';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport {\n announcementsApiRef,\n CreateAnnouncementRequest,\n useAnnouncementsTranslation,\n useCategories,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n Announcement,\n announcementCreatePermission,\n announcementDeletePermission,\n announcementUpdatePermission,\n Category,\n} from '@backstage-community/plugin-announcements-common';\nimport useAsyncRetry from 'react-use/esm/useAsyncRetry';\nimport { useDeleteAnnouncementDialogState } from './useDeleteAnnouncementDialogState';\nimport { DeleteAnnouncementDialog } from './DeleteAnnouncementDialog';\nimport { useNavigate } from 'react-router-dom';\nimport { AnnouncementForm } from './AnnouncementForm';\nimport slugify from 'slugify';\nimport {\n RequirePermission,\n usePermission,\n} from '@backstage/plugin-permission-react';\nimport { Box, Button, Grid, IconButton, Typography } from '@material-ui/core';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport EditIcon from '@material-ui/icons/Edit';\nimport PreviewIcon from '@material-ui/icons/Visibility';\nimport { DateTime } from 'luxon';\n\ntype AnnouncementsContentProps = {\n defaultInactive?: boolean;\n};\n\nexport const AnnouncementsContent = ({\n defaultInactive,\n}: AnnouncementsContentProps) => {\n const alertApi = useApi(alertApiRef);\n const announcementsApi = useApi(announcementsApiRef);\n const navigate = useNavigate();\n const { categories } = useCategories();\n const { t } = useAnnouncementsTranslation();\n\n const { loading: loadingCreatePermission, allowed: canCreateAnnouncement } =\n usePermission({\n permission: announcementCreatePermission,\n });\n\n const { loading: loadingUpdatePermission, allowed: canUpdateAnnouncement } =\n usePermission({\n permission: announcementUpdatePermission,\n });\n\n const { loading: loadingDeletePermission, allowed: canDeleteAnnouncement } =\n usePermission({\n permission: announcementDeletePermission,\n });\n\n const [showCreateAnnouncementForm, setShowCreateAnnouncementForm] =\n useState(false);\n const [editingAnnouncementId, setEditingAnnouncementId] = useState<\n string | null\n >(null);\n\n const {\n loading,\n error,\n value: announcements,\n retry,\n } = useAsyncRetry(async () => await announcementsApi.announcements({}));\n\n const {\n isOpen: isDeleteDialogOpen,\n open: openDeleteDialog,\n close: closeDeleteDialog,\n announcement: announcementToDelete,\n } = useDeleteAnnouncementDialogState();\n\n const onCreateButtonClick = () => {\n setShowCreateAnnouncementForm(!showCreateAnnouncementForm);\n setEditingAnnouncementId(null);\n };\n\n const onTitleClick = (announcement: Announcement) => {\n navigate(`/announcements/view/${announcement.id}`);\n };\n\n const onEdit = (announcement: Announcement) => {\n setEditingAnnouncementId(announcement.id);\n setShowCreateAnnouncementForm(false);\n };\n\n const onCancelEdit = () => {\n setEditingAnnouncementId(null);\n };\n\n const onCancelDelete = () => {\n closeDeleteDialog();\n };\n const onConfirmDelete = async () => {\n closeDeleteDialog();\n\n try {\n await announcementsApi.deleteAnnouncementByID(announcementToDelete!.id);\n\n alertApi.post({ message: 'Announcement deleted.', severity: 'success' });\n } catch (err) {\n alertApi.post({ message: (err as Error).message, severity: 'error' });\n }\n\n retry();\n };\n\n const onSubmit = async (request: CreateAnnouncementRequest) => {\n const { category } = request;\n\n const slugs = categories.map((c: Category) => c.slug);\n let alertMsg = t('admin.announcementsContent.alertMessage') as string;\n\n try {\n if (category) {\n const categorySlug = slugify(category, {\n lower: true,\n });\n if (slugs.indexOf(categorySlug) === -1) {\n alertMsg = alertMsg.replace('.', '');\n alertMsg = `${alertMsg} ${t(\n 'admin.announcementsContent.alertMessageWithNewCategory',\n )} ${category}.`;\n\n await announcementsApi.createCategory({\n title: category,\n });\n }\n }\n\n await announcementsApi.createAnnouncement({\n ...request,\n category: request.category?.toLocaleLowerCase('en-US'),\n });\n alertApi.post({ message: alertMsg, severity: 'success' });\n\n setShowCreateAnnouncementForm(false);\n retry();\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 const { category } = request;\n\n const slugs = categories.map((c: Category) => c.slug);\n let updateMsg = t('editAnnouncementPage.updatedMessage') as string;\n\n try {\n if (category) {\n const categorySlug = slugify(category, {\n lower: true,\n });\n\n if (slugs.indexOf(categorySlug) === -1) {\n updateMsg = updateMsg.replace('.', '');\n updateMsg = `${updateMsg} ${t(\n 'editAnnouncementPage.updatedMessageWithNewCategory',\n )} ${category}.`;\n\n await announcementsApi.createCategory({\n title: category,\n });\n }\n }\n\n await announcementsApi.updateAnnouncement(editingAnnouncementId, request);\n alertApi.post({ message: updateMsg, severity: 'success' });\n\n setEditingAnnouncementId(null);\n retry();\n } catch (err) {\n alertApi.post({ message: (err as Error).message, severity: 'error' });\n }\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 if (loading) {\n return <Progress />;\n }\n if (error) {\n return <ErrorPanel error={error} />;\n }\n\n const columns: TableColumn<Announcement>[] = [\n {\n title: (\n <Typography>{t('admin.announcementsContent.table.title')}</Typography>\n ),\n sorting: true,\n field: 'title',\n render: rowData => rowData.title,\n },\n {\n title: (\n <Typography>{t('admin.announcementsContent.table.body')}</Typography>\n ),\n sorting: true,\n field: 'body',\n render: rowData => rowData.body,\n },\n {\n title: (\n <Typography>\n {t('admin.announcementsContent.table.publisher')}\n </Typography>\n ),\n sorting: true,\n field: 'publisher',\n render: rowData => rowData.publisher,\n },\n {\n title: (\n <Typography>\n {t('admin.announcementsContent.table.onBehalfOf')}\n </Typography>\n ),\n sorting: true,\n field: 'on_behalf_of',\n render: rowData => rowData.on_behalf_of,\n },\n\n {\n title: (\n <Typography>\n {t('admin.announcementsContent.table.category')}\n </Typography>\n ),\n sorting: true,\n field: 'category',\n render: rowData => rowData.category?.title ?? '',\n },\n {\n title: (\n <Typography>{t('admin.announcementsContent.table.tags')}</Typography>\n ),\n sorting: true,\n field: 'tags',\n render: rowData => rowData.tags?.map(tag => tag.title).join(', ') || '',\n },\n {\n title: (\n <Typography>{t('admin.announcementsContent.table.status')}</Typography>\n ),\n sorting: true,\n field: 'active',\n render: rowData =>\n rowData.active ? (\n <StatusOK>{t('admin.announcementsContent.table.active')}</StatusOK>\n ) : (\n <StatusPending>\n {t('admin.announcementsContent.table.inactive')}\n </StatusPending>\n ),\n },\n {\n title: (\n <Typography>\n {t('admin.announcementsContent.table.created_at')}\n </Typography>\n ),\n sorting: true,\n field: 'created_at',\n type: 'date',\n render: rowData =>\n DateTime.fromISO(rowData.created_at).toFormat('M/d/yyyy'),\n },\n {\n title: (\n <Typography>\n {t('admin.announcementsContent.table.start_at')}\n </Typography>\n ),\n sorting: true,\n field: 'start_at',\n type: 'date',\n render: rowData =>\n DateTime.fromISO(rowData.start_at).toFormat('M/d/yyyy'),\n },\n {\n title: (\n <Typography>\n {t('admin.announcementsContent.table.until_date')}\n </Typography>\n ),\n sorting: true,\n field: 'until_date',\n type: 'date',\n render: rowData =>\n rowData?.until_date\n ? DateTime.fromISO(rowData.until_date).toFormat('M/d/yyyy')\n : '-',\n },\n {\n title: (\n <Typography>{t('admin.announcementsContent.table.actions')}</Typography>\n ),\n render: rowData => {\n return (\n <Box display=\"flex\" flexDirection=\"row\">\n <IconButton\n aria-label=\"preview\"\n onClick={() => onTitleClick(rowData)}\n size=\"small\"\n >\n <PreviewIcon fontSize=\"small\" data-testid=\"preview\" />\n </IconButton>\n\n <IconButton\n aria-label=\"edit\"\n disabled={\n loadingUpdatePermission ||\n !canUpdateAnnouncement ||\n editingAnnouncementId === rowData.id\n }\n onClick={() => onEdit(rowData)}\n size=\"small\"\n >\n <EditIcon fontSize=\"small\" data-testid=\"edit-icon\" />\n </IconButton>\n\n <IconButton\n aria-label=\"delete\"\n disabled={loadingDeletePermission || !canDeleteAnnouncement}\n onClick={() => openDeleteDialog(rowData)}\n size=\"small\"\n >\n <DeleteIcon fontSize=\"small\" data-testid=\"delete-icon\" />\n </IconButton>\n </Box>\n );\n },\n },\n ];\n\n return (\n <RequirePermission permission={announcementCreatePermission}>\n <Grid container>\n {!editingAnnouncementId && (\n <Grid item xs={12}>\n <Button\n disabled={loadingCreatePermission || !canCreateAnnouncement}\n variant=\"contained\"\n onClick={() => onCreateButtonClick()}\n >\n {showCreateAnnouncementForm\n ? t('admin.announcementsContent.cancelButton')\n : t('admin.announcementsContent.createButton')}\n </Button>\n </Grid>\n )}\n\n {showCreateAnnouncementForm && (\n <Grid item xs={12}>\n <AnnouncementForm\n initialData={{ active: !defaultInactive } as Announcement}\n onSubmit={onSubmit}\n />\n </Grid>\n )}\n\n {editingAnnouncementId && announcementToEdit && (\n <Grid item xs={12}>\n <Box>\n <Box\n display=\"flex\"\n justifyContent=\"space-between\"\n style={{ marginBottom: 16 }}\n >\n <Typography variant=\"h6\">\n {t('announcementForm.editAnnouncement')}\n </Typography>\n <Button variant=\"outlined\" onClick={onCancelEdit} size=\"small\">\n {t('admin.announcementsContent.cancelButton')}\n </Button>\n </Box>\n <AnnouncementForm\n initialData={announcementToEdit}\n onSubmit={onUpdate}\n />\n </Box>\n </Grid>\n )}\n\n <Grid item xs={12}>\n <Table\n title={t('admin.announcementsContent.announcements')}\n options={{ pageSize: 20, search: true }}\n columns={columns}\n data={announcements?.results ?? []}\n emptyContent={\n <Typography style={{ padding: 2, textAlign: 'center' }}>\n {t('admin.announcementsContent.noAnnouncementsFound')}\n </Typography>\n }\n />\n\n <DeleteAnnouncementDialog\n open={isDeleteDialogOpen}\n onCancel={onCancelDelete}\n onConfirm={onConfirmDelete}\n />\n </Grid>\n </Grid>\n </RequirePermission>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AA0DO,MAAM,uBAAuB,CAAC;AAAA,EACnC;AACF,CAAiC,KAAA;AAC/B,EAAM,MAAA,QAAA,GAAW,OAAO,WAAW,CAAA;AACnC,EAAM,MAAA,gBAAA,GAAmB,OAAO,mBAAmB,CAAA;AACnD,EAAA,MAAM,WAAW,WAAY,EAAA;AAC7B,EAAM,MAAA,EAAE,UAAW,EAAA,GAAI,aAAc,EAAA;AACrC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAE1C,EAAA,MAAM,EAAE,OAAS,EAAA,uBAAA,EAAyB,OAAS,EAAA,qBAAA,KACjD,aAAc,CAAA;AAAA,IACZ,UAAY,EAAA;AAAA,GACb,CAAA;AAEH,EAAA,MAAM,EAAE,OAAS,EAAA,uBAAA,EAAyB,OAAS,EAAA,qBAAA,KACjD,aAAc,CAAA;AAAA,IACZ,UAAY,EAAA;AAAA,GACb,CAAA;AAEH,EAAA,MAAM,EAAE,OAAS,EAAA,uBAAA,EAAyB,OAAS,EAAA,qBAAA,KACjD,aAAc,CAAA;AAAA,IACZ,UAAY,EAAA;AAAA,GACb,CAAA;AAEH,EAAA,MAAM,CAAC,0BAAA,EAA4B,6BAA6B,CAAA,GAC9D,SAAS,KAAK,CAAA;AAChB,EAAA,MAAM,CAAC,qBAAA,EAAuB,wBAAwB,CAAA,GAAI,SAExD,IAAI,CAAA;AAEN,EAAM,MAAA;AAAA,IACJ,OAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAO,EAAA,aAAA;AAAA,IACP;AAAA,GACF,GAAI,cAAc,YAAY,MAAM,iBAAiB,aAAc,CAAA,EAAE,CAAC,CAAA;AAEtE,EAAM,MAAA;AAAA,IACJ,MAAQ,EAAA,kBAAA;AAAA,IACR,IAAM,EAAA,gBAAA;AAAA,IACN,KAAO,EAAA,iBAAA;AAAA,IACP,YAAc,EAAA;AAAA,MACZ,gCAAiC,EAAA;AAErC,EAAA,MAAM,sBAAsB,MAAM;AAChC,IAAA,6BAAA,CAA8B,CAAC,0BAA0B,CAAA;AACzD,IAAA,wBAAA,CAAyB,IAAI,CAAA;AAAA,GAC/B;AAEA,EAAM,MAAA,YAAA,GAAe,CAAC,YAA+B,KAAA;AACnD,IAAS,QAAA,CAAA,CAAA,oBAAA,EAAuB,YAAa,CAAA,EAAE,CAAE,CAAA,CAAA;AAAA,GACnD;AAEA,EAAM,MAAA,MAAA,GAAS,CAAC,YAA+B,KAAA;AAC7C,IAAA,wBAAA,CAAyB,aAAa,EAAE,CAAA;AACxC,IAAA,6BAAA,CAA8B,KAAK,CAAA;AAAA,GACrC;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,wBAAA,CAAyB,IAAI,CAAA;AAAA,GAC/B;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAkB,iBAAA,EAAA;AAAA,GACpB;AACA,EAAA,MAAM,kBAAkB,YAAY;AAClC,IAAkB,iBAAA,EAAA;AAElB,IAAI,IAAA;AACF,MAAM,MAAA,gBAAA,CAAiB,sBAAuB,CAAA,oBAAA,CAAsB,EAAE,CAAA;AAEtE,MAAA,QAAA,CAAS,KAAK,EAAE,OAAA,EAAS,uBAAyB,EAAA,QAAA,EAAU,WAAW,CAAA;AAAA,aAChE,GAAK,EAAA;AACZ,MAAA,QAAA,CAAS,KAAK,EAAE,OAAA,EAAU,IAAc,OAAS,EAAA,QAAA,EAAU,SAAS,CAAA;AAAA;AAGtE,IAAM,KAAA,EAAA;AAAA,GACR;AAEA,EAAM,MAAA,QAAA,GAAW,OAAO,OAAuC,KAAA;AAC7D,IAAM,MAAA,EAAE,UAAa,GAAA,OAAA;AAErB,IAAA,MAAM,QAAQ,UAAW,CAAA,GAAA,CAAI,CAAC,CAAA,KAAgB,EAAE,IAAI,CAAA;AACpD,IAAI,IAAA,QAAA,GAAW,EAAE,yCAAyC,CAAA;AAE1D,IAAI,IAAA;AACF,MAAA,IAAI,QAAU,EAAA;AACZ,QAAM,MAAA,YAAA,GAAe,QAAQ,QAAU,EAAA;AAAA,UACrC,KAAO,EAAA;AAAA,SACR,CAAA;AACD,QAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,YAAY,CAAA,KAAM,CAAI,CAAA,EAAA;AACtC,UAAW,QAAA,GAAA,QAAA,CAAS,OAAQ,CAAA,GAAA,EAAK,EAAE,CAAA;AACnC,UAAW,QAAA,GAAA,CAAA,EAAG,QAAQ,CAAI,CAAA,EAAA,CAAA;AAAA,YACxB;AAAA,WACD,IAAI,QAAQ,CAAA,CAAA,CAAA;AAEb,UAAA,MAAM,iBAAiB,cAAe,CAAA;AAAA,YACpC,KAAO,EAAA;AAAA,WACR,CAAA;AAAA;AACH;AAGF,MAAA,MAAM,iBAAiB,kBAAmB,CAAA;AAAA,QACxC,GAAG,OAAA;AAAA,QACH,QAAU,EAAA,OAAA,CAAQ,QAAU,EAAA,iBAAA,CAAkB,OAAO;AAAA,OACtD,CAAA;AACD,MAAA,QAAA,CAAS,KAAK,EAAE,OAAA,EAAS,QAAU,EAAA,QAAA,EAAU,WAAW,CAAA;AAExD,MAAA,6BAAA,CAA8B,KAAK,CAAA;AACnC,MAAM,KAAA,EAAA;AAAA,aACC,GAAK,EAAA;AACZ,MAAA,QAAA,CAAS,KAAK,EAAE,OAAA,EAAU,IAAc,OAAS,EAAA,QAAA,EAAU,SAAS,CAAA;AAAA;AACtE,GACF;AAEA,EAAM,MAAA,QAAA,GAAW,OAAO,OAAuC,KAAA;AAC7D,IAAA,IAAI,CAAC,qBAAuB,EAAA;AAC1B,MAAA;AAAA;AAGF,IAAM,MAAA,EAAE,UAAa,GAAA,OAAA;AAErB,IAAA,MAAM,QAAQ,UAAW,CAAA,GAAA,CAAI,CAAC,CAAA,KAAgB,EAAE,IAAI,CAAA;AACpD,IAAI,IAAA,SAAA,GAAY,EAAE,qCAAqC,CAAA;AAEvD,IAAI,IAAA;AACF,MAAA,IAAI,QAAU,EAAA;AACZ,QAAM,MAAA,YAAA,GAAe,QAAQ,QAAU,EAAA;AAAA,UACrC,KAAO,EAAA;AAAA,SACR,CAAA;AAED,QAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,YAAY,CAAA,KAAM,CAAI,CAAA,EAAA;AACtC,UAAY,SAAA,GAAA,SAAA,CAAU,OAAQ,CAAA,GAAA,EAAK,EAAE,CAAA;AACrC,UAAY,SAAA,GAAA,CAAA,EAAG,SAAS,CAAI,CAAA,EAAA,CAAA;AAAA,YAC1B;AAAA,WACD,IAAI,QAAQ,CAAA,CAAA,CAAA;AAEb,UAAA,MAAM,iBAAiB,cAAe,CAAA;AAAA,YACpC,KAAO,EAAA;AAAA,WACR,CAAA;AAAA;AACH;AAGF,MAAM,MAAA,gBAAA,CAAiB,kBAAmB,CAAA,qBAAA,EAAuB,OAAO,CAAA;AACxE,MAAA,QAAA,CAAS,KAAK,EAAE,OAAA,EAAS,SAAW,EAAA,QAAA,EAAU,WAAW,CAAA;AAEzD,MAAA,wBAAA,CAAyB,IAAI,CAAA;AAC7B,MAAM,KAAA,EAAA;AAAA,aACC,GAAK,EAAA;AACZ,MAAA,QAAA,CAAS,KAAK,EAAE,OAAA,EAAU,IAAc,OAAS,EAAA,QAAA,EAAU,SAAS,CAAA;AAAA;AACtE,GACF;AAEA,EAAM,MAAA,kBAAA,GAAqB,QAAQ,MAAM;AACvC,IAAA,IAAI,CAAC,qBAAA,IAAyB,CAAC,aAAA,EAAe,OAAS,EAAA;AACrD,MAAO,OAAA,IAAA;AAAA;AAET,IAAA,OACE,cAAc,OAAQ,CAAA,IAAA,CAAK,OAAK,CAAE,CAAA,EAAA,KAAO,qBAAqB,CAAK,IAAA,IAAA;AAAA,GAEpE,EAAA,CAAC,qBAAuB,EAAA,aAAA,EAAe,OAAO,CAAC,CAAA;AAElD,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2BAAQ,QAAS,EAAA,EAAA,CAAA;AAAA;AAEnB,EAAA,IAAI,KAAO,EAAA;AACT,IAAO,uBAAA,GAAA,CAAC,cAAW,KAAc,EAAA,CAAA;AAAA;AAGnC,EAAA,MAAM,OAAuC,GAAA;AAAA,IAC3C;AAAA,MACE,KACE,kBAAA,GAAA,CAAC,UAAY,EAAA,EAAA,QAAA,EAAA,CAAA,CAAE,wCAAwC,CAAE,EAAA,CAAA;AAAA,MAE3D,OAAS,EAAA,IAAA;AAAA,MACT,KAAO,EAAA,OAAA;AAAA,MACP,MAAA,EAAQ,aAAW,OAAQ,CAAA;AAAA,KAC7B;AAAA,IACA;AAAA,MACE,KACE,kBAAA,GAAA,CAAC,UAAY,EAAA,EAAA,QAAA,EAAA,CAAA,CAAE,uCAAuC,CAAE,EAAA,CAAA;AAAA,MAE1D,OAAS,EAAA,IAAA;AAAA,MACT,KAAO,EAAA,MAAA;AAAA,MACP,MAAA,EAAQ,aAAW,OAAQ,CAAA;AAAA,KAC7B;AAAA,IACA;AAAA,MACE,KACE,kBAAA,GAAA,CAAC,UACE,EAAA,EAAA,QAAA,EAAA,CAAA,CAAE,4CAA4C,CACjD,EAAA,CAAA;AAAA,MAEF,OAAS,EAAA,IAAA;AAAA,MACT,KAAO,EAAA,WAAA;AAAA,MACP,MAAA,EAAQ,aAAW,OAAQ,CAAA;AAAA,KAC7B;AAAA,IACA;AAAA,MACE,KACE,kBAAA,GAAA,CAAC,UACE,EAAA,EAAA,QAAA,EAAA,CAAA,CAAE,6CAA6C,CAClD,EAAA,CAAA;AAAA,MAEF,OAAS,EAAA,IAAA;AAAA,MACT,KAAO,EAAA,cAAA;AAAA,MACP,MAAA,EAAQ,aAAW,OAAQ,CAAA;AAAA,KAC7B;AAAA,IAEA;AAAA,MACE,KACE,kBAAA,GAAA,CAAC,UACE,EAAA,EAAA,QAAA,EAAA,CAAA,CAAE,2CAA2C,CAChD,EAAA,CAAA;AAAA,MAEF,OAAS,EAAA,IAAA;AAAA,MACT,KAAO,EAAA,UAAA;AAAA,MACP,MAAQ,EAAA,CAAA,OAAA,KAAW,OAAQ,CAAA,QAAA,EAAU,KAAS,IAAA;AAAA,KAChD;AAAA,IACA;AAAA,MACE,KACE,kBAAA,GAAA,CAAC,UAAY,EAAA,EAAA,QAAA,EAAA,CAAA,CAAE,uCAAuC,CAAE,EAAA,CAAA;AAAA,MAE1D,OAAS,EAAA,IAAA;AAAA,MACT,KAAO,EAAA,MAAA;AAAA,MACP,MAAA,EAAQ,CAAW,OAAA,KAAA,OAAA,CAAQ,IAAM,EAAA,GAAA,CAAI,CAAO,GAAA,KAAA,GAAA,CAAI,KAAK,CAAA,CAAE,IAAK,CAAA,IAAI,CAAK,IAAA;AAAA,KACvE;AAAA,IACA;AAAA,MACE,KACE,kBAAA,GAAA,CAAC,UAAY,EAAA,EAAA,QAAA,EAAA,CAAA,CAAE,yCAAyC,CAAE,EAAA,CAAA;AAAA,MAE5D,OAAS,EAAA,IAAA;AAAA,MACT,KAAO,EAAA,QAAA;AAAA,MACP,MAAQ,EAAA,CAAA,OAAA,KACN,OAAQ,CAAA,MAAA,uBACL,QAAU,EAAA,EAAA,QAAA,EAAA,CAAA,CAAE,yCAAyC,CAAA,EAAE,CAExD,mBAAA,GAAA,CAAC,aACE,EAAA,EAAA,QAAA,EAAA,CAAA,CAAE,2CAA2C,CAChD,EAAA;AAAA,KAEN;AAAA,IACA;AAAA,MACE,KACE,kBAAA,GAAA,CAAC,UACE,EAAA,EAAA,QAAA,EAAA,CAAA,CAAE,6CAA6C,CAClD,EAAA,CAAA;AAAA,MAEF,OAAS,EAAA,IAAA;AAAA,MACT,KAAO,EAAA,YAAA;AAAA,MACP,IAAM,EAAA,MAAA;AAAA,MACN,MAAA,EAAQ,aACN,QAAS,CAAA,OAAA,CAAQ,QAAQ,UAAU,CAAA,CAAE,SAAS,UAAU;AAAA,KAC5D;AAAA,IACA;AAAA,MACE,KACE,kBAAA,GAAA,CAAC,UACE,EAAA,EAAA,QAAA,EAAA,CAAA,CAAE,2CAA2C,CAChD,EAAA,CAAA;AAAA,MAEF,OAAS,EAAA,IAAA;AAAA,MACT,KAAO,EAAA,UAAA;AAAA,MACP,IAAM,EAAA,MAAA;AAAA,MACN,MAAA,EAAQ,aACN,QAAS,CAAA,OAAA,CAAQ,QAAQ,QAAQ,CAAA,CAAE,SAAS,UAAU;AAAA,KAC1D;AAAA,IACA;AAAA,MACE,KACE,kBAAA,GAAA,CAAC,UACE,EAAA,EAAA,QAAA,EAAA,CAAA,CAAE,6CAA6C,CAClD,EAAA,CAAA;AAAA,MAEF,OAAS,EAAA,IAAA;AAAA,MACT,KAAO,EAAA,YAAA;AAAA,MACP,IAAM,EAAA,MAAA;AAAA,MACN,MAAA,EAAQ,CACN,OAAA,KAAA,OAAA,EAAS,UACL,GAAA,QAAA,CAAS,OAAQ,CAAA,OAAA,CAAQ,UAAU,CAAA,CAAE,QAAS,CAAA,UAAU,CACxD,GAAA;AAAA,KACR;AAAA,IACA;AAAA,MACE,KACE,kBAAA,GAAA,CAAC,UAAY,EAAA,EAAA,QAAA,EAAA,CAAA,CAAE,0CAA0C,CAAE,EAAA,CAAA;AAAA,MAE7D,QAAQ,CAAW,OAAA,KAAA;AACjB,QAAA,uBACG,IAAA,CAAA,GAAA,EAAA,EAAI,OAAQ,EAAA,MAAA,EAAO,eAAc,KAChC,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,YAAW,EAAA,SAAA;AAAA,cACX,OAAA,EAAS,MAAM,YAAA,CAAa,OAAO,CAAA;AAAA,cACnC,IAAK,EAAA,OAAA;AAAA,cAEL,QAAC,kBAAA,GAAA,CAAA,WAAA,EAAA,EAAY,QAAS,EAAA,OAAA,EAAQ,eAAY,SAAU,EAAA;AAAA;AAAA,WACtD;AAAA,0BAEA,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,YAAW,EAAA,MAAA;AAAA,cACX,QACE,EAAA,uBAAA,IACA,CAAC,qBAAA,IACD,0BAA0B,OAAQ,CAAA,EAAA;AAAA,cAEpC,OAAA,EAAS,MAAM,MAAA,CAAO,OAAO,CAAA;AAAA,cAC7B,IAAK,EAAA,OAAA;AAAA,cAEL,QAAC,kBAAA,GAAA,CAAA,QAAA,EAAA,EAAS,QAAS,EAAA,OAAA,EAAQ,eAAY,WAAY,EAAA;AAAA;AAAA,WACrD;AAAA,0BAEA,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,YAAW,EAAA,QAAA;AAAA,cACX,QAAA,EAAU,2BAA2B,CAAC,qBAAA;AAAA,cACtC,OAAA,EAAS,MAAM,gBAAA,CAAiB,OAAO,CAAA;AAAA,cACvC,IAAK,EAAA,OAAA;AAAA,cAEL,QAAC,kBAAA,GAAA,CAAA,UAAA,EAAA,EAAW,QAAS,EAAA,OAAA,EAAQ,eAAY,aAAc,EAAA;AAAA;AAAA;AACzD,SACF,EAAA,CAAA;AAAA;AAEJ;AACF,GACF;AAEA,EAAA,2BACG,iBAAkB,EAAA,EAAA,UAAA,EAAY,8BAC7B,QAAC,kBAAA,IAAA,CAAA,IAAA,EAAA,EAAK,WAAS,IACZ,EAAA,QAAA,EAAA;AAAA,IAAA,CAAC,yCACC,GAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAU,2BAA2B,CAAC,qBAAA;AAAA,QACtC,OAAQ,EAAA,WAAA;AAAA,QACR,OAAA,EAAS,MAAM,mBAAoB,EAAA;AAAA,QAElC,QACG,EAAA,0BAAA,GAAA,CAAA,CAAE,yCAAyC,CAAA,GAC3C,EAAE,yCAAyC;AAAA;AAAA,KAEnD,EAAA,CAAA;AAAA,IAGD,8CACE,GAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,WAAa,EAAA,EAAE,MAAQ,EAAA,CAAC,eAAgB,EAAA;AAAA,QACxC;AAAA;AAAA,KAEJ,EAAA,CAAA;AAAA,IAGD,qBAAA,IAAyB,sCACvB,GAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,QAAA,kBAAA,IAAA,CAAC,GACC,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAA,IAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,OAAQ,EAAA,MAAA;AAAA,UACR,cAAe,EAAA,eAAA;AAAA,UACf,KAAA,EAAO,EAAE,YAAA,EAAc,EAAG,EAAA;AAAA,UAE1B,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,IACjB,EAAA,QAAA,EAAA,CAAA,CAAE,mCAAmC,CACxC,EAAA,CAAA;AAAA,4BACA,GAAA,CAAC,MAAO,EAAA,EAAA,OAAA,EAAQ,UAAW,EAAA,OAAA,EAAS,cAAc,IAAK,EAAA,OAAA,EACpD,QAAE,EAAA,CAAA,CAAA,yCAAyC,CAC9C,EAAA;AAAA;AAAA;AAAA,OACF;AAAA,sBACA,GAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,WAAa,EAAA,kBAAA;AAAA,UACb,QAAU,EAAA;AAAA;AAAA;AACZ,KAAA,EACF,CACF,EAAA,CAAA;AAAA,oBAGD,IAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,EAAE,0CAA0C,CAAA;AAAA,UACnD,OAAS,EAAA,EAAE,QAAU,EAAA,EAAA,EAAI,QAAQ,IAAK,EAAA;AAAA,UACtC,OAAA;AAAA,UACA,IAAA,EAAM,aAAe,EAAA,OAAA,IAAW,EAAC;AAAA,UACjC,YACE,kBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,KAAA,EAAO,EAAE,OAAA,EAAS,CAAG,EAAA,SAAA,EAAW,QAAS,EAAA,EAClD,QAAE,EAAA,CAAA,CAAA,iDAAiD,CACtD,EAAA;AAAA;AAAA,OAEJ;AAAA,sBAEA,GAAA;AAAA,QAAC,wBAAA;AAAA,QAAA;AAAA,UACC,IAAM,EAAA,kBAAA;AAAA,UACN,QAAU,EAAA,cAAA;AAAA,UACV,SAAW,EAAA;AAAA;AAAA;AACb,KACF,EAAA;AAAA,GAAA,EACF,CACF,EAAA,CAAA;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"AnnouncementsContent.esm.js","sources":["../../../../src/components/Admin/AnnouncementsContent/AnnouncementsContent.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useState, useMemo } from 'react';\nimport {\n ErrorPanel,\n Progress,\n Table,\n TableColumn,\n StatusOK,\n StatusPending,\n} from '@backstage/core-components';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport {\n announcementsApiRef,\n CreateAnnouncementRequest,\n useAnnouncementsTranslation,\n useCategories,\n useAnnouncementsPermissions,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n Announcement,\n announcementCreatePermission,\n Category,\n} from '@backstage-community/plugin-announcements-common';\nimport useAsyncRetry from 'react-use/esm/useAsyncRetry';\nimport { useDeleteDialogState, DeleteDialog } from '../DeleteDialog';\nimport { useNavigate } from 'react-router-dom';\nimport { AnnouncementForm } from './AnnouncementForm';\nimport slugify from 'slugify';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { Box, Button, Grid, IconButton, Typography } from '@material-ui/core';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport EditIcon from '@material-ui/icons/Edit';\nimport PreviewIcon from '@material-ui/icons/Visibility';\nimport { DateTime } from 'luxon';\n\ntype AnnouncementsContentProps = {\n defaultInactive?: boolean;\n};\n\nexport const AnnouncementsContent = ({\n defaultInactive,\n}: AnnouncementsContentProps) => {\n const alertApi = useApi(alertApiRef);\n const announcementsApi = useApi(announcementsApiRef);\n const navigate = useNavigate();\n const { categories } = useCategories();\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 {\n loading,\n error,\n value: announcements,\n retry,\n } = useAsyncRetry(async () => await announcementsApi.announcements({}));\n\n const {\n isOpen: isDeleteDialogOpen,\n open: openDeleteDialog,\n close: closeDeleteDialog,\n item: announcementToDelete,\n } = useDeleteDialogState<Announcement>();\n\n const onCreateButtonClick = () => {\n setShowCreateAnnouncementForm(!showCreateAnnouncementForm);\n setEditingAnnouncementId(null);\n };\n\n const onTitleClick = (announcement: Announcement) => {\n navigate(`/announcements/view/${announcement.id}`);\n };\n\n const onEdit = (announcement: Announcement) => {\n setEditingAnnouncementId(announcement.id);\n setShowCreateAnnouncementForm(false);\n };\n\n const onCancelEdit = () => {\n setEditingAnnouncementId(null);\n };\n\n const onCancelDelete = () => {\n closeDeleteDialog();\n };\n const onConfirmDelete = async () => {\n closeDeleteDialog();\n\n try {\n await announcementsApi.deleteAnnouncementByID(announcementToDelete!.id);\n\n alertApi.post({ message: 'Announcement deleted.', severity: 'success' });\n } catch (err) {\n alertApi.post({ message: (err as Error).message, severity: 'error' });\n }\n\n retry();\n };\n\n const onSubmit = async (request: CreateAnnouncementRequest) => {\n const { category } = request;\n\n const slugs = categories.map((c: Category) => c.slug);\n let alertMsg = t('admin.announcementsContent.alertMessage') as string;\n\n try {\n if (category) {\n const categorySlug = slugify(category, {\n lower: true,\n });\n if (slugs.indexOf(categorySlug) === -1) {\n alertMsg = alertMsg.replace('.', '');\n alertMsg = `${alertMsg} ${t(\n 'admin.announcementsContent.alertMessageWithNewCategory',\n )} ${category}.`;\n\n await announcementsApi.createCategory({\n title: category,\n });\n }\n }\n\n await announcementsApi.createAnnouncement({\n ...request,\n category: request.category?.toLocaleLowerCase('en-US'),\n });\n alertApi.post({ message: alertMsg, severity: 'success' });\n\n setShowCreateAnnouncementForm(false);\n retry();\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 const { category } = request;\n\n const slugs = categories.map((c: Category) => c.slug);\n let updateMsg = t('editAnnouncementPage.updatedMessage') as string;\n\n try {\n if (category) {\n const categorySlug = slugify(category, {\n lower: true,\n });\n\n if (slugs.indexOf(categorySlug) === -1) {\n updateMsg = updateMsg.replace('.', '');\n updateMsg = `${updateMsg} ${t(\n 'editAnnouncementPage.updatedMessageWithNewCategory',\n )} ${category}.`;\n\n await announcementsApi.createCategory({\n title: category,\n });\n }\n }\n\n await announcementsApi.updateAnnouncement(editingAnnouncementId, request);\n alertApi.post({ message: updateMsg, severity: 'success' });\n\n setEditingAnnouncementId(null);\n retry();\n } catch (err) {\n alertApi.post({ message: (err as Error).message, severity: 'error' });\n }\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 if (loading) {\n return <Progress />;\n }\n if (error) {\n return <ErrorPanel error={error} />;\n }\n\n const columns: TableColumn<Announcement>[] = [\n {\n title: (\n <Typography>{t('admin.announcementsContent.table.title')}</Typography>\n ),\n sorting: true,\n field: 'title',\n render: rowData => rowData.title,\n },\n {\n title: (\n <Typography>{t('admin.announcementsContent.table.body')}</Typography>\n ),\n sorting: true,\n field: 'body',\n render: rowData => rowData.body,\n },\n {\n title: (\n <Typography>\n {t('admin.announcementsContent.table.publisher')}\n </Typography>\n ),\n sorting: true,\n field: 'publisher',\n render: rowData => rowData.publisher,\n },\n {\n title: (\n <Typography>\n {t('admin.announcementsContent.table.onBehalfOf')}\n </Typography>\n ),\n sorting: true,\n field: 'on_behalf_of',\n render: rowData => rowData.on_behalf_of,\n },\n\n {\n title: (\n <Typography>\n {t('admin.announcementsContent.table.category')}\n </Typography>\n ),\n sorting: true,\n field: 'category',\n render: rowData => rowData.category?.title ?? '',\n },\n {\n title: (\n <Typography>{t('admin.announcementsContent.table.tags')}</Typography>\n ),\n sorting: true,\n field: 'tags',\n render: rowData => rowData.tags?.map(tag => tag.title).join(', ') || '',\n },\n {\n title: (\n <Typography>{t('admin.announcementsContent.table.status')}</Typography>\n ),\n sorting: true,\n field: 'active',\n render: rowData =>\n rowData.active ? (\n <StatusOK>{t('admin.announcementsContent.table.active')}</StatusOK>\n ) : (\n <StatusPending>\n {t('admin.announcementsContent.table.inactive')}\n </StatusPending>\n ),\n },\n {\n title: (\n <Typography>\n {t('admin.announcementsContent.table.created_at')}\n </Typography>\n ),\n sorting: true,\n field: 'created_at',\n type: 'date',\n render: rowData =>\n DateTime.fromISO(rowData.created_at).toFormat('M/d/yyyy'),\n },\n {\n title: (\n <Typography>\n {t('admin.announcementsContent.table.start_at')}\n </Typography>\n ),\n sorting: true,\n field: 'start_at',\n type: 'date',\n render: rowData =>\n DateTime.fromISO(rowData.start_at).toFormat('M/d/yyyy'),\n },\n {\n title: (\n <Typography>\n {t('admin.announcementsContent.table.until_date')}\n </Typography>\n ),\n sorting: true,\n field: 'until_date',\n type: 'date',\n render: rowData =>\n rowData?.until_date\n ? DateTime.fromISO(rowData.until_date).toFormat('M/d/yyyy')\n : '-',\n },\n {\n title: (\n <Typography>{t('admin.announcementsContent.table.actions')}</Typography>\n ),\n render: rowData => {\n return (\n <Box display=\"flex\" flexDirection=\"row\">\n <IconButton\n aria-label=\"preview\"\n onClick={() => onTitleClick(rowData)}\n size=\"small\"\n >\n <PreviewIcon fontSize=\"small\" data-testid=\"preview\" />\n </IconButton>\n\n <IconButton\n aria-label=\"edit\"\n disabled={\n permissions.update.loading ||\n !permissions.update.allowed ||\n editingAnnouncementId === rowData.id\n }\n onClick={() => onEdit(rowData)}\n size=\"small\"\n >\n <EditIcon fontSize=\"small\" data-testid=\"edit-icon\" />\n </IconButton>\n\n <IconButton\n aria-label=\"delete\"\n disabled={\n permissions.delete.loading || !permissions.delete.allowed\n }\n onClick={() => openDeleteDialog(rowData)}\n size=\"small\"\n >\n <DeleteIcon fontSize=\"small\" data-testid=\"delete-icon\" />\n </IconButton>\n </Box>\n );\n },\n },\n ];\n\n return (\n <RequirePermission permission={announcementCreatePermission}>\n <Grid container>\n {!editingAnnouncementId && (\n <Grid item xs={12}>\n <Button\n disabled={\n permissions.create.loading || !permissions.create.allowed\n }\n variant=\"contained\"\n onClick={() => onCreateButtonClick()}\n >\n {showCreateAnnouncementForm\n ? t('admin.announcementsContent.cancelButton')\n : t('admin.announcementsContent.createButton')}\n </Button>\n </Grid>\n )}\n\n {showCreateAnnouncementForm && (\n <Grid item xs={12}>\n <AnnouncementForm\n initialData={{ active: !defaultInactive } as Announcement}\n onSubmit={onSubmit}\n />\n </Grid>\n )}\n\n {editingAnnouncementId && announcementToEdit && (\n <Grid item xs={12}>\n <Box>\n <Box\n display=\"flex\"\n justifyContent=\"space-between\"\n style={{ marginBottom: 16 }}\n >\n <Typography variant=\"h6\">\n {t('announcementForm.editAnnouncement')}\n </Typography>\n <Button variant=\"outlined\" onClick={onCancelEdit} size=\"small\">\n {t('admin.announcementsContent.cancelButton')}\n </Button>\n </Box>\n <AnnouncementForm\n initialData={announcementToEdit}\n onSubmit={onUpdate}\n />\n </Box>\n </Grid>\n )}\n\n <Grid item xs={12}>\n <Table\n title={t('admin.announcementsContent.announcements')}\n options={{ pageSize: 20, search: true }}\n columns={columns}\n data={announcements?.results ?? []}\n emptyContent={\n <Typography style={{ padding: 2, textAlign: 'center' }}>\n {t('admin.announcementsContent.noAnnouncementsFound')}\n </Typography>\n }\n />\n\n <DeleteDialog\n isOpen={isDeleteDialogOpen}\n onCancel={onCancelDelete}\n onConfirm={onConfirmDelete}\n />\n </Grid>\n </Grid>\n </RequirePermission>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { useState } from 'react';
|
|
3
3
|
import { Progress, ErrorPanel, Table } from '@backstage/core-components';
|
|
4
|
-
import { useCategories, announcementsApiRef, useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';
|
|
5
|
-
import { announcementCreatePermission
|
|
4
|
+
import { useCategories, announcementsApiRef, useAnnouncementsTranslation, useAnnouncementsPermissions } from '@backstage-community/plugin-announcements-react';
|
|
5
|
+
import { announcementCreatePermission } from '@backstage-community/plugin-announcements-common';
|
|
6
6
|
import { useApi, alertApiRef } from '@backstage/core-plugin-api';
|
|
7
|
-
import {
|
|
7
|
+
import { RequirePermission } from '@backstage/plugin-permission-react';
|
|
8
8
|
import { Typography, IconButton, Grid, Button } from '@material-ui/core';
|
|
9
9
|
import DeleteIcon from '@material-ui/icons/Delete';
|
|
10
10
|
import { CategoriesForm } from './CategoriesForm.esm.js';
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
11
|
+
import { useDeleteDialogState } from '../DeleteDialog/useDeleteDialogState.esm.js';
|
|
12
|
+
import { DeleteDialog } from '../DeleteDialog/DeleteDialog.esm.js';
|
|
13
13
|
|
|
14
14
|
const CategoriesContent = () => {
|
|
15
15
|
const [showNewCategoryForm, setShowNewCategoryForm] = useState(false);
|
|
@@ -21,14 +21,9 @@ const CategoriesContent = () => {
|
|
|
21
21
|
isOpen: isDeleteDialogOpen,
|
|
22
22
|
open: openDeleteDialog,
|
|
23
23
|
close: closeDeleteDialog,
|
|
24
|
-
|
|
25
|
-
} =
|
|
26
|
-
const
|
|
27
|
-
permission: announcementCreatePermission
|
|
28
|
-
});
|
|
29
|
-
const { loading: loadingDeletePermission, allowed: canDeleteAnnouncement } = usePermission({
|
|
30
|
-
permission: announcementDeletePermission
|
|
31
|
-
});
|
|
24
|
+
item: categoryToDelete
|
|
25
|
+
} = useDeleteDialogState();
|
|
26
|
+
const permissions = useAnnouncementsPermissions();
|
|
32
27
|
const onSubmit = async (request) => {
|
|
33
28
|
const { title } = request;
|
|
34
29
|
try {
|
|
@@ -92,7 +87,7 @@ const CategoriesContent = () => {
|
|
|
92
87
|
IconButton,
|
|
93
88
|
{
|
|
94
89
|
"aria-label": "delete",
|
|
95
|
-
disabled:
|
|
90
|
+
disabled: permissions.delete.loading || !permissions.delete.allowed,
|
|
96
91
|
onClick: () => openDeleteDialog(rowData),
|
|
97
92
|
children: /* @__PURE__ */ jsx(DeleteIcon, { fontSize: "small", "data-testid": "delete-icon" })
|
|
98
93
|
}
|
|
@@ -104,7 +99,7 @@ const CategoriesContent = () => {
|
|
|
104
99
|
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
|
|
105
100
|
Button,
|
|
106
101
|
{
|
|
107
|
-
disabled:
|
|
102
|
+
disabled: permissions.create.loading || !permissions.create.allowed,
|
|
108
103
|
variant: "contained",
|
|
109
104
|
onClick: () => onCreateButtonClick(),
|
|
110
105
|
children: showNewCategoryForm ? t("admin.categoriesContent.cancelButton") : t("admin.categoriesContent.createButton")
|
|
@@ -122,9 +117,9 @@ const CategoriesContent = () => {
|
|
|
122
117
|
}
|
|
123
118
|
) }),
|
|
124
119
|
/* @__PURE__ */ jsx(
|
|
125
|
-
|
|
120
|
+
DeleteDialog,
|
|
126
121
|
{
|
|
127
|
-
|
|
122
|
+
isOpen: isDeleteDialogOpen,
|
|
128
123
|
onCancel: onCancelDelete,
|
|
129
124
|
onConfirm: onConfirmDelete
|
|
130
125
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CategoriesContent.esm.js","sources":["../../../../src/components/Admin/CategoriesContent/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 {\n ErrorPanel,\n Progress,\n Table,\n TableColumn,\n} from '@backstage/core-components';\nimport {\n CreateCategoryRequest,\n announcementsApiRef,\n useAnnouncementsTranslation,\n useCategories,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n announcementCreatePermission,\n
|
|
1
|
+
{"version":3,"file":"CategoriesContent.esm.js","sources":["../../../../src/components/Admin/CategoriesContent/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 {\n ErrorPanel,\n Progress,\n Table,\n TableColumn,\n} from '@backstage/core-components';\nimport {\n CreateCategoryRequest,\n announcementsApiRef,\n useAnnouncementsTranslation,\n useCategories,\n useAnnouncementsPermissions,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n announcementCreatePermission,\n Category,\n} from '@backstage-community/plugin-announcements-common';\nimport { useApi, alertApiRef } from '@backstage/core-plugin-api';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { ResponseError } from '@backstage/errors';\nimport { Button, Grid, IconButton, Typography } from '@material-ui/core';\nimport DeleteIcon from '@material-ui/icons/Delete';\n\nimport { CategoriesForm } from './CategoriesForm';\nimport { useDeleteDialogState, DeleteDialog } from '../DeleteDialog';\n\nexport const CategoriesContent = () => {\n const [showNewCategoryForm, setShowNewCategoryForm] = useState(false);\n const { categories, loading, error, retry: refresh } = useCategories();\n const announcementsApi = useApi(announcementsApiRef);\n const alertApi = useApi(alertApiRef);\n const { t } = useAnnouncementsTranslation();\n\n const {\n isOpen: isDeleteDialogOpen,\n open: openDeleteDialog,\n close: closeDeleteDialog,\n item: categoryToDelete,\n } = useDeleteDialogState<Category>();\n\n const permissions = useAnnouncementsPermissions();\n\n const onSubmit = 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 refresh();\n } catch (err) {\n alertApi.post({ message: (err as Error).message, severity: 'error' });\n }\n };\n\n const onCreateButtonClick = () => {\n setShowNewCategoryForm(!showNewCategoryForm);\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 if (loading) {\n return <Progress />;\n }\n if (error) {\n return <ErrorPanel error={error} />;\n }\n\n const columns: TableColumn<Category>[] = [\n {\n title: (\n <Typography>{t('admin.categoriesContent.table.title')}</Typography>\n ),\n sorting: true,\n field: 'title',\n render: rowData => rowData.title,\n },\n {\n title: <Typography>{t('admin.categoriesContent.table.slug')}</Typography>,\n sorting: true,\n field: 'slug',\n render: rowData => rowData.slug,\n },\n {\n title: (\n <Typography>{t('admin.categoriesContent.table.actions')}</Typography>\n ),\n render: rowData => {\n return (\n <IconButton\n aria-label=\"delete\"\n disabled={permissions.delete.loading || !permissions.delete.allowed}\n onClick={() => openDeleteDialog(rowData)}\n >\n <DeleteIcon fontSize=\"small\" data-testid=\"delete-icon\" />\n </IconButton>\n );\n },\n },\n ];\n\n return (\n <RequirePermission permission={announcementCreatePermission}>\n <Grid container>\n <Grid item xs={12}>\n <Button\n disabled={permissions.create.loading || !permissions.create.allowed}\n variant=\"contained\"\n onClick={() => onCreateButtonClick()}\n >\n {showNewCategoryForm\n ? t('admin.categoriesContent.cancelButton')\n : t('admin.categoriesContent.createButton')}\n </Button>\n </Grid>\n\n {showNewCategoryForm && (\n <Grid item xs={12}>\n <CategoriesForm initialData={{} as Category} onSubmit={onSubmit} />\n </Grid>\n )}\n\n <Grid item xs={12}>\n <Table\n title=\"Categories\"\n options={{ pageSize: 20, search: true }}\n columns={columns}\n data={categories ?? []}\n emptyContent={\n <Typography style={{ padding: 2, textAlign: 'center' }}>\n {t('admin.categoriesContent.table.noCategoriesFound')}\n </Typography>\n }\n />\n </Grid>\n\n <DeleteDialog\n isOpen={isDeleteDialogOpen}\n onCancel={onCancelDelete}\n onConfirm={onConfirmDelete}\n />\n </Grid>\n </RequirePermission>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;AA0CO,MAAM,oBAAoB,MAAM;AACrC,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAI,SAAS,KAAK,CAAA;AACpE,EAAA,MAAM,EAAE,UAAY,EAAA,OAAA,EAAS,OAAO,KAAO,EAAA,OAAA,KAAY,aAAc,EAAA;AACrE,EAAM,MAAA,gBAAA,GAAmB,OAAO,mBAAmB,CAAA;AACnD,EAAM,MAAA,QAAA,GAAW,OAAO,WAAW,CAAA;AACnC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAE1C,EAAM,MAAA;AAAA,IACJ,MAAQ,EAAA,kBAAA;AAAA,IACR,IAAM,EAAA,gBAAA;AAAA,IACN,KAAO,EAAA,iBAAA;AAAA,IACP,IAAM,EAAA;AAAA,MACJ,oBAA+B,EAAA;AAEnC,EAAA,MAAM,cAAc,2BAA4B,EAAA;AAEhD,EAAM,MAAA,QAAA,GAAW,OAAO,OAAmC,KAAA;AACzD,IAAM,MAAA,EAAE,OAAU,GAAA,OAAA;AAElB,IAAI,IAAA;AACF,MAAA,MAAM,iBAAiB,cAAe,CAAA;AAAA,QACpC;AAAA,OACD,CAAA;AAED,MAAA,QAAA,CAAS,IAAK,CAAA;AAAA,QACZ,SAAS,CAAG,EAAA,KAAK,CAAI,CAAA,EAAA,CAAA,CAAE,wCAAwC,CAAC,CAAA,CAAA;AAAA,QAChE,QAAU,EAAA;AAAA,OACX,CAAA;AAED,MAAQ,OAAA,EAAA;AAAA,aACD,GAAK,EAAA;AACZ,MAAA,QAAA,CAAS,KAAK,EAAE,OAAA,EAAU,IAAc,OAAS,EAAA,QAAA,EAAU,SAAS,CAAA;AAAA;AACtE,GACF;AAEA,EAAA,MAAM,sBAAsB,MAAM;AAChC,IAAA,sBAAA,CAAuB,CAAC,mBAAmB,CAAA;AAAA,GAC7C;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,cAAe,CAAA,gBAAA,CAAkB,IAAI,CAAA;AAE5D,MAAA,QAAA,CAAS,IAAK,CAAA;AAAA,QACZ,OAAA,EAAS,EAAE,+CAA+C,CAAA;AAAA,QAC1D,QAAU,EAAA;AAAA,OACX,CAAA;AAAA,aACM,GAAK,EAAA;AACZ,MAAA,QAAA,CAAS,IAAK,CAAA;AAAA,QACZ,OAAA,EAAU,GAAsB,CAAA,IAAA,CAAK,KAAM,CAAA,OAAA;AAAA,QAC3C,QAAU,EAAA;AAAA,OACX,CAAA;AAAA;AAGH,IAAQ,OAAA,EAAA;AAAA,GACV;AAEA,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2BAAQ,QAAS,EAAA,EAAA,CAAA;AAAA;AAEnB,EAAA,IAAI,KAAO,EAAA;AACT,IAAO,uBAAA,GAAA,CAAC,cAAW,KAAc,EAAA,CAAA;AAAA;AAGnC,EAAA,MAAM,OAAmC,GAAA;AAAA,IACvC;AAAA,MACE,KACE,kBAAA,GAAA,CAAC,UAAY,EAAA,EAAA,QAAA,EAAA,CAAA,CAAE,qCAAqC,CAAE,EAAA,CAAA;AAAA,MAExD,OAAS,EAAA,IAAA;AAAA,MACT,KAAO,EAAA,OAAA;AAAA,MACP,MAAA,EAAQ,aAAW,OAAQ,CAAA;AAAA,KAC7B;AAAA,IACA;AAAA,MACE,KAAO,kBAAA,GAAA,CAAC,UAAY,EAAA,EAAA,QAAA,EAAA,CAAA,CAAE,oCAAoC,CAAE,EAAA,CAAA;AAAA,MAC5D,OAAS,EAAA,IAAA;AAAA,MACT,KAAO,EAAA,MAAA;AAAA,MACP,MAAA,EAAQ,aAAW,OAAQ,CAAA;AAAA,KAC7B;AAAA,IACA;AAAA,MACE,KACE,kBAAA,GAAA,CAAC,UAAY,EAAA,EAAA,QAAA,EAAA,CAAA,CAAE,uCAAuC,CAAE,EAAA,CAAA;AAAA,MAE1D,QAAQ,CAAW,OAAA,KAAA;AACjB,QACE,uBAAA,GAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,YAAW,EAAA,QAAA;AAAA,YACX,UAAU,WAAY,CAAA,MAAA,CAAO,OAAW,IAAA,CAAC,YAAY,MAAO,CAAA,OAAA;AAAA,YAC5D,OAAA,EAAS,MAAM,gBAAA,CAAiB,OAAO,CAAA;AAAA,YAEvC,QAAC,kBAAA,GAAA,CAAA,UAAA,EAAA,EAAW,QAAS,EAAA,OAAA,EAAQ,eAAY,aAAc,EAAA;AAAA;AAAA,SACzD;AAAA;AAEJ;AACF,GACF;AAEA,EAAA,2BACG,iBAAkB,EAAA,EAAA,UAAA,EAAY,8BAC7B,QAAC,kBAAA,IAAA,CAAA,IAAA,EAAA,EAAK,WAAS,IACb,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,UAAU,WAAY,CAAA,MAAA,CAAO,OAAW,IAAA,CAAC,YAAY,MAAO,CAAA,OAAA;AAAA,QAC5D,OAAQ,EAAA,WAAA;AAAA,QACR,OAAA,EAAS,MAAM,mBAAoB,EAAA;AAAA,QAElC,QACG,EAAA,mBAAA,GAAA,CAAA,CAAE,sCAAsC,CAAA,GACxC,EAAE,sCAAsC;AAAA;AAAA,KAEhD,EAAA,CAAA;AAAA,IAEC,mBACC,oBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,QAAA,kBAAA,GAAA,CAAC,cAAe,EAAA,EAAA,WAAA,EAAa,EAAC,EAAe,UAAoB,CACnE,EAAA,CAAA;AAAA,oBAGD,GAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAM,EAAA,YAAA;AAAA,QACN,OAAS,EAAA,EAAE,QAAU,EAAA,EAAA,EAAI,QAAQ,IAAK,EAAA;AAAA,QACtC,OAAA;AAAA,QACA,IAAA,EAAM,cAAc,EAAC;AAAA,QACrB,YACE,kBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,KAAA,EAAO,EAAE,OAAA,EAAS,CAAG,EAAA,SAAA,EAAW,QAAS,EAAA,EAClD,QAAE,EAAA,CAAA,CAAA,iDAAiD,CACtD,EAAA;AAAA;AAAA,KAGN,EAAA,CAAA;AAAA,oBAEA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,MAAQ,EAAA,kBAAA;AAAA,QACR,QAAU,EAAA,cAAA;AAAA,QACV,SAAW,EAAA;AAAA;AAAA;AACb,GAAA,EACF,CACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { useState } from 'react';
|
|
3
3
|
import { InfoCard } from '@backstage/core-components';
|
|
4
|
-
import { useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';
|
|
5
|
-
import { announcementCreatePermission } from '@backstage-community/plugin-announcements-common';
|
|
6
|
-
import { usePermission } from '@backstage/plugin-permission-react';
|
|
4
|
+
import { useAnnouncementsTranslation, useAnnouncementsPermissions } from '@backstage-community/plugin-announcements-react';
|
|
7
5
|
import { makeStyles, TextField, Button } from '@material-ui/core';
|
|
8
6
|
|
|
9
7
|
const useStyles = makeStyles((theme) => {
|
|
@@ -23,9 +21,7 @@ const CategoriesForm = ({
|
|
|
23
21
|
const [form, setForm] = useState(initialData);
|
|
24
22
|
const [loading, setLoading] = useState(false);
|
|
25
23
|
const { t } = useAnnouncementsTranslation();
|
|
26
|
-
const
|
|
27
|
-
permission: announcementCreatePermission
|
|
28
|
-
});
|
|
24
|
+
const permissions = useAnnouncementsPermissions();
|
|
29
25
|
const handleChange = (event) => {
|
|
30
26
|
setForm({
|
|
31
27
|
...form,
|
|
@@ -62,7 +58,7 @@ const CategoriesForm = ({
|
|
|
62
58
|
variant: "contained",
|
|
63
59
|
color: "primary",
|
|
64
60
|
type: "submit",
|
|
65
|
-
disabled: loading || !form ||
|
|
61
|
+
disabled: loading || !form || permissions.create.loading || !permissions.create.allowed,
|
|
66
62
|
children: t("categoriesForm.submit")
|
|
67
63
|
}
|
|
68
64
|
)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CategoriesForm.esm.js","sources":["../../../../src/components/Admin/CategoriesContent/CategoriesForm.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 { ChangeEvent, FormEvent, useState } from 'react';\nimport { InfoCard } from '@backstage/core-components';\nimport {\n CreateCategoryRequest,\n useAnnouncementsTranslation,\n} from '@backstage-community/plugin-announcements-react';\nimport {
|
|
1
|
+
{"version":3,"file":"CategoriesForm.esm.js","sources":["../../../../src/components/Admin/CategoriesContent/CategoriesForm.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 { ChangeEvent, FormEvent, useState } from 'react';\nimport { InfoCard } from '@backstage/core-components';\nimport {\n CreateCategoryRequest,\n useAnnouncementsTranslation,\n useAnnouncementsPermissions,\n} from '@backstage-community/plugin-announcements-react';\nimport { Category } from '@backstage-community/plugin-announcements-common';\nimport { Button, makeStyles, TextField } from '@material-ui/core';\n\nconst useStyles = makeStyles(theme => {\n return {\n formRoot: {\n '& > *': {\n margin: theme?.spacing?.(1) ?? '8px',\n },\n },\n };\n});\n\nexport type CategoriesFormProps = {\n initialData: Category;\n onSubmit: (data: CreateCategoryRequest) => Promise<void>;\n};\n\nexport const CategoriesForm = ({\n initialData,\n onSubmit,\n}: CategoriesFormProps) => {\n const classes = useStyles();\n const [form, setForm] = useState(initialData);\n const [loading, setLoading] = useState(false);\n const { t } = useAnnouncementsTranslation();\n const permissions = useAnnouncementsPermissions();\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n setForm({\n ...form,\n [event.target.id]: event.target.value,\n });\n };\n\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n setLoading(true);\n event.preventDefault();\n\n await onSubmit(form);\n setLoading(false);\n };\n\n return (\n <InfoCard\n title={\n initialData.title\n ? t('categoriesForm.editCategory')\n : t('categoriesForm.newCategory')\n }\n >\n <form className={classes.formRoot} onSubmit={handleSubmit}>\n <TextField\n id=\"title\"\n type=\"text\"\n label={t('categoriesForm.titleLabel')}\n value={form.title}\n onChange={handleChange}\n variant=\"outlined\"\n fullWidth\n required\n />\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"submit\"\n disabled={\n loading ||\n !form ||\n permissions.create.loading ||\n !permissions.create.allowed\n }\n >\n {t('categoriesForm.submit')}\n </Button>\n </form>\n </InfoCard>\n );\n};\n"],"names":[],"mappings":";;;;;;AAyBA,MAAM,SAAA,GAAY,WAAW,CAAS,KAAA,KAAA;AACpC,EAAO,OAAA;AAAA,IACL,QAAU,EAAA;AAAA,MACR,OAAS,EAAA;AAAA,QACP,MAAQ,EAAA,KAAA,EAAO,OAAU,GAAA,CAAC,CAAK,IAAA;AAAA;AACjC;AACF,GACF;AACF,CAAC,CAAA;AAOM,MAAM,iBAAiB,CAAC;AAAA,EAC7B,WAAA;AAAA,EACA;AACF,CAA2B,KAAA;AACzB,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,WAAW,CAAA;AAC5C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAC1C,EAAA,MAAM,cAAc,2BAA4B,EAAA;AAEhD,EAAM,MAAA,YAAA,GAAe,CAAC,KAAyC,KAAA;AAC7D,IAAQ,OAAA,CAAA;AAAA,MACN,GAAG,IAAA;AAAA,MACH,CAAC,KAAM,CAAA,MAAA,CAAO,EAAE,GAAG,MAAM,MAAO,CAAA;AAAA,KACjC,CAAA;AAAA,GACH;AAEA,EAAM,MAAA,YAAA,GAAe,OAAO,KAAsC,KAAA;AAChE,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,KAAA,CAAM,cAAe,EAAA;AAErB,IAAA,MAAM,SAAS,IAAI,CAAA;AACnB,IAAA,UAAA,CAAW,KAAK,CAAA;AAAA,GAClB;AAEA,EACE,uBAAA,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OACE,WAAY,CAAA,KAAA,GACR,EAAE,6BAA6B,CAAA,GAC/B,EAAE,4BAA4B,CAAA;AAAA,MAGpC,+BAAC,MAAK,EAAA,EAAA,SAAA,EAAW,OAAQ,CAAA,QAAA,EAAU,UAAU,YAC3C,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,EAAG,EAAA,OAAA;AAAA,YACH,IAAK,EAAA,MAAA;AAAA,YACL,KAAA,EAAO,EAAE,2BAA2B,CAAA;AAAA,YACpC,OAAO,IAAK,CAAA,KAAA;AAAA,YACZ,QAAU,EAAA,YAAA;AAAA,YACV,OAAQ,EAAA,UAAA;AAAA,YACR,SAAS,EAAA,IAAA;AAAA,YACT,QAAQ,EAAA;AAAA;AAAA,SACV;AAAA,wBACA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAQ,EAAA,WAAA;AAAA,YACR,KAAM,EAAA,SAAA;AAAA,YACN,IAAK,EAAA,QAAA;AAAA,YACL,QAAA,EACE,WACA,CAAC,IAAA,IACD,YAAY,MAAO,CAAA,OAAA,IACnB,CAAC,WAAA,CAAY,MAAO,CAAA,OAAA;AAAA,YAGrB,YAAE,uBAAuB;AAAA;AAAA;AAC5B,OACF,EAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Dialog, DialogTitle, DialogActions, Button } from '@material-ui/core';
|
|
3
|
+
import { useAnnouncementsTranslation, useAnnouncementsPermissions } from '@backstage-community/plugin-announcements-react';
|
|
4
|
+
|
|
5
|
+
const DeleteDialog = (props) => {
|
|
6
|
+
const { isOpen, onConfirm, onCancel } = props;
|
|
7
|
+
const { t } = useAnnouncementsTranslation();
|
|
8
|
+
const permissions = useAnnouncementsPermissions();
|
|
9
|
+
const dialogTitle = t("confirmDeleteDialog.title");
|
|
10
|
+
const cancelText = t("confirmDeleteDialog.cancel");
|
|
11
|
+
const deleteText = t("confirmDeleteDialog.delete");
|
|
12
|
+
return /* @__PURE__ */ jsxs(Dialog, { open: isOpen, onClose: onCancel, children: [
|
|
13
|
+
/* @__PURE__ */ jsx(DialogTitle, { children: dialogTitle }),
|
|
14
|
+
/* @__PURE__ */ jsxs(DialogActions, { children: [
|
|
15
|
+
/* @__PURE__ */ jsx(Button, { onClick: onCancel, children: cancelText }),
|
|
16
|
+
/* @__PURE__ */ jsx(
|
|
17
|
+
Button,
|
|
18
|
+
{
|
|
19
|
+
disabled: permissions.delete.loading || !permissions.delete.allowed,
|
|
20
|
+
onClick: onConfirm,
|
|
21
|
+
color: "secondary",
|
|
22
|
+
children: deleteText
|
|
23
|
+
}
|
|
24
|
+
)
|
|
25
|
+
] })
|
|
26
|
+
] });
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export { DeleteDialog };
|
|
30
|
+
//# sourceMappingURL=DeleteDialog.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeleteDialog.esm.js","sources":["../../../../src/components/Admin/DeleteDialog/DeleteDialog.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 { Button, Dialog, DialogActions, DialogTitle } from '@material-ui/core';\nimport {\n useAnnouncementsTranslation,\n useAnnouncementsPermissions,\n} from '@backstage-community/plugin-announcements-react';\n\ntype DeleteDialogProps = {\n isOpen: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nexport const DeleteDialog = (props: DeleteDialogProps) => {\n const { isOpen, onConfirm, onCancel } = props;\n\n const { t } = useAnnouncementsTranslation();\n const permissions = useAnnouncementsPermissions();\n\n const dialogTitle = t('confirmDeleteDialog.title');\n const cancelText = t('confirmDeleteDialog.cancel');\n const deleteText = t('confirmDeleteDialog.delete');\n\n return (\n <Dialog open={isOpen} onClose={onCancel}>\n <DialogTitle>{dialogTitle}</DialogTitle>\n <DialogActions>\n <Button onClick={onCancel}>{cancelText}</Button>\n\n <Button\n disabled={permissions.delete.loading || !permissions.delete.allowed}\n onClick={onConfirm}\n color=\"secondary\"\n >\n {deleteText}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":";;;;AA2Ba,MAAA,YAAA,GAAe,CAAC,KAA6B,KAAA;AACxD,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAW,EAAA,QAAA,EAAa,GAAA,KAAA;AAExC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAC1C,EAAA,MAAM,cAAc,2BAA4B,EAAA;AAEhD,EAAM,MAAA,WAAA,GAAc,EAAE,2BAA2B,CAAA;AACjD,EAAM,MAAA,UAAA,GAAa,EAAE,4BAA4B,CAAA;AACjD,EAAM,MAAA,UAAA,GAAa,EAAE,4BAA4B,CAAA;AAEjD,EAAA,uBACG,IAAA,CAAA,MAAA,EAAA,EAAO,IAAM,EAAA,MAAA,EAAQ,SAAS,QAC7B,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,eAAa,QAAY,EAAA,WAAA,EAAA,CAAA;AAAA,yBACzB,aACC,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,MAAA,EAAA,EAAO,OAAS,EAAA,QAAA,EAAW,QAAW,EAAA,UAAA,EAAA,CAAA;AAAA,sBAEvC,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,UAAU,WAAY,CAAA,MAAA,CAAO,OAAW,IAAA,CAAC,YAAY,MAAO,CAAA,OAAA;AAAA,UAC5D,OAAS,EAAA,SAAA;AAAA,UACT,KAAM,EAAA,WAAA;AAAA,UAEL,QAAA,EAAA;AAAA;AAAA;AACH,KACF,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { useState, useCallback } from 'react';
|
|
2
2
|
|
|
3
|
-
function
|
|
3
|
+
function useDeleteDialogState() {
|
|
4
4
|
const [state, setState] = useState({ open: false });
|
|
5
5
|
const setOpen = useCallback(
|
|
6
|
-
(
|
|
6
|
+
(item) => {
|
|
7
7
|
setState({
|
|
8
8
|
open: true,
|
|
9
|
-
|
|
9
|
+
item
|
|
10
10
|
});
|
|
11
11
|
},
|
|
12
12
|
[setState]
|
|
@@ -14,16 +14,16 @@ function useDeleteTagDialogState() {
|
|
|
14
14
|
const setClosed = useCallback(() => {
|
|
15
15
|
setState({
|
|
16
16
|
open: false,
|
|
17
|
-
|
|
17
|
+
item: void 0
|
|
18
18
|
});
|
|
19
19
|
}, [setState]);
|
|
20
20
|
return {
|
|
21
21
|
open: setOpen,
|
|
22
22
|
close: setClosed,
|
|
23
|
-
|
|
23
|
+
item: state.item,
|
|
24
24
|
isOpen: state.open
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
export {
|
|
29
|
-
//# sourceMappingURL=
|
|
28
|
+
export { useDeleteDialogState };
|
|
29
|
+
//# sourceMappingURL=useDeleteDialogState.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDeleteDialogState.esm.js","sources":["../../../../src/components/Admin/DeleteDialog/useDeleteDialogState.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 { useCallback, useState } from 'react';\n\ntype DeleteDialogState<T> = {\n open: (item: T) => void;\n close: () => void;\n isOpen: boolean;\n item?: T;\n};\n\nexport function useDeleteDialogState<T>(): DeleteDialogState<T> {\n const [state, setState] = useState<{\n open: boolean;\n item?: T;\n }>({ open: false });\n\n const setOpen = useCallback(\n (item: T) => {\n setState({\n open: true,\n item,\n });\n },\n [setState],\n );\n\n const setClosed = useCallback(() => {\n setState({\n open: false,\n item: undefined,\n });\n }, [setState]);\n\n return {\n open: setOpen,\n close: setClosed,\n item: state.item,\n isOpen: state.open,\n };\n}\n"],"names":[],"mappings":";;AAwBO,SAAS,oBAAgD,GAAA;AAC9D,EAAM,MAAA,CAAC,OAAO,QAAQ,CAAA,GAAI,SAGvB,EAAE,IAAA,EAAM,OAAO,CAAA;AAElB,EAAA,MAAM,OAAU,GAAA,WAAA;AAAA,IACd,CAAC,IAAY,KAAA;AACX,MAAS,QAAA,CAAA;AAAA,QACP,IAAM,EAAA,IAAA;AAAA,QACN;AAAA,OACD,CAAA;AAAA,KACH;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAM,MAAA,SAAA,GAAY,YAAY,MAAM;AAClC,IAAS,QAAA,CAAA;AAAA,MACP,IAAM,EAAA,KAAA;AAAA,MACN,IAAM,EAAA,KAAA;AAAA,KACP,CAAA;AAAA,GACH,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAO,OAAA;AAAA,IACL,IAAM,EAAA,OAAA;AAAA,IACN,KAAO,EAAA,SAAA;AAAA,IACP,MAAM,KAAM,CAAA,IAAA;AAAA,IACZ,QAAQ,KAAM,CAAA;AAAA,GAChB;AACF;;;;"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { useState } from 'react';
|
|
3
3
|
import { Progress, ErrorPanel, Table } from '@backstage/core-components';
|
|
4
|
-
import { useTags, announcementsApiRef, useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';
|
|
5
|
-
import { announcementCreatePermission
|
|
4
|
+
import { useTags, announcementsApiRef, useAnnouncementsTranslation, useAnnouncementsPermissions } from '@backstage-community/plugin-announcements-react';
|
|
5
|
+
import { announcementCreatePermission } from '@backstage-community/plugin-announcements-common';
|
|
6
6
|
import { useApi, alertApiRef } from '@backstage/core-plugin-api';
|
|
7
|
-
import {
|
|
7
|
+
import { RequirePermission } from '@backstage/plugin-permission-react';
|
|
8
8
|
import { Typography, IconButton, Grid, Button } from '@material-ui/core';
|
|
9
9
|
import DeleteIcon from '@material-ui/icons/Delete';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
10
|
+
import { useDeleteDialogState } from '../DeleteDialog/useDeleteDialogState.esm.js';
|
|
11
|
+
import { DeleteDialog } from '../DeleteDialog/DeleteDialog.esm.js';
|
|
12
12
|
import { TagsForm } from './TagsForm.esm.js';
|
|
13
13
|
|
|
14
14
|
const TagsContent = () => {
|
|
@@ -21,14 +21,9 @@ const TagsContent = () => {
|
|
|
21
21
|
isOpen: isDeleteDialogOpen,
|
|
22
22
|
open: openDeleteDialog,
|
|
23
23
|
close: closeDeleteDialog,
|
|
24
|
-
|
|
25
|
-
} =
|
|
26
|
-
const
|
|
27
|
-
permission: announcementCreatePermission
|
|
28
|
-
});
|
|
29
|
-
const { loading: loadingDeletePermission, allowed: canDeleteAnnouncement } = usePermission({
|
|
30
|
-
permission: announcementDeletePermission
|
|
31
|
-
});
|
|
24
|
+
item: tagToDelete
|
|
25
|
+
} = useDeleteDialogState();
|
|
26
|
+
const permissions = useAnnouncementsPermissions();
|
|
32
27
|
const onSubmit = async (request) => {
|
|
33
28
|
const { title } = request;
|
|
34
29
|
try {
|
|
@@ -102,7 +97,7 @@ const TagsContent = () => {
|
|
|
102
97
|
IconButton,
|
|
103
98
|
{
|
|
104
99
|
"aria-label": "delete",
|
|
105
|
-
disabled:
|
|
100
|
+
disabled: permissions.delete.loading || !permissions.delete.allowed,
|
|
106
101
|
onClick: () => openDeleteDialog(rowData),
|
|
107
102
|
children: /* @__PURE__ */ jsx(DeleteIcon, { fontSize: "small", "data-testid": "delete-icon" })
|
|
108
103
|
}
|
|
@@ -114,7 +109,7 @@ const TagsContent = () => {
|
|
|
114
109
|
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
|
|
115
110
|
Button,
|
|
116
111
|
{
|
|
117
|
-
disabled:
|
|
112
|
+
disabled: permissions.create.loading || !permissions.create.allowed,
|
|
118
113
|
variant: "contained",
|
|
119
114
|
onClick: () => onCreateButtonClick(),
|
|
120
115
|
children: showNewTagForm ? t("admin.tagsContent.cancelButton") : t("admin.tagsContent.createButton")
|
|
@@ -132,9 +127,9 @@ const TagsContent = () => {
|
|
|
132
127
|
}
|
|
133
128
|
) }),
|
|
134
129
|
/* @__PURE__ */ jsx(
|
|
135
|
-
|
|
130
|
+
DeleteDialog,
|
|
136
131
|
{
|
|
137
|
-
|
|
132
|
+
isOpen: isDeleteDialogOpen,
|
|
138
133
|
onCancel: onCancelDelete,
|
|
139
134
|
onConfirm: onConfirmDelete
|
|
140
135
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TagsContent.esm.js","sources":["../../../../src/components/Admin/TagsContent/TagsContent.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 { useState } from 'react';\nimport {\n ErrorPanel,\n Progress,\n Table,\n TableColumn,\n} from '@backstage/core-components';\nimport {\n CreateTagRequest,\n announcementsApiRef,\n useAnnouncementsTranslation,\n useTags,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n announcementCreatePermission,\n announcementDeletePermission,\n Tag,\n} from '@backstage-community/plugin-announcements-common';\nimport { useApi, alertApiRef } from '@backstage/core-plugin-api';\nimport {\n RequirePermission,\n usePermission,\n} from '@backstage/plugin-permission-react';\nimport { ResponseError } from '@backstage/errors';\nimport { Button, Grid, IconButton, Typography } from '@material-ui/core';\nimport DeleteIcon from '@material-ui/icons/Delete';\n\nimport { useDeleteTagDialogState } from './useDeleteTagDialogState';\nimport { DeleteTagDialog } from './DeleteTagDialog';\nimport { TagsForm } from './TagsForm';\n\nexport const TagsContent = () => {\n const [showNewTagForm, setShowNewTagForm] = useState(false);\n const { tags, loading, error, retry: refresh } = useTags();\n const announcementsApi = useApi(announcementsApiRef);\n const alertApi = useApi(alertApiRef);\n const { t } = useAnnouncementsTranslation();\n\n const {\n isOpen: isDeleteDialogOpen,\n open: openDeleteDialog,\n close: closeDeleteDialog,\n tag: tagToDelete,\n } = useDeleteTagDialogState();\n\n const { loading: loadingCreatePermission, allowed: canCreateTag } =\n usePermission({\n permission: announcementCreatePermission,\n });\n\n const { loading: loadingDeletePermission, allowed: canDeleteAnnouncement } =\n usePermission({\n permission: announcementDeletePermission,\n });\n\n const onSubmit = 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 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({\n message: (err as Error).message,\n severity: 'error',\n });\n }\n }\n };\n\n const onCreateButtonClick = () => {\n setShowNewTagForm(!showNewTagForm);\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 if (loading) {\n return <Progress />;\n }\n if (error) {\n return <ErrorPanel error={error} />;\n }\n\n const columns: TableColumn<Tag>[] = [\n {\n title: <Typography>{t('admin.tagsContent.table.title')}</Typography>,\n sorting: true,\n field: 'title',\n render: rowData => rowData.title,\n },\n {\n title: <Typography>{t('admin.tagsContent.table.slug')}</Typography>,\n sorting: true,\n field: 'slug',\n render: rowData => rowData.slug,\n },\n {\n title: <Typography>{t('admin.tagsContent.table.actions')}</Typography>,\n render: rowData => {\n return (\n <IconButton\n aria-label=\"delete\"\n disabled={loadingDeletePermission || !canDeleteAnnouncement}\n onClick={() => openDeleteDialog(rowData)}\n >\n <DeleteIcon fontSize=\"small\" data-testid=\"delete-icon\" />\n </IconButton>\n );\n },\n },\n ];\n\n return (\n <RequirePermission permission={announcementCreatePermission}>\n <Grid container>\n <Grid item xs={12}>\n <Button\n disabled={loadingCreatePermission || !canCreateTag}\n variant=\"contained\"\n onClick={() => onCreateButtonClick()}\n >\n {showNewTagForm\n ? t('admin.tagsContent.cancelButton')\n : t('admin.tagsContent.createButton')}\n </Button>\n </Grid>\n\n {showNewTagForm && (\n <Grid item xs={12}>\n <TagsForm initialData={{} as Tag} onSubmit={onSubmit} />\n </Grid>\n )}\n\n <Grid item xs={12}>\n <Table\n title=\"Tags\"\n options={{ pageSize: 20, search: true }}\n columns={columns}\n data={tags ?? []}\n emptyContent={\n <Typography style={{ padding: 2, textAlign: 'center' }}>\n {t('admin.tagsContent.table.noTagsFound')}\n </Typography>\n }\n />\n </Grid>\n\n <DeleteTagDialog\n open={isDeleteDialogOpen}\n onCancel={onCancelDelete}\n onConfirm={onConfirmDelete}\n />\n </Grid>\n </RequirePermission>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TagsContent.esm.js","sources":["../../../../src/components/Admin/TagsContent/TagsContent.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 { useState } from 'react';\nimport {\n ErrorPanel,\n Progress,\n Table,\n TableColumn,\n} from '@backstage/core-components';\nimport {\n CreateTagRequest,\n announcementsApiRef,\n useAnnouncementsTranslation,\n useTags,\n useAnnouncementsPermissions,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n announcementCreatePermission,\n Tag,\n} from '@backstage-community/plugin-announcements-common';\nimport { useApi, alertApiRef } from '@backstage/core-plugin-api';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { ResponseError } from '@backstage/errors';\nimport { Button, Grid, IconButton, Typography } from '@material-ui/core';\nimport DeleteIcon from '@material-ui/icons/Delete';\n\nimport { useDeleteDialogState, DeleteDialog } from '../DeleteDialog';\nimport { TagsForm } from './TagsForm';\n\nexport const TagsContent = () => {\n const [showNewTagForm, setShowNewTagForm] = useState(false);\n const { tags, loading, error, retry: refresh } = useTags();\n const announcementsApi = useApi(announcementsApiRef);\n const alertApi = useApi(alertApiRef);\n const { t } = useAnnouncementsTranslation();\n\n const {\n isOpen: isDeleteDialogOpen,\n open: openDeleteDialog,\n close: closeDeleteDialog,\n item: tagToDelete,\n } = useDeleteDialogState<Tag>();\n\n const permissions = useAnnouncementsPermissions();\n\n const onSubmit = 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 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({\n message: (err as Error).message,\n severity: 'error',\n });\n }\n }\n };\n\n const onCreateButtonClick = () => {\n setShowNewTagForm(!showNewTagForm);\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 if (loading) {\n return <Progress />;\n }\n if (error) {\n return <ErrorPanel error={error} />;\n }\n\n const columns: TableColumn<Tag>[] = [\n {\n title: <Typography>{t('admin.tagsContent.table.title')}</Typography>,\n sorting: true,\n field: 'title',\n render: rowData => rowData.title,\n },\n {\n title: <Typography>{t('admin.tagsContent.table.slug')}</Typography>,\n sorting: true,\n field: 'slug',\n render: rowData => rowData.slug,\n },\n {\n title: <Typography>{t('admin.tagsContent.table.actions')}</Typography>,\n render: rowData => {\n return (\n <IconButton\n aria-label=\"delete\"\n disabled={permissions.delete.loading || !permissions.delete.allowed}\n onClick={() => openDeleteDialog(rowData)}\n >\n <DeleteIcon fontSize=\"small\" data-testid=\"delete-icon\" />\n </IconButton>\n );\n },\n },\n ];\n\n return (\n <RequirePermission permission={announcementCreatePermission}>\n <Grid container>\n <Grid item xs={12}>\n <Button\n disabled={permissions.create.loading || !permissions.create.allowed}\n variant=\"contained\"\n onClick={() => onCreateButtonClick()}\n >\n {showNewTagForm\n ? t('admin.tagsContent.cancelButton')\n : t('admin.tagsContent.createButton')}\n </Button>\n </Grid>\n\n {showNewTagForm && (\n <Grid item xs={12}>\n <TagsForm initialData={{} as Tag} onSubmit={onSubmit} />\n </Grid>\n )}\n\n <Grid item xs={12}>\n <Table\n title=\"Tags\"\n options={{ pageSize: 20, search: true }}\n columns={columns}\n data={tags ?? []}\n emptyContent={\n <Typography style={{ padding: 2, textAlign: 'center' }}>\n {t('admin.tagsContent.table.noTagsFound')}\n </Typography>\n }\n />\n </Grid>\n\n <DeleteDialog\n isOpen={isDeleteDialogOpen}\n onCancel={onCancelDelete}\n onConfirm={onConfirmDelete}\n />\n </Grid>\n </RequirePermission>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { useState } from 'react';
|
|
3
3
|
import { InfoCard } from '@backstage/core-components';
|
|
4
|
-
import { useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';
|
|
5
|
-
import { announcementCreatePermission } from '@backstage-community/plugin-announcements-common';
|
|
6
|
-
import { usePermission } from '@backstage/plugin-permission-react';
|
|
4
|
+
import { useAnnouncementsTranslation, useAnnouncementsPermissions } from '@backstage-community/plugin-announcements-react';
|
|
7
5
|
import { makeStyles, TextField, Button } from '@material-ui/core';
|
|
8
6
|
|
|
9
7
|
const useStyles = makeStyles((theme) => {
|
|
@@ -23,9 +21,7 @@ const TagsForm = ({
|
|
|
23
21
|
const [form, setForm] = useState(initialData);
|
|
24
22
|
const [loading, setLoading] = useState(false);
|
|
25
23
|
const { t } = useAnnouncementsTranslation();
|
|
26
|
-
const
|
|
27
|
-
permission: announcementCreatePermission
|
|
28
|
-
});
|
|
24
|
+
const permissions = useAnnouncementsPermissions();
|
|
29
25
|
const handleChange = (event) => {
|
|
30
26
|
setForm({
|
|
31
27
|
...form,
|
|
@@ -69,7 +65,7 @@ const TagsForm = ({
|
|
|
69
65
|
variant: "contained",
|
|
70
66
|
color: "primary",
|
|
71
67
|
type: "submit",
|
|
72
|
-
disabled: loading || !form.title ||
|
|
68
|
+
disabled: loading || !form.title || permissions.create.loading || !permissions.create.allowed,
|
|
73
69
|
"data-testid": "tag-submit-button",
|
|
74
70
|
children: t("tagsForm.submit")
|
|
75
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TagsForm.esm.js","sources":["../../../../src/components/Admin/TagsContent/TagsForm.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 { useState, type ChangeEvent, type FormEvent } from 'react';\nimport { InfoCard } from '@backstage/core-components';\nimport {\n CreateTagRequest,\n useAnnouncementsTranslation,\n} from '@backstage-community/plugin-announcements-react';\nimport {
|
|
1
|
+
{"version":3,"file":"TagsForm.esm.js","sources":["../../../../src/components/Admin/TagsContent/TagsForm.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 { useState, type ChangeEvent, type FormEvent } from 'react';\nimport { InfoCard } from '@backstage/core-components';\nimport {\n CreateTagRequest,\n useAnnouncementsTranslation,\n useAnnouncementsPermissions,\n} from '@backstage-community/plugin-announcements-react';\nimport { Tag } from '@backstage-community/plugin-announcements-common';\nimport { Button, makeStyles, TextField } from '@material-ui/core';\n\nconst useStyles = makeStyles(theme => {\n return {\n formRoot: {\n '& > *': {\n margin: theme?.spacing?.(1) ?? '8px',\n },\n },\n };\n});\n\nexport type TagsFormProps = {\n initialData: Tag;\n onSubmit: (data: CreateTagRequest) => Promise<void>;\n};\n\nexport const TagsForm = ({\n initialData = { title: '', slug: '' },\n onSubmit,\n}: TagsFormProps) => {\n const classes = useStyles();\n const [form, setForm] = useState(initialData);\n const [loading, setLoading] = useState(false);\n const { t } = useAnnouncementsTranslation();\n const permissions = useAnnouncementsPermissions();\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n setForm({\n ...form,\n [event.target.id]: event.target.value,\n });\n };\n\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n setLoading(true);\n event.preventDefault();\n\n await onSubmit(form);\n setLoading(false);\n };\n\n return (\n <InfoCard\n title={initialData.title ? t('tagsForm.editTag') : t('tagsForm.newTag')}\n >\n <form\n className={classes.formRoot}\n onSubmit={handleSubmit}\n data-testid=\"tag-form\"\n >\n <TextField\n id=\"title\"\n type=\"text\"\n label={t('tagsForm.titleLabel')}\n value={form.title || ''}\n onChange={handleChange}\n variant=\"outlined\"\n fullWidth\n required\n inputProps={{ 'data-testid': 'tag-title-input' }}\n />\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"submit\"\n disabled={\n loading ||\n !form.title ||\n permissions.create.loading ||\n !permissions.create.allowed\n }\n data-testid=\"tag-submit-button\"\n >\n {t('tagsForm.submit')}\n </Button>\n </form>\n </InfoCard>\n );\n};\n"],"names":[],"mappings":";;;;;;AAyBA,MAAM,SAAA,GAAY,WAAW,CAAS,KAAA,KAAA;AACpC,EAAO,OAAA;AAAA,IACL,QAAU,EAAA;AAAA,MACR,OAAS,EAAA;AAAA,QACP,MAAQ,EAAA,KAAA,EAAO,OAAU,GAAA,CAAC,CAAK,IAAA;AAAA;AACjC;AACF,GACF;AACF,CAAC,CAAA;AAOM,MAAM,WAAW,CAAC;AAAA,EACvB,WAAc,GAAA,EAAE,KAAO,EAAA,EAAA,EAAI,MAAM,EAAG,EAAA;AAAA,EACpC;AACF,CAAqB,KAAA;AACnB,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,WAAW,CAAA;AAC5C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAC1C,EAAA,MAAM,cAAc,2BAA4B,EAAA;AAEhD,EAAM,MAAA,YAAA,GAAe,CAAC,KAAyC,KAAA;AAC7D,IAAQ,OAAA,CAAA;AAAA,MACN,GAAG,IAAA;AAAA,MACH,CAAC,KAAM,CAAA,MAAA,CAAO,EAAE,GAAG,MAAM,MAAO,CAAA;AAAA,KACjC,CAAA;AAAA,GACH;AAEA,EAAM,MAAA,YAAA,GAAe,OAAO,KAAsC,KAAA;AAChE,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,KAAA,CAAM,cAAe,EAAA;AAErB,IAAA,MAAM,SAAS,IAAI,CAAA;AACnB,IAAA,UAAA,CAAW,KAAK,CAAA;AAAA,GAClB;AAEA,EACE,uBAAA,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAO,WAAY,CAAA,KAAA,GAAQ,EAAE,kBAAkB,CAAA,GAAI,EAAE,iBAAiB,CAAA;AAAA,MAEtE,QAAA,kBAAA,IAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,WAAW,OAAQ,CAAA,QAAA;AAAA,UACnB,QAAU,EAAA,YAAA;AAAA,UACV,aAAY,EAAA,UAAA;AAAA,UAEZ,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,SAAA;AAAA,cAAA;AAAA,gBACC,EAAG,EAAA,OAAA;AAAA,gBACH,IAAK,EAAA,MAAA;AAAA,gBACL,KAAA,EAAO,EAAE,qBAAqB,CAAA;AAAA,gBAC9B,KAAA,EAAO,KAAK,KAAS,IAAA,EAAA;AAAA,gBACrB,QAAU,EAAA,YAAA;AAAA,gBACV,OAAQ,EAAA,UAAA;AAAA,gBACR,SAAS,EAAA,IAAA;AAAA,gBACT,QAAQ,EAAA,IAAA;AAAA,gBACR,UAAA,EAAY,EAAE,aAAA,EAAe,iBAAkB;AAAA;AAAA,aACjD;AAAA,4BACA,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,OAAQ,EAAA,WAAA;AAAA,gBACR,KAAM,EAAA,SAAA;AAAA,gBACN,IAAK,EAAA,QAAA;AAAA,gBACL,QAAA,EACE,OACA,IAAA,CAAC,IAAK,CAAA,KAAA,IACN,YAAY,MAAO,CAAA,OAAA,IACnB,CAAC,WAAA,CAAY,MAAO,CAAA,OAAA;AAAA,gBAEtB,aAAY,EAAA,mBAAA;AAAA,gBAEX,YAAE,iBAAiB;AAAA;AAAA;AACtB;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { DateTime } from 'luxon';
|
|
3
|
-
import { usePermission } from '@backstage/plugin-permission-react';
|
|
4
3
|
import { Progress, InfoCard, Link } from '@backstage/core-components';
|
|
5
4
|
import { useApi, useRouteRef, useAnalytics } from '@backstage/core-plugin-api';
|
|
6
|
-
import { announcementEntityPermissions } from '@backstage-community/plugin-announcements-common';
|
|
7
5
|
import { rootRouteRef, announcementViewRouteRef, announcementAdminRouteRef } from '../../routes.esm.js';
|
|
8
6
|
import { formatAnnouncementStartTime } from '../utils/announcementDateUtils.esm.js';
|
|
9
|
-
import { announcementsApiRef, useAnnouncementsTranslation, useAnnouncements } from '@backstage-community/plugin-announcements-react';
|
|
7
|
+
import { announcementsApiRef, useAnnouncementsTranslation, useAnnouncements, useAnnouncementsPermissions } from '@backstage-community/plugin-announcements-react';
|
|
10
8
|
import { makeStyles, List, ListItem, ListItemIcon, ListItemText, Box, Typography, Chip } from '@material-ui/core';
|
|
11
9
|
import { Alert } from '@material-ui/lab';
|
|
12
10
|
import NewReleasesIcon from '@material-ui/icons/NewReleases';
|
|
@@ -47,10 +45,7 @@ const AnnouncementsCard = ({
|
|
|
47
45
|
order,
|
|
48
46
|
current
|
|
49
47
|
});
|
|
50
|
-
const
|
|
51
|
-
const { loading: loadingPermission, allowed: canAdd } = usePermission({
|
|
52
|
-
permission: announcementCreatePermission
|
|
53
|
-
});
|
|
48
|
+
const permissions = useAnnouncementsPermissions();
|
|
54
49
|
if (loading) {
|
|
55
50
|
return /* @__PURE__ */ jsx(Progress, {});
|
|
56
51
|
} else if (error) {
|
|
@@ -137,7 +132,7 @@ const AnnouncementsCard = ({
|
|
|
137
132
|
),
|
|
138
133
|
" "
|
|
139
134
|
] }, announcement.id)),
|
|
140
|
-
announcements.count === 0 && !
|
|
135
|
+
announcements.count === 0 && !permissions.create.loading && permissions.create.allowed && /* @__PURE__ */ jsx(ListItem, { children: /* @__PURE__ */ jsxs(ListItemText, { children: [
|
|
141
136
|
`${t("announcementsCard.noAnnouncements")} `,
|
|
142
137
|
/* @__PURE__ */ jsx(Link, { to: announcementAdminLink(), variant: "inherit", children: t("announcementsCard.addOne") }),
|
|
143
138
|
"?"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnnouncementsCard.esm.js","sources":["../../../src/components/AnnouncementsCard/AnnouncementsCard.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 { DateTime } from 'luxon';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n InfoCard,\n InfoCardVariants,\n Link,\n Progress,\n} from '@backstage/core-components';\nimport { useApi, useRouteRef, useAnalytics } from '@backstage/core-plugin-api';\nimport { announcementEntityPermissions } from '@backstage-community/plugin-announcements-common';\nimport {\n announcementAdminRouteRef,\n announcementViewRouteRef,\n rootRouteRef,\n} from '../../routes';\nimport { formatAnnouncementStartTime } from '../utils/announcementDateUtils';\nimport {\n announcementsApiRef,\n useAnnouncements,\n useAnnouncementsTranslation,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n makeStyles,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Typography,\n Box,\n Chip,\n} from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport NewReleasesIcon from '@material-ui/icons/NewReleases';\n\nconst useStyles = makeStyles({\n newAnnouncementIcon: {\n minWidth: '36px',\n },\n chipStyle: {\n marginRight: 4,\n marginBottom: 4,\n },\n});\n\ntype AnnouncementsCardOpts = {\n title?: string;\n max?: number;\n category?: string;\n active?: boolean;\n variant?: InfoCardVariants;\n sortBy?: 'created_at' | 'start_at';\n order?: 'asc' | 'desc';\n current?: boolean;\n hideStartAt?: boolean;\n};\n\nexport const AnnouncementsCard = ({\n title,\n max,\n category,\n active,\n variant = 'gridItem',\n sortBy,\n order,\n current,\n hideStartAt,\n}: AnnouncementsCardOpts) => {\n const classes = useStyles();\n const announcementsApi = useApi(announcementsApiRef);\n const announcementsLink = useRouteRef(rootRouteRef);\n const viewAnnouncementLink = useRouteRef(announcementViewRouteRef);\n const announcementAdminLink = useRouteRef(announcementAdminRouteRef);\n const lastSeen = announcementsApi.lastSeenDate();\n const analytics = useAnalytics();\n const { t } = useAnnouncementsTranslation();\n\n const { announcements, loading, error } = useAnnouncements({\n max: max || 5,\n category,\n active,\n sortBy,\n order,\n current,\n });\n\n const { announcementCreatePermission } = announcementEntityPermissions;\n const { loading: loadingPermission, allowed: canAdd } = usePermission({\n permission: announcementCreatePermission,\n });\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n }\n\n const deepLink = {\n link: announcementsLink(),\n title: t('announcementsCard.seeAll'),\n };\n\n return (\n <InfoCard\n title={title || t('announcementsCard.announcements')}\n variant={variant}\n deepLink={deepLink}\n >\n <List dense>\n {announcements.results.map(announcement => (\n <ListItem key={announcement.id}>\n <ListItemIcon\n className={classes.newAnnouncementIcon}\n style={{\n visibility:\n lastSeen < DateTime.fromISO(announcement.created_at)\n ? 'visible'\n : 'hidden',\n }}\n title={t('announcementsCard.new')}\n >\n <NewReleasesIcon />\n </ListItemIcon>\n <ListItemText\n primary={\n <Link\n to={viewAnnouncementLink({ id: announcement.id })}\n variant=\"inherit\"\n onClick={() =>\n analytics.captureEvent('click', announcement.title, {\n attributes: {\n announcementId: announcement.id,\n location: 'AnnouncementsCard',\n },\n })\n }\n >\n {announcement.title}\n </Link>\n }\n secondary={\n <Box>\n <Typography variant=\"body2\" color=\"textSecondary\">\n {DateTime.fromISO(announcement.created_at).toRelative()}\n {announcement.category && (\n <>\n {` ${t('announcementsCard.in')} `}\n <Link\n to={`${announcementsLink()}?category=${\n announcement.category.slug\n }`}\n variant=\"inherit\"\n >\n {announcement.category.title}\n </Link>\n </>\n )}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n {announcement.excerpt}\n {announcement.tags && announcement.tags.length > 0 && (\n <Box mt={1}>\n {announcement.tags.map(tag => (\n <Chip\n key={tag.slug}\n size=\"small\"\n label={tag.title}\n component={Link}\n to={`${announcementsLink()}?tags=${tag.slug}`}\n clickable\n className={classes.chipStyle}\n />\n ))}\n </Box>\n )}\n </Typography>\n {!hideStartAt && (\n <Typography variant=\"caption\" color=\"textSecondary\">\n {formatAnnouncementStartTime(\n announcement.start_at,\n t('announcementsCard.occurred'),\n t('announcementsCard.scheduled'),\n t('announcementsCard.today'),\n )}\n </Typography>\n )}\n </Box>\n }\n />{' '}\n </ListItem>\n ))}\n {announcements.count === 0 && !loadingPermission && canAdd && (\n <ListItem>\n <ListItemText>\n {`${t('announcementsCard.noAnnouncements')} `}\n <Link to={announcementAdminLink()} variant=\"inherit\">\n {t('announcementsCard.addOne')}\n </Link>\n ?\n </ListItemText>\n </ListItem>\n )}\n </List>\n </InfoCard>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AnnouncementsCard.esm.js","sources":["../../../src/components/AnnouncementsCard/AnnouncementsCard.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 { DateTime } from 'luxon';\nimport {\n InfoCard,\n InfoCardVariants,\n Link,\n Progress,\n} from '@backstage/core-components';\nimport { useApi, useRouteRef, useAnalytics } from '@backstage/core-plugin-api';\nimport {\n announcementAdminRouteRef,\n announcementViewRouteRef,\n rootRouteRef,\n} from '../../routes';\nimport { formatAnnouncementStartTime } from '../utils/announcementDateUtils';\nimport {\n announcementsApiRef,\n useAnnouncements,\n useAnnouncementsTranslation,\n useAnnouncementsPermissions,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n makeStyles,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Typography,\n Box,\n Chip,\n} from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport NewReleasesIcon from '@material-ui/icons/NewReleases';\n\nconst useStyles = makeStyles({\n newAnnouncementIcon: {\n minWidth: '36px',\n },\n chipStyle: {\n marginRight: 4,\n marginBottom: 4,\n },\n});\n\ntype AnnouncementsCardOpts = {\n title?: string;\n max?: number;\n category?: string;\n active?: boolean;\n variant?: InfoCardVariants;\n sortBy?: 'created_at' | 'start_at';\n order?: 'asc' | 'desc';\n current?: boolean;\n hideStartAt?: boolean;\n};\n\nexport const AnnouncementsCard = ({\n title,\n max,\n category,\n active,\n variant = 'gridItem',\n sortBy,\n order,\n current,\n hideStartAt,\n}: AnnouncementsCardOpts) => {\n const classes = useStyles();\n const announcementsApi = useApi(announcementsApiRef);\n const announcementsLink = useRouteRef(rootRouteRef);\n const viewAnnouncementLink = useRouteRef(announcementViewRouteRef);\n const announcementAdminLink = useRouteRef(announcementAdminRouteRef);\n const lastSeen = announcementsApi.lastSeenDate();\n const analytics = useAnalytics();\n const { t } = useAnnouncementsTranslation();\n\n const { announcements, loading, error } = useAnnouncements({\n max: max || 5,\n category,\n active,\n sortBy,\n order,\n current,\n });\n\n const permissions = useAnnouncementsPermissions();\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n }\n\n const deepLink = {\n link: announcementsLink(),\n title: t('announcementsCard.seeAll'),\n };\n\n return (\n <InfoCard\n title={title || t('announcementsCard.announcements')}\n variant={variant}\n deepLink={deepLink}\n >\n <List dense>\n {announcements.results.map(announcement => (\n <ListItem key={announcement.id}>\n <ListItemIcon\n className={classes.newAnnouncementIcon}\n style={{\n visibility:\n lastSeen < DateTime.fromISO(announcement.created_at)\n ? 'visible'\n : 'hidden',\n }}\n title={t('announcementsCard.new')}\n >\n <NewReleasesIcon />\n </ListItemIcon>\n <ListItemText\n primary={\n <Link\n to={viewAnnouncementLink({ id: announcement.id })}\n variant=\"inherit\"\n onClick={() =>\n analytics.captureEvent('click', announcement.title, {\n attributes: {\n announcementId: announcement.id,\n location: 'AnnouncementsCard',\n },\n })\n }\n >\n {announcement.title}\n </Link>\n }\n secondary={\n <Box>\n <Typography variant=\"body2\" color=\"textSecondary\">\n {DateTime.fromISO(announcement.created_at).toRelative()}\n {announcement.category && (\n <>\n {` ${t('announcementsCard.in')} `}\n <Link\n to={`${announcementsLink()}?category=${\n announcement.category.slug\n }`}\n variant=\"inherit\"\n >\n {announcement.category.title}\n </Link>\n </>\n )}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n {announcement.excerpt}\n {announcement.tags && announcement.tags.length > 0 && (\n <Box mt={1}>\n {announcement.tags.map(tag => (\n <Chip\n key={tag.slug}\n size=\"small\"\n label={tag.title}\n component={Link}\n to={`${announcementsLink()}?tags=${tag.slug}`}\n clickable\n className={classes.chipStyle}\n />\n ))}\n </Box>\n )}\n </Typography>\n {!hideStartAt && (\n <Typography variant=\"caption\" color=\"textSecondary\">\n {formatAnnouncementStartTime(\n announcement.start_at,\n t('announcementsCard.occurred'),\n t('announcementsCard.scheduled'),\n t('announcementsCard.today'),\n )}\n </Typography>\n )}\n </Box>\n }\n />{' '}\n </ListItem>\n ))}\n {announcements.count === 0 &&\n !permissions.create.loading &&\n permissions.create.allowed && (\n <ListItem>\n <ListItemText>\n {`${t('announcementsCard.noAnnouncements')} `}\n <Link to={announcementAdminLink()} variant=\"inherit\">\n {t('announcementsCard.addOne')}\n </Link>\n ?\n </ListItemText>\n </ListItem>\n )}\n </List>\n </InfoCard>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { useState, useMemo } from 'react';
|
|
3
3
|
import { useLocation } from 'react-router-dom';
|
|
4
|
-
import { usePermission } from '@backstage/plugin-permission-react';
|
|
5
|
-
import { announcementCreatePermission } from '@backstage-community/plugin-announcements-common';
|
|
6
4
|
import { DateTime } from 'luxon';
|
|
7
5
|
import { Page, Header, Content, Progress, ItemCardGrid, Link } from '@backstage/core-components';
|
|
8
6
|
import { useRouteRef } from '@backstage/core-plugin-api';
|
|
9
7
|
import { EntityRefLink } from '@backstage/plugin-catalog-react';
|
|
10
|
-
import { useAnnouncements, useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';
|
|
8
|
+
import { useAnnouncementsPermissions, useAnnouncements, useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';
|
|
11
9
|
import { makeStyles, Tooltip, Typography, Box, Chip, Card, CardHeader, CardContent } from '@material-ui/core';
|
|
12
10
|
import { Alert, Pagination } from '@material-ui/lab';
|
|
13
11
|
import { rootRouteRef, announcementViewRouteRef } from '../../routes.esm.js';
|
|
@@ -163,7 +161,7 @@ const AnnouncementsGrid = ({
|
|
|
163
161
|
const AnnouncementsPage = (props) => {
|
|
164
162
|
const location = useLocation();
|
|
165
163
|
const queryParams = new URLSearchParams(location.search);
|
|
166
|
-
const
|
|
164
|
+
const permissions = useAnnouncementsPermissions();
|
|
167
165
|
const {
|
|
168
166
|
hideContextMenu,
|
|
169
167
|
hideInactive,
|
|
@@ -178,7 +176,7 @@ const AnnouncementsPage = (props) => {
|
|
|
178
176
|
order
|
|
179
177
|
} = props;
|
|
180
178
|
return /* @__PURE__ */ jsxs(Page, { themeId, children: [
|
|
181
|
-
/* @__PURE__ */ jsx(Header, { title, subtitle, children: !hideContextMenu && !
|
|
179
|
+
/* @__PURE__ */ jsx(Header, { title, subtitle, children: !hideContextMenu && !permissions.create.loading && permissions.create.allowed && /* @__PURE__ */ jsx(ContextMenu, {}) }),
|
|
182
180
|
/* @__PURE__ */ jsx(Content, { children: /* @__PURE__ */ jsx(
|
|
183
181
|
AnnouncementsGrid,
|
|
184
182
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnnouncementsPage.esm.js","sources":["../../../src/components/AnnouncementsPage/AnnouncementsPage.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useState, ReactNode, useMemo } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n announcementCreatePermission,\n Announcement,\n} from '@backstage-community/plugin-announcements-common';\nimport { DateTime } from 'luxon';\nimport {\n Page,\n Header,\n Content,\n Link,\n ItemCardGrid,\n Progress,\n} from '@backstage/core-components';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport {\n useAnnouncements,\n useAnnouncementsTranslation,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n Box,\n Card,\n CardContent,\n CardHeader,\n Chip,\n makeStyles,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport { Alert, Pagination } from '@material-ui/lab';\n\nimport { announcementViewRouteRef, rootRouteRef } from '../../routes';\nimport { ContextMenu } from './ContextMenu';\nimport { formatAnnouncementStartTime } from '../utils/announcementDateUtils';\nimport { MarkdownRendererTypeProps } from '../MarkdownRenderer/MarkdownRenderer';\nimport { truncate } from '../utils/truncateUtils';\n\nconst useStyles = makeStyles(theme => {\n return {\n cardHeader: {\n color: theme?.palette?.text?.primary || '#000',\n },\n pagination: {\n display: 'flex',\n justifyContent: 'center',\n marginTop: theme?.spacing?.(4) || 32,\n },\n };\n});\n\nconst AnnouncementCard = ({\n announcement,\n options: { titleLength = 50 },\n hideStartAt,\n}: {\n announcement: Announcement;\n options: AnnouncementCardProps;\n hideStartAt?: boolean;\n}) => {\n const classes = useStyles();\n const announcementsLink = useRouteRef(rootRouteRef);\n const viewAnnouncementLink = useRouteRef(announcementViewRouteRef);\n const { t } = useAnnouncementsTranslation();\n\n const title = (\n <Tooltip\n title={announcement.title}\n disableFocusListener\n data-testid=\"announcement-card-title-tooltip\"\n >\n <Link\n className={classes.cardHeader}\n to={viewAnnouncementLink({ id: announcement.id })}\n >\n {truncate(announcement.title, titleLength)}\n </Link>\n </Tooltip>\n );\n const subTitle = (\n <>\n <Typography variant=\"body2\" color=\"textSecondary\" component=\"span\">\n {t('announcementsPage.card.by')}{' '}\n <EntityRefLink\n entityRef={announcement.on_behalf_of || announcement.publisher}\n hideIcon\n />\n {announcement.category && (\n <>\n {' '}\n {t('announcementsPage.card.in')}{' '}\n <Link\n to={`${announcementsLink()}?category=${\n announcement.category.slug\n }`}\n >\n {announcement.category.title}\n </Link>\n </>\n )}\n , {DateTime.fromISO(announcement.created_at).toRelative()}\n </Typography>\n <Box>\n {!hideStartAt && (\n <Typography variant=\"caption\" color=\"textSecondary\">\n {formatAnnouncementStartTime(\n announcement.start_at,\n t('announcementsCard.occurred'),\n t('announcementsCard.scheduled'),\n t('announcementsCard.today'),\n )}\n </Typography>\n )}\n </Box>\n {announcement.tags && announcement.tags.length > 0 && (\n <Typography variant=\"body2\" color=\"textSecondary\">\n <Box mt={1}>\n {announcement.tags.map(tag => (\n <Chip\n key={tag.slug}\n size=\"small\"\n label={tag.title}\n component={Link}\n to={`${announcementsLink()}?tags=${tag.slug}`}\n clickable\n style={{ marginRight: 4, marginBottom: 4 }}\n />\n ))}\n </Box>\n </Typography>\n )}\n </>\n );\n\n return (\n <Card>\n <CardHeader title={title} subheader={subTitle} />\n <CardContent>{announcement.excerpt}</CardContent>\n </Card>\n );\n};\n\nconst AnnouncementsGrid = ({\n maxPerPage,\n category,\n tags,\n cardTitleLength,\n active,\n sortBy,\n order,\n hideStartAt,\n}: {\n maxPerPage: number;\n category?: string;\n tags?: string[];\n cardTitleLength?: number;\n active?: boolean;\n sortBy?: 'created_at' | 'start_at';\n order?: 'asc' | 'desc';\n hideStartAt?: boolean;\n}) => {\n const classes = useStyles();\n const location = useLocation();\n const queryParams = new URLSearchParams(location.search);\n\n const [page, setPage] = useState(1);\n const handleChange = (_event: any, value: number) => {\n setPage(value);\n };\n\n const tagsParam = queryParams.get('tags');\n const tagsFromUrl = useMemo(() => {\n return tagsParam ? tagsParam.split(',') : undefined;\n }, [tagsParam]);\n\n const { announcements, loading, error } = useAnnouncements(\n {\n max: maxPerPage,\n page: page,\n category,\n tags: tags || tagsFromUrl,\n active,\n sortBy,\n order,\n },\n { dependencies: [maxPerPage, page, category, tagsFromUrl] },\n );\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n }\n\n return (\n <>\n <ItemCardGrid>\n {announcements.results.map(announcement => (\n <AnnouncementCard\n key={announcement.id}\n announcement={announcement}\n options={{ titleLength: cardTitleLength }}\n hideStartAt={hideStartAt}\n />\n ))}\n </ItemCardGrid>\n\n {announcements && announcements.count !== 0 && (\n <div className={classes.pagination}>\n <Pagination\n count={Math.ceil(announcements.count / maxPerPage)}\n page={page}\n onChange={handleChange}\n />\n </div>\n )}\n </>\n );\n};\n\ntype AnnouncementCardProps = {\n titleLength?: number;\n};\n\ntype AnnouncementCreateButtonProps = {\n name?: string;\n};\n\nexport type AnnouncementsPageProps = {\n themeId: string;\n title: string;\n subtitle?: ReactNode;\n maxPerPage?: number;\n category?: string;\n tags?: string[];\n buttonOptions?: AnnouncementCreateButtonProps;\n cardOptions?: AnnouncementCardProps;\n hideContextMenu?: boolean;\n hideInactive?: boolean;\n hideStartAt?: boolean;\n markdownRenderer?: MarkdownRendererTypeProps;\n sortby?: 'created_at' | 'start_at';\n order?: 'asc' | 'desc';\n};\n\nexport const AnnouncementsPage = (props: AnnouncementsPageProps) => {\n const location = useLocation();\n const queryParams = new URLSearchParams(location.search);\n const { loading: loadingCreatePermission, allowed: canCreate } =\n usePermission({ permission: announcementCreatePermission });\n\n const {\n hideContextMenu,\n hideInactive,\n hideStartAt,\n themeId,\n title,\n subtitle,\n maxPerPage,\n category,\n cardOptions,\n sortby,\n order,\n } = props;\n\n return (\n <Page themeId={themeId}>\n <Header title={title} subtitle={subtitle}>\n {!hideContextMenu && !loadingCreatePermission && canCreate && (\n <ContextMenu />\n )}\n </Header>\n\n <Content>\n <AnnouncementsGrid\n maxPerPage={maxPerPage ?? 10}\n category={category ?? queryParams.get('category') ?? undefined}\n tags={props.tags}\n cardTitleLength={cardOptions?.titleLength}\n active={!!hideInactive}\n sortBy={sortby ?? 'created_at'}\n order={order ?? 'desc'}\n hideStartAt={hideStartAt}\n />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAuDA,MAAM,SAAA,GAAY,WAAW,CAAS,KAAA,KAAA;AACpC,EAAO,OAAA;AAAA,IACL,UAAY,EAAA;AAAA,MACV,KAAO,EAAA,KAAA,EAAO,OAAS,EAAA,IAAA,EAAM,OAAW,IAAA;AAAA,KAC1C;AAAA,IACA,UAAY,EAAA;AAAA,MACV,OAAS,EAAA,MAAA;AAAA,MACT,cAAgB,EAAA,QAAA;AAAA,MAChB,SAAW,EAAA,KAAA,EAAO,OAAU,GAAA,CAAC,CAAK,IAAA;AAAA;AACpC,GACF;AACF,CAAC,CAAA;AAED,MAAM,mBAAmB,CAAC;AAAA,EACxB,YAAA;AAAA,EACA,OAAA,EAAS,EAAE,WAAA,GAAc,EAAG,EAAA;AAAA,EAC5B;AACF,CAIM,KAAA;AACJ,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAM,MAAA,iBAAA,GAAoB,YAAY,YAAY,CAAA;AAClD,EAAM,MAAA,oBAAA,GAAuB,YAAY,wBAAwB,CAAA;AACjE,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAE1C,EAAA,MAAM,KACJ,mBAAA,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,OAAO,YAAa,CAAA,KAAA;AAAA,MACpB,oBAAoB,EAAA,IAAA;AAAA,MACpB,aAAY,EAAA,iCAAA;AAAA,MAEZ,QAAA,kBAAA,GAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,WAAW,OAAQ,CAAA,UAAA;AAAA,UACnB,IAAI,oBAAqB,CAAA,EAAE,EAAI,EAAA,YAAA,CAAa,IAAI,CAAA;AAAA,UAE/C,QAAA,EAAA,QAAA,CAAS,YAAa,CAAA,KAAA,EAAO,WAAW;AAAA;AAAA;AAC3C;AAAA,GACF;AAEF,EAAA,MAAM,2BAEF,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,cAAW,OAAQ,EAAA,OAAA,EAAQ,KAAM,EAAA,eAAA,EAAgB,WAAU,MACzD,EAAA,QAAA,EAAA;AAAA,MAAA,CAAA,CAAE,2BAA2B,CAAA;AAAA,MAAG,GAAA;AAAA,sBACjC,GAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,YAAa,CAAA,YAAA,IAAgB,YAAa,CAAA,SAAA;AAAA,UACrD,QAAQ,EAAA;AAAA;AAAA,OACV;AAAA,MACC,YAAA,CAAa,4BAET,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,QAAA,GAAA;AAAA,QACA,EAAE,2BAA2B,CAAA;AAAA,QAAG,GAAA;AAAA,wBACjC,GAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,IAAI,CAAG,EAAA,iBAAA,EAAmB,CACxB,UAAA,EAAA,YAAA,CAAa,SAAS,IACxB,CAAA,CAAA;AAAA,YAEC,uBAAa,QAAS,CAAA;AAAA;AAAA;AACzB,OACF,EAAA,CAAA;AAAA,MACA,IAAA;AAAA,MACC,QAAS,CAAA,OAAA,CAAQ,YAAa,CAAA,UAAU,EAAE,UAAW;AAAA,KAC1D,EAAA,CAAA;AAAA,oBACA,GAAA,CAAC,OACE,QAAC,EAAA,CAAA,WAAA,wBACC,UAAW,EAAA,EAAA,OAAA,EAAQ,SAAU,EAAA,KAAA,EAAM,eACjC,EAAA,QAAA,EAAA,2BAAA;AAAA,MACC,YAAa,CAAA,QAAA;AAAA,MACb,EAAE,4BAA4B,CAAA;AAAA,MAC9B,EAAE,6BAA6B,CAAA;AAAA,MAC/B,EAAE,yBAAyB;AAAA,OAE/B,CAEJ,EAAA,CAAA;AAAA,IACC,aAAa,IAAQ,IAAA,YAAA,CAAa,KAAK,MAAS,GAAA,CAAA,wBAC9C,UAAW,EAAA,EAAA,OAAA,EAAQ,SAAQ,KAAM,EAAA,eAAA,EAChC,8BAAC,GAAI,EAAA,EAAA,EAAA,EAAI,GACN,QAAa,EAAA,YAAA,CAAA,IAAA,CAAK,IAAI,CACrB,GAAA,qBAAA,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEC,IAAK,EAAA,OAAA;AAAA,QACL,OAAO,GAAI,CAAA,KAAA;AAAA,QACX,SAAW,EAAA,IAAA;AAAA,QACX,IAAI,CAAG,EAAA,iBAAA,EAAmB,CAAA,MAAA,EAAS,IAAI,IAAI,CAAA,CAAA;AAAA,QAC3C,SAAS,EAAA,IAAA;AAAA,QACT,KAAO,EAAA,EAAE,WAAa,EAAA,CAAA,EAAG,cAAc,CAAE;AAAA,OAAA;AAAA,MANpC,GAAI,CAAA;AAAA,KAQZ,GACH,CACF,EAAA;AAAA,GAEJ,EAAA,CAAA;AAGF,EAAA,4BACG,IACC,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,UAAA,EAAA,EAAW,KAAc,EAAA,SAAA,EAAW,QAAU,EAAA,CAAA;AAAA,oBAC/C,GAAA,CAAC,WAAa,EAAA,EAAA,QAAA,EAAA,YAAA,CAAa,OAAQ,EAAA;AAAA,GACrC,EAAA,CAAA;AAEJ,CAAA;AAEA,MAAM,oBAAoB,CAAC;AAAA,EACzB,UAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,eAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CASM,KAAA;AACJ,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAA,MAAM,WAAW,WAAY,EAAA;AAC7B,EAAA,MAAM,WAAc,GAAA,IAAI,eAAgB,CAAA,QAAA,CAAS,MAAM,CAAA;AAEvD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,CAAC,CAAA;AAClC,EAAM,MAAA,YAAA,GAAe,CAAC,MAAA,EAAa,KAAkB,KAAA;AACnD,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,GACf;AAEA,EAAM,MAAA,SAAA,GAAY,WAAY,CAAA,GAAA,CAAI,MAAM,CAAA;AACxC,EAAM,MAAA,WAAA,GAAc,QAAQ,MAAM;AAChC,IAAA,OAAO,SAAY,GAAA,SAAA,CAAU,KAAM,CAAA,GAAG,CAAI,GAAA,KAAA,CAAA;AAAA,GAC5C,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,EAAE,aAAA,EAAe,OAAS,EAAA,KAAA,EAAU,GAAA,gBAAA;AAAA,IACxC;AAAA,MACE,GAAK,EAAA,UAAA;AAAA,MACL,IAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAM,IAAQ,IAAA,WAAA;AAAA,MACd,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,EAAE,YAAc,EAAA,CAAC,YAAY,IAAM,EAAA,QAAA,EAAU,WAAW,CAAE;AAAA,GAC5D;AAEA,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2BAAQ,QAAS,EAAA,EAAA,CAAA;AAAA,aACR,KAAO,EAAA;AAChB,IAAA,uBAAQ,GAAA,CAAA,KAAA,EAAA,EAAM,QAAS,EAAA,OAAA,EAAS,gBAAM,OAAQ,EAAA,CAAA;AAAA;AAGhD,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,YACE,EAAA,EAAA,QAAA,EAAA,aAAA,CAAc,OAAQ,CAAA,GAAA,CAAI,CACzB,YAAA,qBAAA,GAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QAEC,YAAA;AAAA,QACA,OAAA,EAAS,EAAE,WAAA,EAAa,eAAgB,EAAA;AAAA,QACxC;AAAA,OAAA;AAAA,MAHK,YAAa,CAAA;AAAA,KAKrB,CACH,EAAA,CAAA;AAAA,IAEC,aAAA,IAAiB,cAAc,KAAU,KAAA,CAAA,wBACvC,KAAI,EAAA,EAAA,SAAA,EAAW,QAAQ,UACtB,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAO,EAAA,IAAA,CAAK,IAAK,CAAA,aAAA,CAAc,QAAQ,UAAU,CAAA;AAAA,QACjD,IAAA;AAAA,QACA,QAAU,EAAA;AAAA;AAAA,KAEd,EAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ,CAAA;AA2Ba,MAAA,iBAAA,GAAoB,CAAC,KAAkC,KAAA;AAClE,EAAA,MAAM,WAAW,WAAY,EAAA;AAC7B,EAAA,MAAM,WAAc,GAAA,IAAI,eAAgB,CAAA,QAAA,CAAS,MAAM,CAAA;AACvD,EAAM,MAAA,EAAE,OAAS,EAAA,uBAAA,EAAyB,OAAS,EAAA,SAAA,KACjD,aAAc,CAAA,EAAE,UAAY,EAAA,4BAAA,EAA8B,CAAA;AAE5D,EAAM,MAAA;AAAA,IACJ,eAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACE,GAAA,KAAA;AAEJ,EACE,uBAAA,IAAA,CAAC,QAAK,OACJ,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,MAAA,EAAA,EAAO,KAAc,EAAA,QAAA,EACnB,QAAC,EAAA,CAAA,eAAA,IAAmB,CAAC,uBAA2B,IAAA,SAAA,oBAC9C,GAAA,CAAA,WAAA,EAAA,EAAY,CAEjB,EAAA,CAAA;AAAA,wBAEC,OACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,YAAY,UAAc,IAAA,EAAA;AAAA,QAC1B,QAAU,EAAA,QAAA,IAAY,WAAY,CAAA,GAAA,CAAI,UAAU,CAAK,IAAA,KAAA,CAAA;AAAA,QACrD,MAAM,KAAM,CAAA,IAAA;AAAA,QACZ,iBAAiB,WAAa,EAAA,WAAA;AAAA,QAC9B,MAAA,EAAQ,CAAC,CAAC,YAAA;AAAA,QACV,QAAQ,MAAU,IAAA,YAAA;AAAA,QAClB,OAAO,KAAS,IAAA,MAAA;AAAA,QAChB;AAAA;AAAA,KAEJ,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"AnnouncementsPage.esm.js","sources":["../../../src/components/AnnouncementsPage/AnnouncementsPage.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useState, ReactNode, useMemo } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { Announcement } from '@backstage-community/plugin-announcements-common';\nimport { DateTime } from 'luxon';\nimport {\n Page,\n Header,\n Content,\n Link,\n ItemCardGrid,\n Progress,\n} from '@backstage/core-components';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\nimport {\n useAnnouncements,\n useAnnouncementsTranslation,\n useAnnouncementsPermissions,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n Box,\n Card,\n CardContent,\n CardHeader,\n Chip,\n makeStyles,\n Tooltip,\n Typography,\n} from '@material-ui/core';\nimport { Alert, Pagination } from '@material-ui/lab';\n\nimport { announcementViewRouteRef, rootRouteRef } from '../../routes';\nimport { ContextMenu } from './ContextMenu';\nimport { formatAnnouncementStartTime } from '../utils/announcementDateUtils';\nimport { MarkdownRendererTypeProps } from '../MarkdownRenderer/MarkdownRenderer';\nimport { truncate } from '../utils/truncateUtils';\n\nconst useStyles = makeStyles(theme => {\n return {\n cardHeader: {\n color: theme?.palette?.text?.primary || '#000',\n },\n pagination: {\n display: 'flex',\n justifyContent: 'center',\n marginTop: theme?.spacing?.(4) || 32,\n },\n };\n});\n\nconst AnnouncementCard = ({\n announcement,\n options: { titleLength = 50 },\n hideStartAt,\n}: {\n announcement: Announcement;\n options: AnnouncementCardProps;\n hideStartAt?: boolean;\n}) => {\n const classes = useStyles();\n const announcementsLink = useRouteRef(rootRouteRef);\n const viewAnnouncementLink = useRouteRef(announcementViewRouteRef);\n const { t } = useAnnouncementsTranslation();\n\n const title = (\n <Tooltip\n title={announcement.title}\n disableFocusListener\n data-testid=\"announcement-card-title-tooltip\"\n >\n <Link\n className={classes.cardHeader}\n to={viewAnnouncementLink({ id: announcement.id })}\n >\n {truncate(announcement.title, titleLength)}\n </Link>\n </Tooltip>\n );\n const subTitle = (\n <>\n <Typography variant=\"body2\" color=\"textSecondary\" component=\"span\">\n {t('announcementsPage.card.by')}{' '}\n <EntityRefLink\n entityRef={announcement.on_behalf_of || announcement.publisher}\n hideIcon\n />\n {announcement.category && (\n <>\n {' '}\n {t('announcementsPage.card.in')}{' '}\n <Link\n to={`${announcementsLink()}?category=${\n announcement.category.slug\n }`}\n >\n {announcement.category.title}\n </Link>\n </>\n )}\n , {DateTime.fromISO(announcement.created_at).toRelative()}\n </Typography>\n <Box>\n {!hideStartAt && (\n <Typography variant=\"caption\" color=\"textSecondary\">\n {formatAnnouncementStartTime(\n announcement.start_at,\n t('announcementsCard.occurred'),\n t('announcementsCard.scheduled'),\n t('announcementsCard.today'),\n )}\n </Typography>\n )}\n </Box>\n {announcement.tags && announcement.tags.length > 0 && (\n <Typography variant=\"body2\" color=\"textSecondary\">\n <Box mt={1}>\n {announcement.tags.map(tag => (\n <Chip\n key={tag.slug}\n size=\"small\"\n label={tag.title}\n component={Link}\n to={`${announcementsLink()}?tags=${tag.slug}`}\n clickable\n style={{ marginRight: 4, marginBottom: 4 }}\n />\n ))}\n </Box>\n </Typography>\n )}\n </>\n );\n\n return (\n <Card>\n <CardHeader title={title} subheader={subTitle} />\n <CardContent>{announcement.excerpt}</CardContent>\n </Card>\n );\n};\n\nconst AnnouncementsGrid = ({\n maxPerPage,\n category,\n tags,\n cardTitleLength,\n active,\n sortBy,\n order,\n hideStartAt,\n}: {\n maxPerPage: number;\n category?: string;\n tags?: string[];\n cardTitleLength?: number;\n active?: boolean;\n sortBy?: 'created_at' | 'start_at';\n order?: 'asc' | 'desc';\n hideStartAt?: boolean;\n}) => {\n const classes = useStyles();\n const location = useLocation();\n const queryParams = new URLSearchParams(location.search);\n\n const [page, setPage] = useState(1);\n const handleChange = (_event: any, value: number) => {\n setPage(value);\n };\n\n const tagsParam = queryParams.get('tags');\n const tagsFromUrl = useMemo(() => {\n return tagsParam ? tagsParam.split(',') : undefined;\n }, [tagsParam]);\n\n const { announcements, loading, error } = useAnnouncements(\n {\n max: maxPerPage,\n page: page,\n category,\n tags: tags || tagsFromUrl,\n active,\n sortBy,\n order,\n },\n { dependencies: [maxPerPage, page, category, tagsFromUrl] },\n );\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n }\n\n return (\n <>\n <ItemCardGrid>\n {announcements.results.map(announcement => (\n <AnnouncementCard\n key={announcement.id}\n announcement={announcement}\n options={{ titleLength: cardTitleLength }}\n hideStartAt={hideStartAt}\n />\n ))}\n </ItemCardGrid>\n\n {announcements && announcements.count !== 0 && (\n <div className={classes.pagination}>\n <Pagination\n count={Math.ceil(announcements.count / maxPerPage)}\n page={page}\n onChange={handleChange}\n />\n </div>\n )}\n </>\n );\n};\n\ntype AnnouncementCardProps = {\n titleLength?: number;\n};\n\ntype AnnouncementCreateButtonProps = {\n name?: string;\n};\n\nexport type AnnouncementsPageProps = {\n themeId: string;\n title: string;\n subtitle?: ReactNode;\n maxPerPage?: number;\n category?: string;\n tags?: string[];\n buttonOptions?: AnnouncementCreateButtonProps;\n cardOptions?: AnnouncementCardProps;\n hideContextMenu?: boolean;\n hideInactive?: boolean;\n hideStartAt?: boolean;\n markdownRenderer?: MarkdownRendererTypeProps;\n sortby?: 'created_at' | 'start_at';\n order?: 'asc' | 'desc';\n};\n\nexport const AnnouncementsPage = (props: AnnouncementsPageProps) => {\n const location = useLocation();\n const queryParams = new URLSearchParams(location.search);\n const permissions = useAnnouncementsPermissions();\n\n const {\n hideContextMenu,\n hideInactive,\n hideStartAt,\n themeId,\n title,\n subtitle,\n maxPerPage,\n category,\n cardOptions,\n sortby,\n order,\n } = props;\n\n return (\n <Page themeId={themeId}>\n <Header title={title} subtitle={subtitle}>\n {!hideContextMenu &&\n !permissions.create.loading &&\n permissions.create.allowed && <ContextMenu />}\n </Header>\n\n <Content>\n <AnnouncementsGrid\n maxPerPage={maxPerPage ?? 10}\n category={category ?? queryParams.get('category') ?? undefined}\n tags={props.tags}\n cardTitleLength={cardOptions?.titleLength}\n active={!!hideInactive}\n sortBy={sortby ?? 'created_at'}\n order={order ?? 'desc'}\n hideStartAt={hideStartAt}\n />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
1
|
import * as _backstage_core_components from '@backstage/core-components';
|
|
3
2
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
4
3
|
import { IndexableDocument, ResultHighlight } from '@backstage/plugin-search-common';
|
|
5
4
|
import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
|
|
5
|
+
import { JSX } from 'react';
|
|
6
6
|
import { SearchResultListItemExtensionProps } from '@backstage/plugin-search-react';
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -78,9 +78,6 @@ declare const announcementsPlugin: _backstage_core_plugin_api.BackstagePlugin<{
|
|
|
78
78
|
*/
|
|
79
79
|
declare const AnnouncementsPage: (props: {
|
|
80
80
|
themeId?: string | undefined;
|
|
81
|
-
/**
|
|
82
|
-
* @public
|
|
83
|
-
*/
|
|
84
81
|
title?: string | undefined;
|
|
85
82
|
subtitle?: string | undefined;
|
|
86
83
|
category?: string | undefined;
|
|
@@ -135,6 +132,9 @@ declare const NewAnnouncementBanner: (props: {
|
|
|
135
132
|
tags?: string[] | undefined;
|
|
136
133
|
sortBy?: "created_at" | "updated_at" | undefined;
|
|
137
134
|
cardOptions?: {
|
|
135
|
+
/**
|
|
136
|
+
* @public
|
|
137
|
+
*/
|
|
138
138
|
titleLength?: number | undefined;
|
|
139
139
|
excerptLength?: number | undefined;
|
|
140
140
|
} | undefined;
|
package/dist/plugin.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n createApiFactory,\n createComponentExtension,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n errorApiRef,\n identityApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n createSearchResultListItemExtension,\n SearchResultListItemExtensionProps,\n} from '@backstage/plugin-search-react';\nimport { AnnouncementSearchResultProps } from './components/AnnouncementSearchResultListItem';\nimport { rootRouteRef } from './routes';\nimport {\n announcementsApiRef,\n AnnouncementsClient,\n} from '@backstage-community/plugin-announcements-react';\n\n/**\n * @public\n */\nexport const announcementsPlugin = createPlugin({\n id: 'announcements',\n routes: {\n root: rootRouteRef,\n },\n apis: [\n createApiFactory({\n api: announcementsApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n identityApi: identityApiRef,\n errorApi: errorApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ discoveryApi, identityApi, errorApi, fetchApi }) => {\n return new AnnouncementsClient({\n discoveryApi: discoveryApi,\n identityApi: identityApi,\n errorApi: errorApi,\n fetchApi: fetchApi,\n });\n },\n }),\n ],\n});\n\n/**\n * @public\n */\nexport const AnnouncementsPage = announcementsPlugin.provide(\n createRoutableExtension({\n name: 'AnnouncementsPage',\n component: () => import('./components/Router').then(m => m.Router),\n mountPoint: rootRouteRef,\n }),\n);\n\n/**\n * @public\n */\nexport const AnnouncementsAdminPortal = announcementsPlugin.provide(\n createComponentExtension({\n name: 'AnnouncementsAdminPortal',\n component: {\n lazy: () => import('./components/Admin').then(m => m.AdminPortal),\n },\n }),\n);\n\n/**\n * @public\n */\nexport const AnnouncementsTimeline = announcementsPlugin.provide(\n createComponentExtension({\n name: 'AnnouncementsTimeline',\n component: {\n lazy: () => import('./components').then(m => m.AnnouncementsTimeline),\n },\n }),\n);\n\n/**\n * @public\n */\nexport const AnnouncementsCard = announcementsPlugin.provide(\n createComponentExtension({\n name: 'AnnouncementsCard',\n component: {\n lazy: () =>\n import('./components/AnnouncementsCard').then(m => m.AnnouncementsCard),\n },\n }),\n);\n\n/**\n * @public\n */\nexport const NewAnnouncementBanner = announcementsPlugin.provide(\n createComponentExtension({\n name: 'NewAnnouncementBanner',\n component: {\n lazy: () =>\n import('./components/NewAnnouncementBanner').then(\n m => m.NewAnnouncementBanner,\n ),\n },\n }),\n);\n\n/**\n * @public\n */\nexport const AnnouncementSearchResultListItem: (\n props: SearchResultListItemExtensionProps<AnnouncementSearchResultProps>,\n) => JSX.Element | null = announcementsPlugin.provide(\n createSearchResultListItemExtension({\n name: 'AnnouncementSearchResultListItem',\n component: () =>\n import('./components/AnnouncementSearchResultListItem').then(\n m => m.AnnouncementSearchResultListItem,\n ),\n predicate: result => result.type === 'announcements',\n }),\n);\n"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { JSX } from 'react';\nimport {\n createApiFactory,\n createComponentExtension,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n errorApiRef,\n identityApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n createSearchResultListItemExtension,\n SearchResultListItemExtensionProps,\n} from '@backstage/plugin-search-react';\nimport { AnnouncementSearchResultProps } from './components/AnnouncementSearchResultListItem';\nimport { rootRouteRef } from './routes';\nimport {\n announcementsApiRef,\n AnnouncementsClient,\n} from '@backstage-community/plugin-announcements-react';\n\n/**\n * @public\n */\nexport const announcementsPlugin = createPlugin({\n id: 'announcements',\n routes: {\n root: rootRouteRef,\n },\n apis: [\n createApiFactory({\n api: announcementsApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n identityApi: identityApiRef,\n errorApi: errorApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ discoveryApi, identityApi, errorApi, fetchApi }) => {\n return new AnnouncementsClient({\n discoveryApi: discoveryApi,\n identityApi: identityApi,\n errorApi: errorApi,\n fetchApi: fetchApi,\n });\n },\n }),\n ],\n});\n\n/**\n * @public\n */\nexport const AnnouncementsPage = announcementsPlugin.provide(\n createRoutableExtension({\n name: 'AnnouncementsPage',\n component: () => import('./components/Router').then(m => m.Router),\n mountPoint: rootRouteRef,\n }),\n);\n\n/**\n * @public\n */\nexport const AnnouncementsAdminPortal = announcementsPlugin.provide(\n createComponentExtension({\n name: 'AnnouncementsAdminPortal',\n component: {\n lazy: () => import('./components/Admin').then(m => m.AdminPortal),\n },\n }),\n);\n\n/**\n * @public\n */\nexport const AnnouncementsTimeline = announcementsPlugin.provide(\n createComponentExtension({\n name: 'AnnouncementsTimeline',\n component: {\n lazy: () => import('./components').then(m => m.AnnouncementsTimeline),\n },\n }),\n);\n\n/**\n * @public\n */\nexport const AnnouncementsCard = announcementsPlugin.provide(\n createComponentExtension({\n name: 'AnnouncementsCard',\n component: {\n lazy: () =>\n import('./components/AnnouncementsCard').then(m => m.AnnouncementsCard),\n },\n }),\n);\n\n/**\n * @public\n */\nexport const NewAnnouncementBanner = announcementsPlugin.provide(\n createComponentExtension({\n name: 'NewAnnouncementBanner',\n component: {\n lazy: () =>\n import('./components/NewAnnouncementBanner').then(\n m => m.NewAnnouncementBanner,\n ),\n },\n }),\n);\n\n/**\n * @public\n */\nexport const AnnouncementSearchResultListItem: (\n props: SearchResultListItemExtensionProps<AnnouncementSearchResultProps>,\n) => JSX.Element | null = announcementsPlugin.provide(\n createSearchResultListItemExtension({\n name: 'AnnouncementSearchResultListItem',\n component: () =>\n import('./components/AnnouncementSearchResultListItem').then(\n m => m.AnnouncementSearchResultListItem,\n ),\n predicate: result => result.type === 'announcements',\n }),\n);\n"],"names":[],"mappings":";;;;;AAwCO,MAAM,sBAAsB,YAAa,CAAA;AAAA,EAC9C,EAAI,EAAA,eAAA;AAAA,EACJ,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA;AAAA,GACR;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,mBAAA;AAAA,MACL,IAAM,EAAA;AAAA,QACJ,YAAc,EAAA,eAAA;AAAA,QACd,WAAa,EAAA,cAAA;AAAA,QACb,QAAU,EAAA,WAAA;AAAA,QACV,QAAU,EAAA;AAAA,OACZ;AAAA,MACA,SAAS,CAAC,EAAE,cAAc,WAAa,EAAA,QAAA,EAAU,UAAe,KAAA;AAC9D,QAAA,OAAO,IAAI,mBAAoB,CAAA;AAAA,UAC7B,YAAA;AAAA,UACA,WAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA;AACH,KACD;AAAA;AAEL,CAAC;AAKM,MAAM,oBAAoB,mBAAoB,CAAA,OAAA;AAAA,EACnD,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,mBAAA;AAAA,IACN,SAAA,EAAW,MAAM,OAAO,4BAAqB,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,MAAM,CAAA;AAAA,IACjE,UAAY,EAAA;AAAA,GACb;AACH;AAKO,MAAM,2BAA2B,mBAAoB,CAAA,OAAA;AAAA,EAC1D,wBAAyB,CAAA;AAAA,IACvB,IAAM,EAAA,0BAAA;AAAA,IACN,SAAW,EAAA;AAAA,MACT,IAAA,EAAM,MAAM,OAAO,iCAAoB,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,WAAW;AAAA;AAClE,GACD;AACH;AAKO,MAAM,wBAAwB,mBAAoB,CAAA,OAAA;AAAA,EACvD,wBAAyB,CAAA;AAAA,IACvB,IAAM,EAAA,uBAAA;AAAA,IACN,SAAW,EAAA;AAAA,MACT,IAAA,EAAM,MAAM,OAAO,2BAAc,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,qBAAqB;AAAA;AACtE,GACD;AACH;AAKO,MAAM,oBAAoB,mBAAoB,CAAA,OAAA;AAAA,EACnD,wBAAyB,CAAA;AAAA,IACvB,IAAM,EAAA,mBAAA;AAAA,IACN,SAAW,EAAA;AAAA,MACT,IAAA,EAAM,MACJ,OAAO,6CAAgC,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,iBAAiB;AAAA;AAC1E,GACD;AACH;AAKO,MAAM,wBAAwB,mBAAoB,CAAA,OAAA;AAAA,EACvD,wBAAyB,CAAA;AAAA,IACvB,IAAM,EAAA,uBAAA;AAAA,IACN,SAAW,EAAA;AAAA,MACT,IAAM,EAAA,MACJ,OAAO,iDAAoC,CAAE,CAAA,IAAA;AAAA,QAC3C,OAAK,CAAE,CAAA;AAAA;AACT;AACJ,GACD;AACH;AAKO,MAAM,mCAEa,mBAAoB,CAAA,OAAA;AAAA,EAC5C,mCAAoC,CAAA;AAAA,IAClC,IAAM,EAAA,kCAAA;AAAA,IACN,SAAW,EAAA,MACT,OAAO,4DAA+C,CAAE,CAAA,IAAA;AAAA,MACtD,OAAK,CAAE,CAAA;AAAA,KACT;AAAA,IACF,SAAA,EAAW,CAAU,MAAA,KAAA,MAAA,CAAO,IAAS,KAAA;AAAA,GACtC;AACH;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage-community/plugin-announcements",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"main": "./dist/index.esm.js",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
},
|
|
63
63
|
"dependencies": {
|
|
64
64
|
"@backstage-community/plugin-announcements-common": "^0.13.0",
|
|
65
|
-
"@backstage-community/plugin-announcements-react": "^0.
|
|
65
|
+
"@backstage-community/plugin-announcements-react": "^0.16.0",
|
|
66
66
|
"@backstage/catalog-model": "^1.7.6",
|
|
67
67
|
"@backstage/core-app-api": "^1.19.2",
|
|
68
68
|
"@backstage/core-compat-api": "^0.5.4",
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { usePermission } from '@backstage/plugin-permission-react';
|
|
3
|
-
import { Dialog, DialogTitle, DialogActions, Button } from '@material-ui/core';
|
|
4
|
-
import { announcementDeletePermission } from '@backstage-community/plugin-announcements-common';
|
|
5
|
-
import { useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';
|
|
6
|
-
|
|
7
|
-
const DeleteAnnouncementDialog = (props) => {
|
|
8
|
-
const { open, onConfirm, onCancel } = props;
|
|
9
|
-
const { loading: loadingDeletePermission, allowed: canDeleteAnnouncement } = usePermission({
|
|
10
|
-
permission: announcementDeletePermission
|
|
11
|
-
});
|
|
12
|
-
const { t } = useAnnouncementsTranslation();
|
|
13
|
-
return /* @__PURE__ */ jsxs(Dialog, { open, onClose: onCancel, children: [
|
|
14
|
-
/* @__PURE__ */ jsx(DialogTitle, { children: t("deleteDialog.title") }),
|
|
15
|
-
/* @__PURE__ */ jsxs(DialogActions, { children: [
|
|
16
|
-
/* @__PURE__ */ jsx(Button, { onClick: onCancel, children: t("deleteDialog.cancel") }),
|
|
17
|
-
/* @__PURE__ */ jsx(
|
|
18
|
-
Button,
|
|
19
|
-
{
|
|
20
|
-
disabled: loadingDeletePermission || !canDeleteAnnouncement,
|
|
21
|
-
onClick: onConfirm,
|
|
22
|
-
color: "secondary",
|
|
23
|
-
children: t("deleteDialog.delete")
|
|
24
|
-
}
|
|
25
|
-
)
|
|
26
|
-
] })
|
|
27
|
-
] });
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
export { DeleteAnnouncementDialog };
|
|
31
|
-
//# sourceMappingURL=DeleteAnnouncementDialog.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DeleteAnnouncementDialog.esm.js","sources":["../../../../src/components/Admin/AnnouncementsContent/DeleteAnnouncementDialog.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 { usePermission } from '@backstage/plugin-permission-react';\nimport { Button, Dialog, DialogActions, DialogTitle } from '@material-ui/core';\nimport { announcementDeletePermission } from '@backstage-community/plugin-announcements-common';\nimport { useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';\n\ntype DeleteAnnouncementDialogProps = {\n open: boolean;\n onConfirm: () => any;\n onCancel: () => any;\n};\n\nexport const DeleteAnnouncementDialog = (\n props: DeleteAnnouncementDialogProps,\n) => {\n const { open, onConfirm, onCancel } = props;\n\n const { loading: loadingDeletePermission, allowed: canDeleteAnnouncement } =\n usePermission({\n permission: announcementDeletePermission,\n });\n const { t } = useAnnouncementsTranslation();\n\n return (\n <Dialog open={open} onClose={onCancel}>\n <DialogTitle>{t('deleteDialog.title')}</DialogTitle>\n <DialogActions>\n <Button onClick={onCancel}>{t('deleteDialog.cancel')}</Button>\n\n <Button\n disabled={loadingDeletePermission || !canDeleteAnnouncement}\n onClick={onConfirm}\n color=\"secondary\"\n >\n {t('deleteDialog.delete')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":";;;;;;AA0Ba,MAAA,wBAAA,GAA2B,CACtC,KACG,KAAA;AACH,EAAA,MAAM,EAAE,IAAA,EAAM,SAAW,EAAA,QAAA,EAAa,GAAA,KAAA;AAEtC,EAAA,MAAM,EAAE,OAAS,EAAA,uBAAA,EAAyB,OAAS,EAAA,qBAAA,KACjD,aAAc,CAAA;AAAA,IACZ,UAAY,EAAA;AAAA,GACb,CAAA;AACH,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAE1C,EAAA,uBACG,IAAA,CAAA,MAAA,EAAA,EAAO,IAAY,EAAA,OAAA,EAAS,QAC3B,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,WAAA,EAAA,EAAa,QAAE,EAAA,CAAA,CAAA,oBAAoB,CAAE,EAAA,CAAA;AAAA,yBACrC,aACC,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAO,EAAA,EAAA,OAAA,EAAS,QAAW,EAAA,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAE,EAAA,CAAA;AAAA,sBAErD,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,2BAA2B,CAAC,qBAAA;AAAA,UACtC,OAAS,EAAA,SAAA;AAAA,UACT,KAAM,EAAA,WAAA;AAAA,UAEL,YAAE,qBAAqB;AAAA;AAAA;AAC1B,KACF,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { useState, useCallback } from 'react';
|
|
2
|
-
|
|
3
|
-
function useDeleteAnnouncementDialogState() {
|
|
4
|
-
const [state, setState] = useState({ open: false });
|
|
5
|
-
const setOpen = useCallback(
|
|
6
|
-
(a) => {
|
|
7
|
-
setState({
|
|
8
|
-
open: true,
|
|
9
|
-
announcement: a
|
|
10
|
-
});
|
|
11
|
-
},
|
|
12
|
-
[setState]
|
|
13
|
-
);
|
|
14
|
-
const setClosed = useCallback(() => {
|
|
15
|
-
setState({
|
|
16
|
-
open: false,
|
|
17
|
-
announcement: void 0
|
|
18
|
-
});
|
|
19
|
-
}, [setState]);
|
|
20
|
-
return {
|
|
21
|
-
open: setOpen,
|
|
22
|
-
close: setClosed,
|
|
23
|
-
announcement: state.announcement,
|
|
24
|
-
isOpen: state.open
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export { useDeleteAnnouncementDialogState };
|
|
29
|
-
//# sourceMappingURL=useDeleteAnnouncementDialogState.esm.js.map
|
package/dist/components/Admin/AnnouncementsContent/useDeleteAnnouncementDialogState.esm.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useDeleteAnnouncementDialogState.esm.js","sources":["../../../../src/components/Admin/AnnouncementsContent/useDeleteAnnouncementDialogState.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 { Announcement } from '@backstage-community/plugin-announcements-common';\nimport { useCallback, useState } from 'react';\n\ntype DeleteAnnouncementDialogState = {\n open: (a: Announcement) => void;\n close: () => void;\n\n isOpen: boolean;\n announcement?: Announcement;\n};\n\nexport function useDeleteAnnouncementDialogState(): DeleteAnnouncementDialogState {\n const [state, setState] = useState<{\n open: boolean;\n announcement?: Announcement;\n }>({ open: false });\n\n const setOpen = useCallback(\n (a: Announcement) => {\n setState({\n open: true,\n announcement: a,\n });\n },\n [setState],\n );\n\n const setClosed = useCallback(() => {\n setState({\n open: false,\n announcement: undefined,\n });\n }, [setState]);\n\n return {\n open: setOpen,\n close: setClosed,\n\n announcement: state.announcement,\n isOpen: state.open,\n };\n}\n"],"names":[],"mappings":";;AA0BO,SAAS,gCAAkE,GAAA;AAChF,EAAM,MAAA,CAAC,OAAO,QAAQ,CAAA,GAAI,SAGvB,EAAE,IAAA,EAAM,OAAO,CAAA;AAElB,EAAA,MAAM,OAAU,GAAA,WAAA;AAAA,IACd,CAAC,CAAoB,KAAA;AACnB,MAAS,QAAA,CAAA;AAAA,QACP,IAAM,EAAA,IAAA;AAAA,QACN,YAAc,EAAA;AAAA,OACf,CAAA;AAAA,KACH;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAM,MAAA,SAAA,GAAY,YAAY,MAAM;AAClC,IAAS,QAAA,CAAA;AAAA,MACP,IAAM,EAAA,KAAA;AAAA,MACN,YAAc,EAAA,KAAA;AAAA,KACf,CAAA;AAAA,GACH,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAO,OAAA;AAAA,IACL,IAAM,EAAA,OAAA;AAAA,IACN,KAAO,EAAA,SAAA;AAAA,IAEP,cAAc,KAAM,CAAA,YAAA;AAAA,IACpB,QAAQ,KAAM,CAAA;AAAA,GAChB;AACF;;;;"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { Dialog, DialogTitle, DialogActions, Button } from '@material-ui/core';
|
|
3
|
-
|
|
4
|
-
const DeleteCategoryDialog = (props) => {
|
|
5
|
-
const { open, onConfirm, onCancel } = props;
|
|
6
|
-
return /* @__PURE__ */ jsxs(Dialog, { open, onClose: onCancel, children: [
|
|
7
|
-
/* @__PURE__ */ jsx(DialogTitle, { children: "Are you sure you want to delete this category?" }),
|
|
8
|
-
/* @__PURE__ */ jsxs(DialogActions, { children: [
|
|
9
|
-
/* @__PURE__ */ jsx(Button, { onClick: onCancel, children: "Cancel" }),
|
|
10
|
-
/* @__PURE__ */ jsx(Button, { onClick: onConfirm, color: "secondary", children: "Delete" })
|
|
11
|
-
] })
|
|
12
|
-
] });
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export { DeleteCategoryDialog };
|
|
16
|
-
//# sourceMappingURL=DeleteCategoryDialog.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DeleteCategoryDialog.esm.js","sources":["../../../../src/components/Admin/CategoriesContent/DeleteCategoryDialog.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 { Dialog, DialogTitle, DialogActions, Button } from '@material-ui/core';\n\ntype DeleteCategoryDialogProps = {\n open: boolean;\n onConfirm: () => any;\n onCancel: () => any;\n};\n\nexport const DeleteCategoryDialog = (props: DeleteCategoryDialogProps) => {\n const { open, onConfirm, onCancel } = props;\n\n return (\n <Dialog open={open} onClose={onCancel}>\n <DialogTitle>Are you sure you want to delete this category?</DialogTitle>\n <DialogActions>\n <Button onClick={onCancel}>Cancel</Button>\n\n <Button onClick={onConfirm} color=\"secondary\">\n Delete\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":";;;AAuBa,MAAA,oBAAA,GAAuB,CAAC,KAAqC,KAAA;AACxE,EAAA,MAAM,EAAE,IAAA,EAAM,SAAW,EAAA,QAAA,EAAa,GAAA,KAAA;AAEtC,EAAA,uBACG,IAAA,CAAA,MAAA,EAAA,EAAO,IAAY,EAAA,OAAA,EAAS,QAC3B,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,eAAY,QAA8C,EAAA,gDAAA,EAAA,CAAA;AAAA,yBAC1D,aACC,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,MAAA,EAAA,EAAO,OAAS,EAAA,QAAA,EAAU,QAAM,EAAA,QAAA,EAAA,CAAA;AAAA,0BAEhC,MAAO,EAAA,EAAA,OAAA,EAAS,SAAW,EAAA,KAAA,EAAM,aAAY,QAE9C,EAAA,QAAA,EAAA;AAAA,KACF,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { useState, useCallback } from 'react';
|
|
2
|
-
|
|
3
|
-
function useDeleteCategoryDialogState() {
|
|
4
|
-
const [state, setState] = useState({ open: false });
|
|
5
|
-
const setOpen = useCallback(
|
|
6
|
-
(c) => {
|
|
7
|
-
setState({
|
|
8
|
-
open: true,
|
|
9
|
-
category: c
|
|
10
|
-
});
|
|
11
|
-
},
|
|
12
|
-
[setState]
|
|
13
|
-
);
|
|
14
|
-
const setClosed = useCallback(() => {
|
|
15
|
-
setState({
|
|
16
|
-
open: false,
|
|
17
|
-
category: void 0
|
|
18
|
-
});
|
|
19
|
-
}, [setState]);
|
|
20
|
-
return {
|
|
21
|
-
open: setOpen,
|
|
22
|
-
close: setClosed,
|
|
23
|
-
category: state.category,
|
|
24
|
-
isOpen: state.open
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export { useDeleteCategoryDialogState };
|
|
29
|
-
//# sourceMappingURL=useDeleteCategoryDialogState.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useDeleteCategoryDialogState.esm.js","sources":["../../../../src/components/Admin/CategoriesContent/useDeleteCategoryDialogState.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 { Category } from '@backstage-community/plugin-announcements-common';\nimport { useCallback, useState } from 'react';\n\ntype DeleteCategoryDialogState = {\n open: (c: Category) => void;\n close: () => void;\n\n isOpen: boolean;\n category?: Category;\n};\n\nexport function useDeleteCategoryDialogState(): DeleteCategoryDialogState {\n const [state, setState] = useState<{\n open: boolean;\n category?: Category;\n }>({ open: false });\n\n const setOpen = useCallback(\n (c: Category) => {\n setState({\n open: true,\n category: c,\n });\n },\n [setState],\n );\n\n const setClosed = useCallback(() => {\n setState({\n open: false,\n category: undefined,\n });\n }, [setState]);\n\n return {\n open: setOpen,\n close: setClosed,\n\n category: state.category,\n isOpen: state.open,\n };\n}\n"],"names":[],"mappings":";;AA0BO,SAAS,4BAA0D,GAAA;AACxE,EAAM,MAAA,CAAC,OAAO,QAAQ,CAAA,GAAI,SAGvB,EAAE,IAAA,EAAM,OAAO,CAAA;AAElB,EAAA,MAAM,OAAU,GAAA,WAAA;AAAA,IACd,CAAC,CAAgB,KAAA;AACf,MAAS,QAAA,CAAA;AAAA,QACP,IAAM,EAAA,IAAA;AAAA,QACN,QAAU,EAAA;AAAA,OACX,CAAA;AAAA,KACH;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAM,MAAA,SAAA,GAAY,YAAY,MAAM;AAClC,IAAS,QAAA,CAAA;AAAA,MACP,IAAM,EAAA,KAAA;AAAA,MACN,QAAU,EAAA,KAAA;AAAA,KACX,CAAA;AAAA,GACH,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAO,OAAA;AAAA,IACL,IAAM,EAAA,OAAA;AAAA,IACN,KAAO,EAAA,SAAA;AAAA,IAEP,UAAU,KAAM,CAAA,QAAA;AAAA,IAChB,QAAQ,KAAM,CAAA;AAAA,GAChB;AACF;;;;"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { Dialog, DialogTitle, DialogActions, Button } from '@material-ui/core';
|
|
3
|
-
|
|
4
|
-
const DeleteTagDialog = (props) => {
|
|
5
|
-
const { open, onConfirm, onCancel } = props;
|
|
6
|
-
return /* @__PURE__ */ jsxs(Dialog, { open, onClose: onCancel, children: [
|
|
7
|
-
/* @__PURE__ */ jsx(DialogTitle, { children: "Are you sure you want to delete this tag?" }),
|
|
8
|
-
/* @__PURE__ */ jsxs(DialogActions, { children: [
|
|
9
|
-
/* @__PURE__ */ jsx(Button, { onClick: onCancel, children: "Cancel" }),
|
|
10
|
-
/* @__PURE__ */ jsx(Button, { onClick: onConfirm, color: "secondary", children: "Delete" })
|
|
11
|
-
] })
|
|
12
|
-
] });
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export { DeleteTagDialog };
|
|
16
|
-
//# sourceMappingURL=DeleteTagDialog.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DeleteTagDialog.esm.js","sources":["../../../../src/components/Admin/TagsContent/DeleteTagDialog.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 { Dialog, DialogTitle, DialogActions, Button } from '@material-ui/core';\n\ntype DeleteTagDialogProps = {\n open: boolean;\n onConfirm: () => any;\n onCancel: () => any;\n};\n\nexport const DeleteTagDialog = (props: DeleteTagDialogProps) => {\n const { open, onConfirm, onCancel } = props;\n\n return (\n <Dialog open={open} onClose={onCancel}>\n <DialogTitle>Are you sure you want to delete this tag?</DialogTitle>\n <DialogActions>\n <Button onClick={onCancel}>Cancel</Button>\n\n <Button onClick={onConfirm} color=\"secondary\">\n Delete\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":";;;AAuBa,MAAA,eAAA,GAAkB,CAAC,KAAgC,KAAA;AAC9D,EAAA,MAAM,EAAE,IAAA,EAAM,SAAW,EAAA,QAAA,EAAa,GAAA,KAAA;AAEtC,EAAA,uBACG,IAAA,CAAA,MAAA,EAAA,EAAO,IAAY,EAAA,OAAA,EAAS,QAC3B,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,eAAY,QAAyC,EAAA,2CAAA,EAAA,CAAA;AAAA,yBACrD,aACC,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,MAAA,EAAA,EAAO,OAAS,EAAA,QAAA,EAAU,QAAM,EAAA,QAAA,EAAA,CAAA;AAAA,0BAEhC,MAAO,EAAA,EAAA,OAAA,EAAS,SAAW,EAAA,KAAA,EAAM,aAAY,QAE9C,EAAA,QAAA,EAAA;AAAA,KACF,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useDeleteTagDialogState.esm.js","sources":["../../../../src/components/Admin/TagsContent/useDeleteTagDialogState.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 { Tag } from '@backstage-community/plugin-announcements-common';\nimport { useCallback, useState } from 'react';\n\ntype DeleteTagDialogState = {\n open: (t: Tag) => void;\n close: () => void;\n\n isOpen: boolean;\n tag?: Tag;\n};\n\nexport function useDeleteTagDialogState(): DeleteTagDialogState {\n const [state, setState] = useState<{\n open: boolean;\n tag?: Tag;\n }>({ open: false });\n\n const setOpen = useCallback(\n (t: Tag) => {\n setState({\n open: true,\n tag: t,\n });\n },\n [setState],\n );\n\n const setClosed = useCallback(() => {\n setState({\n open: false,\n tag: undefined,\n });\n }, [setState]);\n\n return {\n open: setOpen,\n close: setClosed,\n\n tag: state.tag,\n isOpen: state.open,\n };\n}\n"],"names":[],"mappings":";;AA0BO,SAAS,uBAAgD,GAAA;AAC9D,EAAM,MAAA,CAAC,OAAO,QAAQ,CAAA,GAAI,SAGvB,EAAE,IAAA,EAAM,OAAO,CAAA;AAElB,EAAA,MAAM,OAAU,GAAA,WAAA;AAAA,IACd,CAAC,CAAW,KAAA;AACV,MAAS,QAAA,CAAA;AAAA,QACP,IAAM,EAAA,IAAA;AAAA,QACN,GAAK,EAAA;AAAA,OACN,CAAA;AAAA,KACH;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAM,MAAA,SAAA,GAAY,YAAY,MAAM;AAClC,IAAS,QAAA,CAAA;AAAA,MACP,IAAM,EAAA,KAAA;AAAA,MACN,GAAK,EAAA,KAAA;AAAA,KACN,CAAA;AAAA,GACH,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAO,OAAA;AAAA,IACL,IAAM,EAAA,OAAA;AAAA,IACN,KAAO,EAAA,SAAA;AAAA,IAEP,KAAK,KAAM,CAAA,GAAA;AAAA,IACX,QAAQ,KAAM,CAAA;AAAA,GAChB;AACF;;;;"}
|