@backstage-community/plugin-announcements 0.17.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 +119 -0
- package/dist/components/Admin/AnnouncementsContent/AnnouncementForm/AnnouncementForm.esm.js.map +1 -0
- package/dist/components/Admin/AnnouncementsContent/AnnouncementForm/CategoryInput.esm.js.map +1 -0
- package/dist/components/Admin/AnnouncementsContent/AnnouncementForm/OnBehalfTeamDropdown.esm.js.map +1 -0
- package/dist/components/Admin/AnnouncementsContent/AnnouncementForm/TagsInput.esm.js.map +1 -0
- package/dist/components/Admin/AnnouncementsContent/AnnouncementsContent.esm.js +80 -25
- package/dist/components/Admin/AnnouncementsContent/AnnouncementsContent.esm.js.map +1 -1
- package/dist/components/Admin/CategoriesContent/CategoriesContent.esm.js +13 -18
- package/dist/components/Admin/CategoriesContent/CategoriesContent.esm.js.map +1 -1
- package/dist/components/{CategoriesForm → Admin/CategoriesContent}/CategoriesForm.esm.js +3 -7
- package/dist/components/Admin/CategoriesContent/CategoriesForm.esm.js.map +1 -0
- package/dist/components/Admin/DeleteDialog/DeleteDialog.esm.js +30 -0
- package/dist/components/Admin/DeleteDialog/DeleteDialog.esm.js.map +1 -0
- package/dist/components/{TagsPage/useDeleteTagDialogState.esm.js → Admin/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 +13 -18
- package/dist/components/Admin/TagsContent/TagsContent.esm.js.map +1 -1
- package/dist/components/{TagsForm → Admin/TagsContent}/TagsForm.esm.js +3 -7
- package/dist/components/Admin/TagsContent/TagsForm.esm.js.map +1 -0
- package/dist/components/AnnouncementPage/AnnouncementPage.esm.js +1 -1
- package/dist/components/AnnouncementPage/AnnouncementPage.esm.js.map +1 -1
- package/dist/components/AnnouncementsCard/AnnouncementsCard.esm.js +6 -11
- package/dist/components/AnnouncementsCard/AnnouncementsCard.esm.js.map +1 -1
- package/dist/components/AnnouncementsPage/AnnouncementsPage.esm.js +24 -140
- package/dist/components/AnnouncementsPage/AnnouncementsPage.esm.js.map +1 -1
- package/dist/components/AnnouncementsPage/ContextMenu.esm.js +5 -22
- package/dist/components/AnnouncementsPage/ContextMenu.esm.js.map +1 -1
- package/dist/components/AnnouncementsTimeline/AnnouncementsTimeline.esm.js +1 -1
- package/dist/components/AnnouncementsTimeline/AnnouncementsTimeline.esm.js.map +1 -1
- package/dist/components/NewAnnouncementBanner/NewAnnouncementBanner.esm.js +1 -1
- package/dist/components/NewAnnouncementBanner/NewAnnouncementBanner.esm.js.map +1 -1
- package/dist/components/Router.esm.js +6 -31
- package/dist/components/Router.esm.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/plugin.esm.js.map +1 -1
- package/dist/routes.esm.js +1 -21
- package/dist/routes.esm.js.map +1 -1
- package/package.json +2 -2
- package/dist/components/AnnouncementForm/AnnouncementForm.esm.js.map +0 -1
- package/dist/components/AnnouncementForm/CategoryInput.esm.js.map +0 -1
- package/dist/components/AnnouncementForm/OnBehalfTeamDropdown.esm.js.map +0 -1
- package/dist/components/AnnouncementForm/TagsInput.esm.js.map +0 -1
- package/dist/components/AnnouncementsPage/DeleteAnnouncementDialog.esm.js +0 -31
- package/dist/components/AnnouncementsPage/DeleteAnnouncementDialog.esm.js.map +0 -1
- package/dist/components/AnnouncementsPage/useDeleteAnnouncementDialogState.esm.js +0 -29
- package/dist/components/AnnouncementsPage/useDeleteAnnouncementDialogState.esm.js.map +0 -1
- package/dist/components/CategoriesForm/CategoriesForm.esm.js.map +0 -1
- package/dist/components/CategoriesPage/CategoriesPage.esm.js +0 -129
- package/dist/components/CategoriesPage/CategoriesPage.esm.js.map +0 -1
- package/dist/components/CategoriesPage/DeleteCategoryDialog.esm.js +0 -16
- package/dist/components/CategoriesPage/DeleteCategoryDialog.esm.js.map +0 -1
- package/dist/components/CategoriesPage/useDeleteCategoryDialogState.esm.js +0 -29
- package/dist/components/CategoriesPage/useDeleteCategoryDialogState.esm.js.map +0 -1
- package/dist/components/CreateAnnouncementPage/CreateAnnouncementPage.esm.js +0 -63
- package/dist/components/CreateAnnouncementPage/CreateAnnouncementPage.esm.js.map +0 -1
- package/dist/components/EditAnnouncementPage/EditAnnouncementPage.esm.js +0 -72
- package/dist/components/EditAnnouncementPage/EditAnnouncementPage.esm.js.map +0 -1
- package/dist/components/NewCategoryDialog/NewCategoryDialog.esm.js +0 -58
- package/dist/components/NewCategoryDialog/NewCategoryDialog.esm.js.map +0 -1
- package/dist/components/NewTagDialog/NewTagDialog.esm.js +0 -71
- package/dist/components/NewTagDialog/NewTagDialog.esm.js.map +0 -1
- package/dist/components/TagsForm/TagsForm.esm.js.map +0 -1
- package/dist/components/TagsPage/DeleteTagDialog.esm.js +0 -16
- package/dist/components/TagsPage/DeleteTagDialog.esm.js.map +0 -1
- package/dist/components/TagsPage/TagsPage.esm.js +0 -122
- package/dist/components/TagsPage/TagsPage.esm.js.map +0 -1
- package/dist/components/TagsPage/useDeleteTagDialogState.esm.js.map +0 -1
- /package/dist/components/{AnnouncementForm → Admin/AnnouncementsContent/AnnouncementForm}/AnnouncementForm.esm.js +0 -0
- /package/dist/components/{AnnouncementForm → Admin/AnnouncementsContent/AnnouncementForm}/CategoryInput.esm.js +0 -0
- /package/dist/components/{AnnouncementForm → Admin/AnnouncementsContent/AnnouncementForm}/OnBehalfTeamDropdown.esm.js +0 -0
- /package/dist/components/{AnnouncementForm → Admin/AnnouncementsContent/AnnouncementForm}/TagsInput.esm.js +0 -0
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { Routes, Route } from 'react-router-dom';
|
|
3
3
|
import { RequirePermission } from '@backstage/plugin-permission-react';
|
|
4
|
-
import { announcementCreatePermission
|
|
5
|
-
import { announcementViewRouteRef,
|
|
4
|
+
import { announcementCreatePermission } from '@backstage-community/plugin-announcements-common';
|
|
5
|
+
import { announcementViewRouteRef, announcementAdminRouteRef } from '../routes.esm.js';
|
|
6
6
|
import { AnnouncementsPage } from './AnnouncementsPage/AnnouncementsPage.esm.js';
|
|
7
7
|
import { AnnouncementPage } from './AnnouncementPage/AnnouncementPage.esm.js';
|
|
8
|
-
import { CreateAnnouncementPage } from './CreateAnnouncementPage/CreateAnnouncementPage.esm.js';
|
|
9
|
-
import { EditAnnouncementPage } from './EditAnnouncementPage/EditAnnouncementPage.esm.js';
|
|
10
|
-
import { CategoriesPage } from './CategoriesPage/CategoriesPage.esm.js';
|
|
11
8
|
import { AdminPortal } from './Admin/AdminPortal/AdminPortal.esm.js';
|
|
12
9
|
import 'react';
|
|
13
10
|
import '@backstage/core-components';
|
|
@@ -18,7 +15,7 @@ import '@material-ui/core';
|
|
|
18
15
|
import '@uiw/react-md-editor';
|
|
19
16
|
import 'luxon';
|
|
20
17
|
import 'slugify';
|
|
21
|
-
import './AnnouncementForm/CategoryInput.esm.js';
|
|
18
|
+
import './Admin/AnnouncementsContent/AnnouncementForm/CategoryInput.esm.js';
|
|
22
19
|
import '@mui/material/TextField';
|
|
23
20
|
import '@mui/material/Autocomplete';
|
|
24
21
|
import '@mui/material/CircularProgress';
|
|
@@ -26,7 +23,7 @@ import 'react-use/esm/useAsync';
|
|
|
26
23
|
import '@backstage/catalog-model';
|
|
27
24
|
import '@mui/material/Box';
|
|
28
25
|
import '@mui/material/Typography';
|
|
29
|
-
import './AnnouncementForm/TagsInput.esm.js';
|
|
26
|
+
import './Admin/AnnouncementsContent/AnnouncementForm/TagsInput.esm.js';
|
|
30
27
|
import '@mui/material/Button';
|
|
31
28
|
import '@mui/material/Divider';
|
|
32
29
|
import '@mui/material/FormControlLabel';
|
|
@@ -38,7 +35,6 @@ import '@mui/material/Switch';
|
|
|
38
35
|
import '@material-ui/icons/Delete';
|
|
39
36
|
import '@material-ui/icons/Edit';
|
|
40
37
|
import '@material-ui/icons/Visibility';
|
|
41
|
-
import { TagsPage } from './TagsPage/TagsPage.esm.js';
|
|
42
38
|
|
|
43
39
|
const Router = (props) => {
|
|
44
40
|
const propsWithDefaults = {
|
|
@@ -58,20 +54,6 @@ const Router = (props) => {
|
|
|
58
54
|
element: /* @__PURE__ */ jsx(AnnouncementPage, { ...propsWithDefaults })
|
|
59
55
|
}
|
|
60
56
|
),
|
|
61
|
-
/* @__PURE__ */ jsx(
|
|
62
|
-
Route,
|
|
63
|
-
{
|
|
64
|
-
path: `${announcementCreateRouteRef.path}`,
|
|
65
|
-
element: /* @__PURE__ */ jsx(RequirePermission, { permission: announcementCreatePermission, children: /* @__PURE__ */ jsx(CreateAnnouncementPage, { ...propsWithDefaults }) })
|
|
66
|
-
}
|
|
67
|
-
),
|
|
68
|
-
/* @__PURE__ */ jsx(
|
|
69
|
-
Route,
|
|
70
|
-
{
|
|
71
|
-
path: `${announcementEditRouteRef.path}`,
|
|
72
|
-
element: /* @__PURE__ */ jsx(RequirePermission, { permission: announcementUpdatePermission, children: /* @__PURE__ */ jsx(EditAnnouncementPage, { ...propsWithDefaults }) })
|
|
73
|
-
}
|
|
74
|
-
),
|
|
75
57
|
/* @__PURE__ */ jsx(
|
|
76
58
|
Route,
|
|
77
59
|
{
|
|
@@ -82,15 +64,8 @@ const Router = (props) => {
|
|
|
82
64
|
/* @__PURE__ */ jsx(
|
|
83
65
|
Route,
|
|
84
66
|
{
|
|
85
|
-
path: `${
|
|
86
|
-
element: /* @__PURE__ */ jsx(
|
|
87
|
-
}
|
|
88
|
-
),
|
|
89
|
-
/* @__PURE__ */ jsx(
|
|
90
|
-
Route,
|
|
91
|
-
{
|
|
92
|
-
path: `${tagsListRouteRef.path}`,
|
|
93
|
-
element: /* @__PURE__ */ jsx(TagsPage, { ...propsWithDefaults })
|
|
67
|
+
path: `${announcementAdminRouteRef.path}`,
|
|
68
|
+
element: /* @__PURE__ */ jsx(RequirePermission, { permission: announcementCreatePermission, children: /* @__PURE__ */ jsx(AdminPortal, {}) })
|
|
94
69
|
}
|
|
95
70
|
)
|
|
96
71
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Router.esm.js","sources":["../../src/components/Router.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 { Routes, Route } from 'react-router-dom';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport {
|
|
1
|
+
{"version":3,"file":"Router.esm.js","sources":["../../src/components/Router.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 { Routes, Route } from 'react-router-dom';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { announcementCreatePermission } from '@backstage-community/plugin-announcements-common';\nimport { announcementAdminRouteRef, announcementViewRouteRef } from '../routes';\nimport { AnnouncementsPage, AnnouncementsPageProps } from './AnnouncementsPage';\nimport { AnnouncementPage } from './AnnouncementPage';\nimport { AdminPortal } from './Admin';\nimport { MarkdownRendererTypeProps } from './MarkdownRenderer';\n\ntype RouterProps = {\n themeId?: string;\n title?: string;\n subtitle?: string;\n category?: string;\n hideContextMenu?: boolean;\n cardOptions?: {\n titleLength: number | undefined;\n };\n buttonOptions?: {\n name: string | undefined;\n };\n hideInactive?: boolean;\n hideStartAt?: boolean;\n markdownRenderer?: MarkdownRendererTypeProps;\n defaultInactive?: boolean;\n};\n\nexport const Router = (props: RouterProps) => {\n const propsWithDefaults: AnnouncementsPageProps = {\n themeId: 'home',\n title: 'Announcements',\n hideInactive: false,\n hideStartAt: false,\n markdownRenderer: 'backstage',\n ...props,\n };\n\n return (\n <Routes>\n <Route path=\"/\" element={<AnnouncementsPage {...propsWithDefaults} />} />\n <Route\n path={`${announcementViewRouteRef.path}`}\n element={<AnnouncementPage {...propsWithDefaults} />}\n />\n <Route\n path={`${announcementAdminRouteRef.path}`}\n element={\n <RequirePermission permission={announcementCreatePermission}>\n <AdminPortal />\n </RequirePermission>\n }\n />\n <Route\n path={`${announcementAdminRouteRef.path}`}\n element={\n <RequirePermission permission={announcementCreatePermission}>\n <AdminPortal />\n </RequirePermission>\n }\n />\n </Routes>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0Ca,MAAA,MAAA,GAAS,CAAC,KAAuB,KAAA;AAC5C,EAAA,MAAM,iBAA4C,GAAA;AAAA,IAChD,OAAS,EAAA,MAAA;AAAA,IACT,KAAO,EAAA,eAAA;AAAA,IACP,YAAc,EAAA,KAAA;AAAA,IACd,WAAa,EAAA,KAAA;AAAA,IACb,gBAAkB,EAAA,WAAA;AAAA,IAClB,GAAG;AAAA,GACL;AAEA,EAAA,4BACG,MACC,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,KAAA,EAAA,EAAM,MAAK,GAAI,EAAA,OAAA,sBAAU,iBAAmB,EAAA,EAAA,GAAG,mBAAmB,CAAI,EAAA,CAAA;AAAA,oBACvE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,CAAG,EAAA,wBAAA,CAAyB,IAAI,CAAA,CAAA;AAAA,QACtC,OAAS,kBAAA,GAAA,CAAC,gBAAkB,EAAA,EAAA,GAAG,iBAAmB,EAAA;AAAA;AAAA,KACpD;AAAA,oBACA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,CAAG,EAAA,yBAAA,CAA0B,IAAI,CAAA,CAAA;AAAA,QACvC,yBACG,GAAA,CAAA,iBAAA,EAAA,EAAkB,YAAY,4BAC7B,EAAA,QAAA,kBAAA,GAAA,CAAC,eAAY,CACf,EAAA;AAAA;AAAA,KAEJ;AAAA,oBACA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,CAAG,EAAA,yBAAA,CAA0B,IAAI,CAAA,CAAA;AAAA,QACvC,yBACG,GAAA,CAAA,iBAAA,EAAA,EAAkB,YAAY,4BAC7B,EAAA,QAAA,kBAAA,GAAA,CAAC,eAAY,CACf,EAAA;AAAA;AAAA;AAEJ,GACF,EAAA,CAAA;AAEJ;;;;"}
|
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
|
/**
|
|
@@ -115,9 +115,6 @@ declare const AnnouncementsCard: ({ title, max, category, active, variant, sortB
|
|
|
115
115
|
category?: string | undefined;
|
|
116
116
|
active?: boolean | undefined;
|
|
117
117
|
variant?: _backstage_core_components.InfoCardVariants | undefined;
|
|
118
|
-
/**
|
|
119
|
-
* @public
|
|
120
|
-
*/
|
|
121
118
|
sortBy?: "created_at" | "start_at" | undefined;
|
|
122
119
|
order?: "desc" | "asc" | undefined;
|
|
123
120
|
current?: boolean | 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/dist/routes.esm.js
CHANGED
|
@@ -8,31 +8,11 @@ const announcementAdminRouteRef = createSubRouteRef({
|
|
|
8
8
|
path: "/admin",
|
|
9
9
|
parent: rootRouteRef
|
|
10
10
|
});
|
|
11
|
-
const announcementCreateRouteRef = createSubRouteRef({
|
|
12
|
-
id: "announcements/create",
|
|
13
|
-
path: "/create",
|
|
14
|
-
parent: rootRouteRef
|
|
15
|
-
});
|
|
16
|
-
const announcementEditRouteRef = createSubRouteRef({
|
|
17
|
-
id: "announcements/edit",
|
|
18
|
-
path: "/edit/:id",
|
|
19
|
-
parent: rootRouteRef
|
|
20
|
-
});
|
|
21
11
|
const announcementViewRouteRef = createSubRouteRef({
|
|
22
12
|
id: "announcements/view",
|
|
23
13
|
path: "/view/:id",
|
|
24
14
|
parent: rootRouteRef
|
|
25
15
|
});
|
|
26
|
-
const categoriesListRouteRef = createSubRouteRef({
|
|
27
|
-
id: "announcements/categories",
|
|
28
|
-
path: "/categories",
|
|
29
|
-
parent: rootRouteRef
|
|
30
|
-
});
|
|
31
|
-
const tagsListRouteRef = createSubRouteRef({
|
|
32
|
-
id: "announcements/tags",
|
|
33
|
-
path: "/tags",
|
|
34
|
-
parent: rootRouteRef
|
|
35
|
-
});
|
|
36
16
|
|
|
37
|
-
export { announcementAdminRouteRef,
|
|
17
|
+
export { announcementAdminRouteRef, announcementViewRouteRef, rootRouteRef };
|
|
38
18
|
//# sourceMappingURL=routes.esm.js.map
|
package/dist/routes.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.esm.js","sources":["../src/routes.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 { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'announcements',\n});\n\nexport const announcementAdminRouteRef = createSubRouteRef({\n id: 'announcements/admin',\n path: '/admin',\n parent: rootRouteRef,\n});\n\nexport const
|
|
1
|
+
{"version":3,"file":"routes.esm.js","sources":["../src/routes.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 { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'announcements',\n});\n\nexport const announcementAdminRouteRef = createSubRouteRef({\n id: 'announcements/admin',\n path: '/admin',\n parent: rootRouteRef,\n});\n\nexport const announcementViewRouteRef = createSubRouteRef({\n id: 'announcements/view',\n path: '/view/:id',\n parent: rootRouteRef,\n});\n"],"names":[],"mappings":";;AAiBO,MAAM,eAAe,cAAe,CAAA;AAAA,EACzC,EAAI,EAAA;AACN,CAAC;AAEM,MAAM,4BAA4B,iBAAkB,CAAA;AAAA,EACzD,EAAI,EAAA,qBAAA;AAAA,EACJ,IAAM,EAAA,QAAA;AAAA,EACN,MAAQ,EAAA;AACV,CAAC;AAEM,MAAM,2BAA2B,iBAAkB,CAAA;AAAA,EACxD,EAAI,EAAA,oBAAA;AAAA,EACJ,IAAM,EAAA,WAAA;AAAA,EACN,MAAQ,EAAA;AACV,CAAC;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage-community/plugin-announcements",
|
|
3
|
-
"version": "
|
|
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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AnnouncementForm.esm.js","sources":["../../../src/components/AnnouncementForm/AnnouncementForm.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useState, type ChangeEvent, type FormEvent } from 'react';\nimport MDEditor from '@uiw/react-md-editor';\nimport { DateTime } from 'luxon';\nimport slugify from 'slugify';\nimport { InfoCard } from '@backstage/core-components';\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\n\nimport {\n CreateAnnouncementRequest,\n useAnnouncementsTranslation,\n announcementsApiRef,\n} from '@backstage-community/plugin-announcements-react';\nimport { Announcement } from '@backstage-community/plugin-announcements-common';\n\nimport CategoryInput from './CategoryInput';\nimport OnBehalfTeamDropdown from './OnBehalfTeamDropdown';\nimport TagsInput from './TagsInput';\n\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Divider from '@mui/material/Divider';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport FormGroup from '@mui/material/FormGroup';\nimport Grid from '@mui/material/Grid';\nimport Paper from '@mui/material/Paper';\nimport SaveAltIcon from '@mui/icons-material/SaveAlt';\nimport Switch from '@mui/material/Switch';\nimport TextField from '@mui/material/TextField';\nimport Typography from '@mui/material/Typography';\n\ntype AnnouncementFormProps = {\n initialData: Announcement;\n onSubmit: (data: CreateAnnouncementRequest) => Promise<void>;\n};\n\nexport const AnnouncementForm = ({\n initialData,\n onSubmit,\n}: AnnouncementFormProps) => {\n const identityApi = useApi(identityApiRef);\n const announcementsApi = useApi(announcementsApiRef);\n const { t } = useAnnouncementsTranslation();\n\n const formattedStartAt = initialData.start_at\n ? DateTime.fromISO(initialData.start_at).toISODate()\n : DateTime.now().toISODate();\n\n const formattedUntilDate = initialData.until_date\n ? DateTime.fromISO(initialData.until_date).toISODate()\n : DateTime.now().endOf('day').plus({ days: 7 }).toISODate();\n\n const [form, setForm] = useState({\n ...initialData,\n active: initialData.active ?? true,\n category: initialData.category?.slug,\n start_at: formattedStartAt || '',\n until_date: formattedUntilDate || '',\n tags: initialData.tags?.map(tag => tag.slug) || undefined,\n sendNotification: initialData.sendNotification ?? false,\n });\n const [loading, setLoading] = useState(false);\n const [onBehalfOfSelectedTeam, setOnBehalfOfSelectedTeam] = useState(\n initialData.on_behalf_of || '',\n );\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n setForm({\n ...form,\n [event.target.id]: event.target.value,\n });\n };\n\n const handleChangeActive = (event: ChangeEvent<HTMLInputElement>) => {\n setForm({\n ...form,\n [event.target.name]: event.target.checked,\n });\n };\n\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n setLoading(true);\n event.preventDefault();\n\n const userIdentity = await identityApi.getBackstageIdentity();\n\n if (form.tags && form.tags.length > 0) {\n const existingTags = await announcementsApi.tags();\n\n const processedTags = [];\n\n for (const tagValue of form.tags) {\n const slugifiedTag = slugify(tagValue.trim(), { lower: true });\n\n if (existingTags.some(tag => tag.slug === slugifiedTag)) {\n processedTags.push(slugifiedTag);\n } else {\n try {\n await announcementsApi.createTag({ title: tagValue });\n processedTags.push(slugifiedTag);\n } catch (error) {\n if (error.status === 409) {\n processedTags.push(slugifiedTag);\n } else {\n throw error;\n }\n }\n }\n }\n\n form.tags = processedTags;\n }\n\n const { id, created_at, ...announcementData } = form;\n\n const createRequest: CreateAnnouncementRequest = {\n ...announcementData,\n publisher: userIdentity.userEntityRef,\n on_behalf_of: onBehalfOfSelectedTeam,\n };\n\n try {\n await onSubmit(createRequest);\n } catch (error) {\n throw error;\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <InfoCard>\n <Box p={3}>\n <Typography variant=\"h5\" gutterBottom>\n {initialData.title\n ? t('announcementForm.editAnnouncement')\n : t('announcementForm.newAnnouncement')}\n </Typography>\n <Divider sx={{ mb: 3 }} />\n <form onSubmit={handleSubmit}>\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <TextField\n id=\"title\"\n label={t('announcementForm.title')}\n value={form.title}\n onChange={handleChange}\n variant=\"outlined\"\n fullWidth\n required\n />\n </Grid>\n\n <Grid item xs={12}>\n <TextField\n id=\"excerpt\"\n label={t('announcementForm.excerpt')}\n value={form.excerpt}\n onChange={handleChange}\n variant=\"outlined\"\n fullWidth\n required\n multiline\n />\n </Grid>\n\n <Grid item xs={12}>\n <Paper\n variant=\"outlined\"\n sx={{ borderRadius: 2, borderColor: 'divider', p: 2 }}\n >\n <MDEditor\n value={form.body}\n style={{ minHeight: '30rem' }}\n onChange={value =>\n setForm({ ...form, ...{ body: value || '' } })\n }\n />\n </Paper>\n </Grid>\n\n <Grid item xs={12} sm={6}>\n <CategoryInput\n setForm={setForm}\n form={form}\n initialValue={initialData.category?.title ?? ''}\n />\n </Grid>\n\n <Grid item xs={12} sm={6}>\n <OnBehalfTeamDropdown\n selectedTeam={onBehalfOfSelectedTeam}\n onChange={setOnBehalfOfSelectedTeam}\n />\n </Grid>\n\n <Grid item xs={12} sm={6}>\n <TagsInput setForm={setForm} form={form} />\n </Grid>\n\n <Grid item xs={12} sm={3}>\n <TextField\n variant=\"outlined\"\n label={t('announcementForm.startAt')}\n id=\"start-at-date\"\n type=\"date\"\n value={form.start_at}\n InputLabelProps={{ shrink: true }}\n required\n fullWidth\n onChange={e =>\n setForm({\n ...form,\n start_at: e.target.value,\n })\n }\n />\n </Grid>\n\n <Grid item xs={12} sm={3}>\n <TextField\n variant=\"outlined\"\n label={t('announcementForm.untilDate')}\n id=\"until-date\"\n type=\"date\"\n value={form.until_date}\n InputLabelProps={{ shrink: true }}\n fullWidth\n onChange={e =>\n setForm({\n ...form,\n until_date: e.target.value,\n })\n }\n inputProps={{\n min: DateTime.fromISO(form.start_at)\n .endOf('day')\n .plus({ days: 1 })\n .toISODate(),\n }}\n />\n </Grid>\n\n <Grid item xs={12}>\n <Divider />\n </Grid>\n\n <Grid item xs={12}>\n <FormGroup row style={{ justifyContent: 'flex-end' }}>\n <FormControlLabel\n control={\n <Switch\n name=\"active\"\n checked={form.active}\n onChange={handleChangeActive}\n color=\"primary\"\n />\n }\n label={t('announcementForm.active')}\n />\n <FormControlLabel\n control={\n <Switch\n name=\"sendNotification\"\n checked={form.sendNotification}\n onChange={handleChangeActive}\n color=\"primary\"\n />\n }\n label=\"Send Notification\"\n />\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"submit\"\n disabled={loading || !form.body}\n size=\"large\"\n startIcon={<SaveAltIcon />}\n >\n {t('announcementForm.submit')}\n </Button>\n </FormGroup>\n </Grid>\n </Grid>\n </form>\n </Box>\n </InfoCard>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CategoryInput.esm.js","sources":["../../../src/components/AnnouncementForm/CategoryInput.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 { SetStateAction } from 'react';\nimport TextField from '@mui/material/TextField';\nimport Autocomplete, { createFilterOptions } from '@mui/material/Autocomplete';\nimport { Category } from '@backstage-community/plugin-announcements-common';\nimport {\n useAnnouncementsTranslation,\n useCategories,\n} from '@backstage-community/plugin-announcements-react';\nimport CircularProgress from '@mui/material/CircularProgress';\n\ntype CategoryInputProps = {\n setForm: (\n value: SetStateAction<{\n category: string | undefined;\n tags: string[] | undefined;\n id: string;\n publisher: string;\n title: string;\n excerpt: string;\n body: string;\n created_at: string;\n active: boolean;\n start_at: string;\n until_date: string;\n sendNotification: boolean;\n updated_at: string;\n }>,\n ) => void;\n form: {\n category: string | undefined;\n tags: string[] | undefined;\n id: string;\n publisher: string;\n title: string;\n excerpt: string;\n body: string;\n created_at: string;\n active: boolean;\n start_at: string;\n until_date: string;\n sendNotification: boolean;\n updated_at: string;\n };\n initialValue: string;\n};\n\nconst filter = createFilterOptions<Category>();\n\nfunction prepareCategoryFromInput(\n inputCategory: Category | string,\n localizedCreate?: string,\n): string {\n return (\n typeof inputCategory === 'string' ? inputCategory : inputCategory.title\n )\n .replace(localizedCreate ? `${localizedCreate} ` : 'Create ', '')\n .replaceAll('\"', '');\n}\n\nexport default function CategoryInput({\n setForm,\n form,\n initialValue,\n}: CategoryInputProps) {\n const { categories, loading: categoriesLoading } = useCategories();\n const { t } = useAnnouncementsTranslation();\n\n return (\n <Autocomplete\n fullWidth\n value={initialValue ?? ''}\n onChange={async (_, newValue) => {\n if (!newValue) {\n setForm({ ...form, category: undefined });\n return;\n }\n\n const newCategory = prepareCategoryFromInput(\n newValue,\n t('announcementForm.categoryInput.create'),\n );\n setForm({ ...form, category: newCategory });\n }}\n filterOptions={(options, params) => {\n const filtered = filter(options, params);\n const { inputValue } = params;\n\n /*\n Suggest the creation of a new category. This adds the new value to the list of options\n and creates the new category when the form is submitted.\n */\n const isExisting = options.some(\n option =>\n inputValue.toLocaleLowerCase('en-US') ===\n option.title.toLocaleLowerCase('en-US'),\n );\n if (inputValue !== '' && !isExisting) {\n filtered.push({\n title: `${t(\n 'announcementForm.categoryInput.create',\n )} \"${inputValue}\"`,\n slug: inputValue.toLocaleLowerCase('en-US'),\n });\n }\n\n return filtered;\n }}\n selectOnFocus\n handleHomeEndKeys\n loading={categoriesLoading}\n id=\"category-input-field\"\n options={categories || []}\n getOptionLabel={option => {\n // Value selected with enter, right from the input\n return prepareCategoryFromInput(option);\n }}\n renderOption={(props, option) => <li {...props}>{option.title}</li>}\n freeSolo\n renderInput={params => (\n <TextField\n {...params}\n id=\"category\"\n label={t('announcementForm.categoryInput.label')}\n variant=\"outlined\"\n fullWidth\n InputProps={{\n ...params.InputProps,\n endAdornment: (\n <>\n {categoriesLoading ? (\n <CircularProgress color=\"inherit\" size={20} />\n ) : null}\n {params.InputProps.endAdornment}\n </>\n ),\n }}\n />\n )}\n />\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OnBehalfTeamDropdown.esm.js","sources":["../../../src/components/AnnouncementForm/OnBehalfTeamDropdown.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 TextField from '@mui/material/TextField';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\nimport {\n useAnnouncementsTranslation,\n useCatalogEntities,\n} from '@backstage-community/plugin-announcements-react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useMemo } from 'react';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\n\ntype OnBehalfTeamDropdownProps = {\n selectedTeam: string;\n onChange: (team: string) => void;\n};\n\nfunction getTeamDisplayName(team: any): string {\n if (team.kind && team.kind.toLowerCase() === 'group') {\n return team.spec?.profile?.displayName ?? '';\n }\n return '';\n}\n\nexport default function OnBehalfTeamDropdown({\n selectedTeam,\n onChange,\n}: OnBehalfTeamDropdownProps) {\n const { t } = useAnnouncementsTranslation();\n const identityApi = useApi(identityApiRef);\n\n const { value: userOwns } = useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n return [identity.userEntityRef, ...identity.ownershipEntityRefs];\n }, [identityApi]);\n\n const { entities: teams, loading: teamsLoading } = useCatalogEntities(\n userOwns, // refs\n '', // searchTerm\n 25, // limit\n 'Group', // kind\n );\n\n const teamOptions = useMemo(() => {\n return teams.map(team => ({\n entityRef: stringifyEntityRef(team),\n displayName: getTeamDisplayName(team),\n }));\n }, [teams]);\n\n const selectedTeamOption = useMemo(() => {\n return teamOptions.find(team => team.entityRef === selectedTeam) || null;\n }, [teamOptions, selectedTeam]);\n\n return (\n <Autocomplete\n value={selectedTeamOption}\n onChange={(_, newValue) => {\n onChange(newValue?.entityRef || '');\n }}\n options={teamOptions}\n getOptionLabel={team => team.entityRef}\n loading={teamsLoading}\n id=\"team-dropdown-field\"\n renderOption={(props, team) => (\n <Box component=\"li\" {...props}>\n <Box sx={{ display: 'flex', flexDirection: 'column' }}>\n <Typography variant=\"body1\">{team.entityRef}</Typography>\n {team.displayName && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {team.displayName}\n </Typography>\n )}\n </Box>\n </Box>\n )}\n renderInput={params => (\n <TextField\n {...params}\n id=\"team\"\n label={t('announcementForm.onBehalfOf')}\n InputProps={{\n ...params.InputProps,\n endAdornment: (\n <>\n {teamsLoading ? (\n <CircularProgress color=\"inherit\" size={20} />\n ) : null}\n {params.InputProps.endAdornment}\n </>\n ),\n }}\n />\n )}\n />\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TagsInput.esm.js","sources":["../../../src/components/AnnouncementForm/TagsInput.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 { useMemo } from 'react';\nimport Autocomplete, { createFilterOptions } from '@mui/material/Autocomplete';\nimport TextField from '@mui/material/TextField';\nimport Chip from '@mui/material/Chip';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport {\n useTags,\n useAnnouncementsTranslation,\n} from '@backstage-community/plugin-announcements-react';\nimport { Tag } from '@backstage-community/plugin-announcements-common';\n\nexport interface TagOption extends Tag {\n inputValue?: string;\n isNew?: boolean;\n}\n\nconst filter = createFilterOptions<TagOption>();\n\nfunction prepareTagFromInput(input: string | TagOption): string {\n if (typeof input === 'string') {\n return input.toLocaleLowerCase('en-US');\n }\n if (input.inputValue) {\n return input.inputValue.toLocaleLowerCase('en-US');\n }\n return input.title.toLocaleLowerCase('en-US');\n}\n\ninterface TagsInputProps {\n setForm: (form: any) => void;\n form: any;\n}\n\nexport default function TagsInput({ setForm, form }: TagsInputProps) {\n const { tags, loading } = useTags();\n const { t } = useAnnouncementsTranslation();\n const createLabel = t('announcementForm.tagsInput.create');\n\n const existingTags = useMemo(() => {\n if (!form.tags || form.tags.length === 0) return [];\n return form.tags.map((tagSlug: string) => {\n const foundTag = tags?.find(tag => tag.slug === tagSlug);\n return foundTag || { title: tagSlug, slug: tagSlug };\n });\n }, [form.tags, tags]);\n\n const handleTagChange = (_event: any, newValue: (string | TagOption)[]) => {\n if (!newValue || newValue.length === 0) {\n setForm({ ...form, tags: [] });\n return;\n }\n\n const processedTags = newValue.map(item => prepareTagFromInput(item));\n const uniqueTags = Array.from(new Set(processedTags));\n\n setForm({ ...form, tags: uniqueTags });\n };\n\n return (\n <Autocomplete\n fullWidth\n multiple\n freeSolo\n clearOnBlur\n value={existingTags}\n onChange={handleTagChange}\n options={tags || []}\n loading={loading}\n getOptionLabel={(option: string | TagOption) =>\n typeof option === 'string' ? option : option.title\n }\n filterOptions={(options, params) => {\n const filtered = filter(options as TagOption[], params);\n const { inputValue } = params;\n if (\n inputValue.trim() !== '' &&\n !options.some(\n option =>\n typeof option !== 'string' &&\n inputValue.toLocaleLowerCase('en-US') ===\n option.title.toLocaleLowerCase('en-US'),\n )\n ) {\n filtered.push({\n title: `${createLabel} \"${inputValue}\"`,\n slug: inputValue.toLocaleLowerCase('en-US'),\n inputValue,\n isNew: true,\n });\n }\n return filtered;\n }}\n renderTags={(value: (string | TagOption)[], getTagProps) =>\n value.map((option, index) => {\n const tag =\n typeof option === 'string'\n ? { title: option, slug: option.toLocaleLowerCase('en-US') }\n : option;\n\n const tagProps = getTagProps({ index });\n const { key, ...chipProps } = tagProps;\n\n return (\n <Chip\n key={key}\n variant=\"outlined\"\n label={tag.title}\n {...chipProps}\n />\n );\n })\n }\n renderInput={params => (\n <TextField\n {...params}\n label=\"Tags\"\n variant=\"outlined\"\n InputProps={{\n ...params.InputProps,\n endAdornment: (\n <>\n {loading ? (\n <CircularProgress color=\"inherit\" size={20} />\n ) : null}\n {params.InputProps.endAdornment}\n </>\n ),\n }}\n />\n )}\n />\n );\n}\n"],"names":[],"mappings":";;;;;;;;AA+BA,MAAM,SAAS,mBAA+B,EAAA;AAE9C,SAAS,oBAAoB,KAAmC,EAAA;AAC9D,EAAI,IAAA,OAAO,UAAU,QAAU,EAAA;AAC7B,IAAO,OAAA,KAAA,CAAM,kBAAkB,OAAO,CAAA;AAAA;AAExC,EAAA,IAAI,MAAM,UAAY,EAAA;AACpB,IAAO,OAAA,KAAA,CAAM,UAAW,CAAA,iBAAA,CAAkB,OAAO,CAAA;AAAA;AAEnD,EAAO,OAAA,KAAA,CAAM,KAAM,CAAA,iBAAA,CAAkB,OAAO,CAAA;AAC9C;AAOA,SAAwB,SAAU,CAAA,EAAE,OAAS,EAAA,IAAA,EAAwB,EAAA;AACnE,EAAA,MAAM,EAAE,IAAA,EAAM,OAAQ,EAAA,GAAI,OAAQ,EAAA;AAClC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAC1C,EAAM,MAAA,WAAA,GAAc,EAAE,mCAAmC,CAAA;AAEzD,EAAM,MAAA,YAAA,GAAe,QAAQ,MAAM;AACjC,IAAI,IAAA,CAAC,KAAK,IAAQ,IAAA,IAAA,CAAK,KAAK,MAAW,KAAA,CAAA,SAAU,EAAC;AAClD,IAAA,OAAO,IAAK,CAAA,IAAA,CAAK,GAAI,CAAA,CAAC,OAAoB,KAAA;AACxC,MAAA,MAAM,WAAW,IAAM,EAAA,IAAA,CAAK,CAAO,GAAA,KAAA,GAAA,CAAI,SAAS,OAAO,CAAA;AACvD,MAAA,OAAO,QAAY,IAAA,EAAE,KAAO,EAAA,OAAA,EAAS,MAAM,OAAQ,EAAA;AAAA,KACpD,CAAA;AAAA,GACA,EAAA,CAAC,IAAK,CAAA,IAAA,EAAM,IAAI,CAAC,CAAA;AAEpB,EAAM,MAAA,eAAA,GAAkB,CAAC,MAAA,EAAa,QAAqC,KAAA;AACzE,IAAA,IAAI,CAAC,QAAA,IAAY,QAAS,CAAA,MAAA,KAAW,CAAG,EAAA;AACtC,MAAA,OAAA,CAAQ,EAAE,GAAG,IAAA,EAAM,IAAM,EAAA,IAAI,CAAA;AAC7B,MAAA;AAAA;AAGF,IAAA,MAAM,gBAAgB,QAAS,CAAA,GAAA,CAAI,CAAQ,IAAA,KAAA,mBAAA,CAAoB,IAAI,CAAC,CAAA;AACpE,IAAA,MAAM,aAAa,KAAM,CAAA,IAAA,CAAK,IAAI,GAAA,CAAI,aAAa,CAAC,CAAA;AAEpD,IAAA,OAAA,CAAQ,EAAE,GAAG,IAAM,EAAA,IAAA,EAAM,YAAY,CAAA;AAAA,GACvC;AAEA,EACE,uBAAA,GAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,QAAQ,EAAA,IAAA;AAAA,MACR,QAAQ,EAAA,IAAA;AAAA,MACR,WAAW,EAAA,IAAA;AAAA,MACX,KAAO,EAAA,YAAA;AAAA,MACP,QAAU,EAAA,eAAA;AAAA,MACV,OAAA,EAAS,QAAQ,EAAC;AAAA,MAClB,OAAA;AAAA,MACA,gBAAgB,CAAC,MAAA,KACf,OAAO,MAAW,KAAA,QAAA,GAAW,SAAS,MAAO,CAAA,KAAA;AAAA,MAE/C,aAAA,EAAe,CAAC,OAAA,EAAS,MAAW,KAAA;AAClC,QAAM,MAAA,QAAA,GAAW,MAAO,CAAA,OAAA,EAAwB,MAAM,CAAA;AACtD,QAAM,MAAA,EAAE,YAAe,GAAA,MAAA;AACvB,QAAA,IACE,UAAW,CAAA,IAAA,EAAW,KAAA,EAAA,IACtB,CAAC,OAAQ,CAAA,IAAA;AAAA,UACP,CAAA,MAAA,KACE,OAAO,MAAA,KAAW,QAClB,IAAA,UAAA,CAAW,iBAAkB,CAAA,OAAO,CAClC,KAAA,MAAA,CAAO,KAAM,CAAA,iBAAA,CAAkB,OAAO;AAAA,SAE5C,EAAA;AACA,UAAA,QAAA,CAAS,IAAK,CAAA;AAAA,YACZ,KAAO,EAAA,CAAA,EAAG,WAAW,CAAA,EAAA,EAAK,UAAU,CAAA,CAAA,CAAA;AAAA,YACpC,IAAA,EAAM,UAAW,CAAA,iBAAA,CAAkB,OAAO,CAAA;AAAA,YAC1C,UAAA;AAAA,YACA,KAAO,EAAA;AAAA,WACR,CAAA;AAAA;AAEH,QAAO,OAAA,QAAA;AAAA,OACT;AAAA,MACA,UAAA,EAAY,CAAC,KAA+B,EAAA,WAAA,KAC1C,MAAM,GAAI,CAAA,CAAC,QAAQ,KAAU,KAAA;AAC3B,QAAA,MAAM,GACJ,GAAA,OAAO,MAAW,KAAA,QAAA,GACd,EAAE,KAAA,EAAO,MAAQ,EAAA,IAAA,EAAM,MAAO,CAAA,iBAAA,CAAkB,OAAO,CAAA,EACvD,GAAA,MAAA;AAEN,QAAA,MAAM,QAAW,GAAA,WAAA,CAAY,EAAE,KAAA,EAAO,CAAA;AACtC,QAAA,MAAM,EAAE,GAAA,EAAK,GAAG,SAAA,EAAc,GAAA,QAAA;AAE9B,QACE,uBAAA,GAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEC,OAAQ,EAAA,UAAA;AAAA,YACR,OAAO,GAAI,CAAA,KAAA;AAAA,YACV,GAAG;AAAA,WAAA;AAAA,UAHC;AAAA,SAIP;AAAA,OAEH,CAAA;AAAA,MAEH,aAAa,CACX,MAAA,qBAAA,GAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACE,GAAG,MAAA;AAAA,UACJ,KAAM,EAAA,MAAA;AAAA,UACN,OAAQ,EAAA,UAAA;AAAA,UACR,UAAY,EAAA;AAAA,YACV,GAAG,MAAO,CAAA,UAAA;AAAA,YACV,8BAEK,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,cAAA,OAAA,uBACE,gBAAiB,EAAA,EAAA,KAAA,EAAM,SAAU,EAAA,IAAA,EAAM,IAAI,CAC1C,GAAA,IAAA;AAAA,cACH,OAAO,UAAW,CAAA;AAAA,aACrB,EAAA;AAAA;AAEJ;AAAA;AACF;AAAA,GAEJ;AAEJ;;;;"}
|
|
@@ -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/AnnouncementsPage/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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useDeleteAnnouncementDialogState.esm.js","sources":["../../../src/components/AnnouncementsPage/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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CategoriesForm.esm.js","sources":["../../../src/components/CategoriesForm/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 {\n announcementCreatePermission,\n Category,\n} from '@backstage-community/plugin-announcements-common';\nimport { usePermission } from '@backstage/plugin-permission-react';\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\n const { loading: loadingCreatePermission, allowed: canCreateCategory } =\n usePermission({\n permission: announcementCreatePermission,\n });\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 || !form || loadingCreatePermission || !canCreateCategory\n }\n >\n {t('categoriesForm.submit')}\n </Button>\n </form>\n </InfoCard>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AA4BA,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;AAE1C,EAAA,MAAM,EAAE,OAAS,EAAA,uBAAA,EAAyB,OAAS,EAAA,iBAAA,KACjD,aAAc,CAAA;AAAA,IACZ,UAAY,EAAA;AAAA,GACb,CAAA;AAEH,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,QACE,EAAA,OAAA,IAAW,CAAC,IAAA,IAAQ,2BAA2B,CAAC,iBAAA;AAAA,YAGjD,YAAE,uBAAuB;AAAA;AAAA;AAC5B,OACF,EAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
-
import { useState } from 'react';
|
|
3
|
-
import { Page, Header, Content, ErrorPanel, Table } from '@backstage/core-components';
|
|
4
|
-
import { NewCategoryDialog } from '../NewCategoryDialog/NewCategoryDialog.esm.js';
|
|
5
|
-
import { useAnnouncementsTranslation, announcementsApiRef, useCategories } from '@backstage-community/plugin-announcements-react';
|
|
6
|
-
import { announcementCreatePermission } from '@backstage-community/plugin-announcements-common';
|
|
7
|
-
import { useDeleteCategoryDialogState } from './useDeleteCategoryDialogState.esm.js';
|
|
8
|
-
import { useApi, alertApiRef } from '@backstage/core-plugin-api';
|
|
9
|
-
import { DeleteCategoryDialog } from './DeleteCategoryDialog.esm.js';
|
|
10
|
-
import { IconButton, Typography } from '@material-ui/core';
|
|
11
|
-
import AddIcon from '@material-ui/icons/Add';
|
|
12
|
-
import DeleteIcon from '@material-ui/icons/Delete';
|
|
13
|
-
import { usePermission } from '@backstage/plugin-permission-react';
|
|
14
|
-
import { ContextMenu } from '../AnnouncementsPage/ContextMenu.esm.js';
|
|
15
|
-
|
|
16
|
-
const CategoriesTable = () => {
|
|
17
|
-
const [newCategoryDialogOpen, setNewCategoryDialogOpen] = useState(false);
|
|
18
|
-
const announcementsApi = useApi(announcementsApiRef);
|
|
19
|
-
const alertApi = useApi(alertApiRef);
|
|
20
|
-
const { categories, loading, error, retry: refresh } = useCategories();
|
|
21
|
-
const {
|
|
22
|
-
isOpen: isDeleteDialogOpen,
|
|
23
|
-
open: openDeleteDialog,
|
|
24
|
-
close: closeDeleteDialog,
|
|
25
|
-
category: categoryToDelete
|
|
26
|
-
} = useDeleteCategoryDialogState();
|
|
27
|
-
const { t } = useAnnouncementsTranslation();
|
|
28
|
-
if (error) {
|
|
29
|
-
return /* @__PURE__ */ jsx(ErrorPanel, { error });
|
|
30
|
-
}
|
|
31
|
-
const onNewCategoryDialogClose = () => {
|
|
32
|
-
setNewCategoryDialogOpen(false);
|
|
33
|
-
refresh();
|
|
34
|
-
};
|
|
35
|
-
const onCancelDelete = () => {
|
|
36
|
-
closeDeleteDialog();
|
|
37
|
-
};
|
|
38
|
-
const onConfirmDelete = async () => {
|
|
39
|
-
closeDeleteDialog();
|
|
40
|
-
try {
|
|
41
|
-
await announcementsApi.deleteCategory(categoryToDelete.slug);
|
|
42
|
-
alertApi.post({
|
|
43
|
-
message: t("categoriesTable.categoryDeleted"),
|
|
44
|
-
severity: "success"
|
|
45
|
-
});
|
|
46
|
-
} catch (err) {
|
|
47
|
-
alertApi.post({
|
|
48
|
-
message: err.body.error.message,
|
|
49
|
-
severity: "error"
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
refresh();
|
|
53
|
-
};
|
|
54
|
-
const columns = [
|
|
55
|
-
{
|
|
56
|
-
title: t("categoriesTable.slug"),
|
|
57
|
-
field: "slug",
|
|
58
|
-
highlight: true
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
title: t("categoriesTable.title"),
|
|
62
|
-
field: "title"
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
title: t("categoriesTable.actions"),
|
|
66
|
-
field: "actions",
|
|
67
|
-
render: (category) => {
|
|
68
|
-
return /* @__PURE__ */ jsx(IconButton, { onClick: () => openDeleteDialog(category), children: /* @__PURE__ */ jsx(DeleteIcon, {}) });
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
];
|
|
72
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
73
|
-
/* @__PURE__ */ jsx(
|
|
74
|
-
Table,
|
|
75
|
-
{
|
|
76
|
-
options: { paging: false },
|
|
77
|
-
data: categories || [],
|
|
78
|
-
columns,
|
|
79
|
-
isLoading: loading,
|
|
80
|
-
title: "Categories",
|
|
81
|
-
actions: [
|
|
82
|
-
{
|
|
83
|
-
icon: () => /* @__PURE__ */ jsx(AddIcon, {}),
|
|
84
|
-
tooltip: t("categoriesTable.addTooltip"),
|
|
85
|
-
isFreeAction: true,
|
|
86
|
-
onClick: (_event) => setNewCategoryDialogOpen(true)
|
|
87
|
-
}
|
|
88
|
-
],
|
|
89
|
-
emptyContent: /* @__PURE__ */ jsx(Typography, { style: { padding: 2, textAlign: "center" }, children: t("categoriesTable.noCategoriesFound") })
|
|
90
|
-
}
|
|
91
|
-
),
|
|
92
|
-
/* @__PURE__ */ jsx(
|
|
93
|
-
NewCategoryDialog,
|
|
94
|
-
{
|
|
95
|
-
open: newCategoryDialogOpen,
|
|
96
|
-
onClose: onNewCategoryDialogClose
|
|
97
|
-
}
|
|
98
|
-
),
|
|
99
|
-
/* @__PURE__ */ jsx(
|
|
100
|
-
DeleteCategoryDialog,
|
|
101
|
-
{
|
|
102
|
-
open: isDeleteDialogOpen,
|
|
103
|
-
onCancel: onCancelDelete,
|
|
104
|
-
onConfirm: onConfirmDelete
|
|
105
|
-
}
|
|
106
|
-
)
|
|
107
|
-
] });
|
|
108
|
-
};
|
|
109
|
-
const CategoriesPage = (props) => {
|
|
110
|
-
const { t } = useAnnouncementsTranslation();
|
|
111
|
-
const { allowed: canCreate } = usePermission({
|
|
112
|
-
permission: announcementCreatePermission
|
|
113
|
-
});
|
|
114
|
-
const { themeId, hideContextMenu = false } = props;
|
|
115
|
-
return /* @__PURE__ */ jsxs(Page, { themeId, children: [
|
|
116
|
-
/* @__PURE__ */ jsx(
|
|
117
|
-
Header,
|
|
118
|
-
{
|
|
119
|
-
title: t("categoriesPage.title"),
|
|
120
|
-
subtitle: t("categoriesPage.subtitle"),
|
|
121
|
-
children: !hideContextMenu && canCreate && /* @__PURE__ */ jsx(ContextMenu, {})
|
|
122
|
-
}
|
|
123
|
-
),
|
|
124
|
-
/* @__PURE__ */ jsx(Content, { children: /* @__PURE__ */ jsx(CategoriesTable, {}) })
|
|
125
|
-
] });
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
export { CategoriesPage };
|
|
129
|
-
//# sourceMappingURL=CategoriesPage.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CategoriesPage.esm.js","sources":["../../../src/components/CategoriesPage/CategoriesPage.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 Page,\n Header,\n Content,\n Table,\n TableColumn,\n ErrorPanel,\n} from '@backstage/core-components';\nimport { NewCategoryDialog } from '../NewCategoryDialog';\nimport {\n useAnnouncementsTranslation,\n useCategories,\n announcementsApiRef,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n announcementCreatePermission,\n Category,\n} from '@backstage-community/plugin-announcements-common';\nimport { useDeleteCategoryDialogState } from './useDeleteCategoryDialogState';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { DeleteCategoryDialog } from './DeleteCategoryDialog';\nimport { ResponseError } from '@backstage/errors';\nimport { IconButton, Typography } from '@material-ui/core';\nimport AddIcon from '@material-ui/icons/Add';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { ContextMenu } from '../AnnouncementsPage/ContextMenu';\n\nconst CategoriesTable = () => {\n const [newCategoryDialogOpen, setNewCategoryDialogOpen] = useState(false);\n const announcementsApi = useApi(announcementsApiRef);\n const alertApi = useApi(alertApiRef);\n\n const { categories, loading, error, retry: refresh } = useCategories();\n\n const {\n isOpen: isDeleteDialogOpen,\n open: openDeleteDialog,\n close: closeDeleteDialog,\n category: categoryToDelete,\n } = useDeleteCategoryDialogState();\n const { t } = useAnnouncementsTranslation();\n\n if (error) {\n return <ErrorPanel error={error} />;\n }\n\n const onNewCategoryDialogClose = () => {\n setNewCategoryDialogOpen(false);\n refresh();\n };\n\n const onCancelDelete = () => {\n closeDeleteDialog();\n };\n const onConfirmDelete = async () => {\n closeDeleteDialog();\n\n try {\n await announcementsApi.deleteCategory(categoryToDelete!.slug);\n\n alertApi.post({\n message: t('categoriesTable.categoryDeleted'),\n severity: 'success',\n });\n } catch (err) {\n alertApi.post({\n message: (err as ResponseError).body.error.message,\n severity: 'error',\n });\n }\n\n refresh();\n };\n\n const columns: TableColumn<Category>[] = [\n {\n title: t('categoriesTable.slug'),\n field: 'slug',\n highlight: true,\n },\n {\n title: t('categoriesTable.title'),\n field: 'title',\n },\n {\n title: t('categoriesTable.actions'),\n field: 'actions',\n render: category => {\n return (\n <IconButton onClick={() => openDeleteDialog(category)}>\n <DeleteIcon />\n </IconButton>\n );\n },\n },\n ];\n\n return (\n <>\n <Table\n options={{ paging: false }}\n data={categories || []}\n columns={columns}\n isLoading={loading}\n title=\"Categories\"\n actions={[\n {\n icon: () => <AddIcon />,\n tooltip: t('categoriesTable.addTooltip'),\n isFreeAction: true,\n onClick: _event => setNewCategoryDialogOpen(true),\n },\n ]}\n emptyContent={\n <Typography style={{ padding: 2, textAlign: 'center' }}>\n {t('categoriesTable.noCategoriesFound')}\n </Typography>\n }\n />\n <NewCategoryDialog\n open={newCategoryDialogOpen}\n onClose={onNewCategoryDialogClose}\n />\n <DeleteCategoryDialog\n open={isDeleteDialogOpen}\n onCancel={onCancelDelete}\n onConfirm={onConfirmDelete}\n />\n </>\n );\n};\n\ntype CategoriesPageProps = {\n themeId: string;\n hideContextMenu?: boolean;\n};\n\nexport const CategoriesPage = (props: CategoriesPageProps) => {\n const { t } = useAnnouncementsTranslation();\n const { allowed: canCreate } = usePermission({\n permission: announcementCreatePermission,\n });\n const { themeId, hideContextMenu = false } = props;\n\n return (\n <Page themeId={themeId}>\n <Header\n title={t('categoriesPage.title')}\n subtitle={t('categoriesPage.subtitle')}\n >\n {!hideContextMenu && canCreate && <ContextMenu />}\n </Header>\n\n <Content>\n <CategoriesTable />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -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/CategoriesPage/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;;;;"}
|