@backstage-community/plugin-announcements 0.16.2 → 1.0.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 +102 -0
- package/dist/alpha/entityCards.esm.js +1 -0
- package/dist/alpha/entityCards.esm.js.map +1 -1
- package/dist/alpha.d.ts +10 -9
- 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 +70 -7
- package/dist/components/Admin/AnnouncementsContent/AnnouncementsContent.esm.js.map +1 -1
- package/dist/components/Admin/AnnouncementsContent/DeleteAnnouncementDialog.esm.js.map +1 -0
- package/dist/components/Admin/AnnouncementsContent/useDeleteAnnouncementDialogState.esm.js.map +1 -0
- package/dist/components/Admin/CategoriesContent/CategoriesContent.esm.js +3 -3
- package/dist/components/Admin/CategoriesContent/CategoriesContent.esm.js.map +1 -1
- package/dist/components/Admin/CategoriesContent/CategoriesForm.esm.js.map +1 -0
- package/dist/components/Admin/CategoriesContent/DeleteCategoryDialog.esm.js.map +1 -0
- package/dist/components/Admin/CategoriesContent/useDeleteCategoryDialogState.esm.js.map +1 -0
- package/dist/components/Admin/TagsContent/DeleteTagDialog.esm.js.map +1 -0
- package/dist/components/Admin/TagsContent/TagsContent.esm.js +3 -3
- package/dist/components/Admin/TagsContent/TagsContent.esm.js.map +1 -1
- package/dist/components/Admin/TagsContent/TagsForm.esm.js.map +1 -0
- package/dist/components/Admin/TagsContent/useDeleteTagDialogState.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 +3 -3
- package/dist/components/AnnouncementsCard/AnnouncementsCard.esm.js.map +1 -1
- package/dist/components/AnnouncementsPage/AnnouncementsPage.esm.js +24 -138
- 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 +3 -3
- package/dist/routes.esm.js +1 -21
- package/dist/routes.esm.js.map +1 -1
- package/package.json +19 -19
- 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.map +0 -1
- 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.map +0 -1
- 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.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
- /package/dist/components/{AnnouncementsPage → Admin/AnnouncementsContent}/DeleteAnnouncementDialog.esm.js +0 -0
- /package/dist/components/{AnnouncementsPage → Admin/AnnouncementsContent}/useDeleteAnnouncementDialogState.esm.js +0 -0
- /package/dist/components/{CategoriesForm → Admin/CategoriesContent}/CategoriesForm.esm.js +0 -0
- /package/dist/components/{CategoriesPage → Admin/CategoriesContent}/DeleteCategoryDialog.esm.js +0 -0
- /package/dist/components/{CategoriesPage → Admin/CategoriesContent}/useDeleteCategoryDialogState.esm.js +0 -0
- /package/dist/components/{TagsPage → Admin/TagsContent}/DeleteTagDialog.esm.js +0 -0
- /package/dist/components/{TagsForm → Admin/TagsContent}/TagsForm.esm.js +0 -0
- /package/dist/components/{TagsPage → Admin/TagsContent}/useDeleteTagDialogState.esm.js +0 -0
|
@@ -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":"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"}
|
|
@@ -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 +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 +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;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useDeleteCategoryDialogState.esm.js","sources":["../../../src/components/CategoriesPage/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,63 +0,0 @@
|
|
|
1
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { useNavigate } from 'react-router-dom';
|
|
3
|
-
import slugify from 'slugify';
|
|
4
|
-
import { Page, Header, Content } from '@backstage/core-components';
|
|
5
|
-
import { useApi, useRouteRef, alertApiRef } from '@backstage/core-plugin-api';
|
|
6
|
-
import { rootRouteRef } from '../../routes.esm.js';
|
|
7
|
-
import { AnnouncementForm } from '../AnnouncementForm/AnnouncementForm.esm.js';
|
|
8
|
-
import { announcementsApiRef, useCategories, useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';
|
|
9
|
-
|
|
10
|
-
const CreateAnnouncementPage = (props) => {
|
|
11
|
-
const announcementsApi = useApi(announcementsApiRef);
|
|
12
|
-
const rootPage = useRouteRef(rootRouteRef);
|
|
13
|
-
const alertApi = useApi(alertApiRef);
|
|
14
|
-
const navigate = useNavigate();
|
|
15
|
-
const { categories } = useCategories();
|
|
16
|
-
const { t } = useAnnouncementsTranslation();
|
|
17
|
-
const onSubmit = async (request) => {
|
|
18
|
-
const { category } = request;
|
|
19
|
-
const slugs = categories.map((c) => c.slug);
|
|
20
|
-
let alertMsg = t("createAnnouncementPage.alertMessage");
|
|
21
|
-
try {
|
|
22
|
-
if (category) {
|
|
23
|
-
const categorySlug = slugify(category, {
|
|
24
|
-
lower: true
|
|
25
|
-
});
|
|
26
|
-
if (slugs.indexOf(categorySlug) === -1) {
|
|
27
|
-
alertMsg = alertMsg.replace(".", "");
|
|
28
|
-
alertMsg = `${alertMsg} ${t(
|
|
29
|
-
"createAnnouncementPage.alertMessageWithNewCategory"
|
|
30
|
-
)} ${category}.`;
|
|
31
|
-
await announcementsApi.createCategory({
|
|
32
|
-
title: category
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
await announcementsApi.createAnnouncement({
|
|
37
|
-
...request,
|
|
38
|
-
category: request.category?.toLocaleLowerCase("en-US")
|
|
39
|
-
});
|
|
40
|
-
alertApi.post({
|
|
41
|
-
message: alertMsg,
|
|
42
|
-
severity: "success",
|
|
43
|
-
display: "transient"
|
|
44
|
-
});
|
|
45
|
-
navigate(rootPage());
|
|
46
|
-
} catch (err) {
|
|
47
|
-
alertApi.post({ message: err.message, severity: "error" });
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
return /* @__PURE__ */ jsxs(Page, { themeId: props.themeId, children: [
|
|
51
|
-
/* @__PURE__ */ jsx(Header, { title: props.title, subtitle: props.subtitle }),
|
|
52
|
-
/* @__PURE__ */ jsx(Content, { children: /* @__PURE__ */ jsx(
|
|
53
|
-
AnnouncementForm,
|
|
54
|
-
{
|
|
55
|
-
initialData: { active: !props.defaultInactive },
|
|
56
|
-
onSubmit
|
|
57
|
-
}
|
|
58
|
-
) })
|
|
59
|
-
] });
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
export { CreateAnnouncementPage };
|
|
63
|
-
//# sourceMappingURL=CreateAnnouncementPage.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CreateAnnouncementPage.esm.js","sources":["../../../src/components/CreateAnnouncementPage/CreateAnnouncementPage.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 { ReactNode } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport slugify from 'slugify';\nimport { Page, Header, Content } from '@backstage/core-components';\nimport { alertApiRef, useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { rootRouteRef } from '../../routes';\nimport { AnnouncementForm } from '../AnnouncementForm';\nimport {\n CreateAnnouncementRequest,\n announcementsApiRef,\n useAnnouncementsTranslation,\n useCategories,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n Announcement,\n Category,\n} from '@backstage-community/plugin-announcements-common';\n\ntype CreateAnnouncementPageProps = {\n themeId: string;\n title: string;\n subtitle?: ReactNode;\n defaultInactive?: boolean;\n};\n\nexport const CreateAnnouncementPage = (props: CreateAnnouncementPageProps) => {\n const announcementsApi = useApi(announcementsApiRef);\n const rootPage = useRouteRef(rootRouteRef);\n const alertApi = useApi(alertApiRef);\n const navigate = useNavigate();\n const { categories } = useCategories();\n const { t } = useAnnouncementsTranslation();\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('createAnnouncementPage.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 'createAnnouncementPage.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({\n message: alertMsg,\n severity: 'success',\n display: 'transient',\n });\n\n navigate(rootPage());\n } catch (err) {\n alertApi.post({ message: (err as Error).message, severity: 'error' });\n }\n };\n\n return (\n <Page themeId={props.themeId}>\n <Header title={props.title} subtitle={props.subtitle} />\n\n <Content>\n <AnnouncementForm\n initialData={{ active: !props.defaultInactive } as Announcement}\n onSubmit={onSubmit}\n />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAwCa,MAAA,sBAAA,GAAyB,CAAC,KAAuC,KAAA;AAC5E,EAAM,MAAA,gBAAA,GAAmB,OAAO,mBAAmB,CAAA;AACnD,EAAM,MAAA,QAAA,GAAW,YAAY,YAAY,CAAA;AACzC,EAAM,MAAA,QAAA,GAAW,OAAO,WAAW,CAAA;AACnC,EAAA,MAAM,WAAW,WAAY,EAAA;AAC7B,EAAM,MAAA,EAAE,UAAW,EAAA,GAAI,aAAc,EAAA;AACrC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAE1C,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,qCAAqC,CAAA;AAEtD,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,IAAK,CAAA;AAAA,QACZ,OAAS,EAAA,QAAA;AAAA,QACT,QAAU,EAAA,SAAA;AAAA,QACV,OAAS,EAAA;AAAA,OACV,CAAA;AAED,MAAA,QAAA,CAAS,UAAU,CAAA;AAAA,aACZ,GAAK,EAAA;AACZ,MAAA,QAAA,CAAS,KAAK,EAAE,OAAA,EAAU,IAAc,OAAS,EAAA,QAAA,EAAU,SAAS,CAAA;AAAA;AACtE,GACF;AAEA,EAAA,uBACG,IAAA,CAAA,IAAA,EAAA,EAAK,OAAS,EAAA,KAAA,CAAM,OACnB,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAO,KAAO,EAAA,KAAA,CAAM,KAAO,EAAA,QAAA,EAAU,MAAM,QAAU,EAAA,CAAA;AAAA,wBAErD,OACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,WAAa,EAAA,EAAE,MAAQ,EAAA,CAAC,MAAM,eAAgB,EAAA;AAAA,QAC9C;AAAA;AAAA,KAEJ,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
-
import useAsync from 'react-use/esm/useAsync';
|
|
3
|
-
import slugify from 'slugify';
|
|
4
|
-
import { Page, Header, Content, Progress } from '@backstage/core-components';
|
|
5
|
-
import { useApi, alertApiRef, useRouteRefParams, useRouteRef } from '@backstage/core-plugin-api';
|
|
6
|
-
import { AnnouncementForm } from '../AnnouncementForm/AnnouncementForm.esm.js';
|
|
7
|
-
import { announcementEditRouteRef, rootRouteRef } from '../../routes.esm.js';
|
|
8
|
-
import { announcementsApiRef, useCategories, useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';
|
|
9
|
-
import { Alert } from '@material-ui/lab';
|
|
10
|
-
import { useNavigate } from 'react-router-dom';
|
|
11
|
-
|
|
12
|
-
const EditAnnouncementPage = (props) => {
|
|
13
|
-
const announcementsApi = useApi(announcementsApiRef);
|
|
14
|
-
const alertApi = useApi(alertApiRef);
|
|
15
|
-
const { id } = useRouteRefParams(announcementEditRouteRef);
|
|
16
|
-
const { value, loading, error } = useAsync(
|
|
17
|
-
async () => announcementsApi.announcementByID(id)
|
|
18
|
-
);
|
|
19
|
-
const { categories } = useCategories();
|
|
20
|
-
const { t } = useAnnouncementsTranslation();
|
|
21
|
-
const navigate = useNavigate();
|
|
22
|
-
const rootPage = useRouteRef(rootRouteRef);
|
|
23
|
-
let title = props.title;
|
|
24
|
-
let content = /* @__PURE__ */ jsx(Progress, {});
|
|
25
|
-
const onSubmit = async (request) => {
|
|
26
|
-
const { category } = request;
|
|
27
|
-
const slugs = categories.map((c) => c.slug);
|
|
28
|
-
let updateMsg = t("editAnnouncementPage.updatedMessage");
|
|
29
|
-
try {
|
|
30
|
-
if (category) {
|
|
31
|
-
const categorySlug = slugify(category, {
|
|
32
|
-
lower: true
|
|
33
|
-
});
|
|
34
|
-
if (slugs.indexOf(categorySlug) === -1) {
|
|
35
|
-
updateMsg = updateMsg.replace(".", "");
|
|
36
|
-
updateMsg = `${updateMsg} ${t(
|
|
37
|
-
"editAnnouncementPage.updatedMessageWithNewCategory"
|
|
38
|
-
)} ${category}.`;
|
|
39
|
-
await announcementsApi.createCategory({
|
|
40
|
-
title: category
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
await announcementsApi.updateAnnouncement(id, request);
|
|
45
|
-
alertApi.post({
|
|
46
|
-
message: updateMsg,
|
|
47
|
-
severity: "success",
|
|
48
|
-
display: "transient"
|
|
49
|
-
});
|
|
50
|
-
navigate(rootPage());
|
|
51
|
-
} catch (err) {
|
|
52
|
-
alertApi.post({ message: err.message, severity: "error" });
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
if (loading) {
|
|
56
|
-
content = /* @__PURE__ */ jsx(Progress, {});
|
|
57
|
-
} else if (error) {
|
|
58
|
-
content = /* @__PURE__ */ jsx(Alert, { severity: "error", children: error.message });
|
|
59
|
-
} else if (!value) {
|
|
60
|
-
content = /* @__PURE__ */ jsx(Alert, { severity: "error", children: t("editAnnouncementPage.notFoundMessage") });
|
|
61
|
-
} else {
|
|
62
|
-
title = `${t("editAnnouncementPage.edit")} "${value.title}" \u2013 ${title}`;
|
|
63
|
-
content = /* @__PURE__ */ jsx(AnnouncementForm, { initialData: value, onSubmit });
|
|
64
|
-
}
|
|
65
|
-
return /* @__PURE__ */ jsxs(Page, { themeId: props.themeId, children: [
|
|
66
|
-
/* @__PURE__ */ jsx(Header, { title, subtitle: props.subtitle }),
|
|
67
|
-
/* @__PURE__ */ jsx(Content, { children: content })
|
|
68
|
-
] });
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
export { EditAnnouncementPage };
|
|
72
|
-
//# sourceMappingURL=EditAnnouncementPage.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EditAnnouncementPage.esm.js","sources":["../../../src/components/EditAnnouncementPage/EditAnnouncementPage.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 { ReactNode } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport slugify from 'slugify';\nimport { Page, Header, Content, Progress } from '@backstage/core-components';\nimport {\n alertApiRef,\n useApi,\n useRouteRef,\n useRouteRefParams,\n} from '@backstage/core-plugin-api';\nimport { AnnouncementForm } from '../AnnouncementForm';\nimport { announcementEditRouteRef } from '../../routes';\nimport {\n announcementsApiRef,\n CreateAnnouncementRequest,\n useAnnouncementsTranslation,\n useCategories,\n} from '@backstage-community/plugin-announcements-react';\nimport { Alert } from '@material-ui/lab';\nimport { rootRouteRef } from '../../routes';\nimport { useNavigate } from 'react-router-dom';\n\ntype EditAnnouncementPageProps = {\n themeId: string;\n title: string;\n subtitle?: ReactNode;\n};\n\nexport const EditAnnouncementPage = (props: EditAnnouncementPageProps) => {\n const announcementsApi = useApi(announcementsApiRef);\n const alertApi = useApi(alertApiRef);\n const { id } = useRouteRefParams(announcementEditRouteRef);\n const { value, loading, error } = useAsync(async () =>\n announcementsApi.announcementByID(id),\n );\n const { categories } = useCategories();\n const { t } = useAnnouncementsTranslation();\n const navigate = useNavigate();\n const rootPage = useRouteRef(rootRouteRef);\n\n let title = props.title;\n let content: ReactNode = <Progress />;\n\n const onSubmit = async (request: CreateAnnouncementRequest) => {\n const { category } = request;\n\n const slugs = categories.map(c => 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(id, request);\n alertApi.post({\n message: updateMsg,\n severity: 'success',\n display: 'transient',\n });\n navigate(rootPage());\n } catch (err) {\n alertApi.post({ message: (err as Error).message, severity: 'error' });\n }\n };\n\n if (loading) {\n content = <Progress />;\n } else if (error) {\n content = <Alert severity=\"error\">{error.message}</Alert>;\n } else if (!value) {\n content = (\n <Alert severity=\"error\">\n {t('editAnnouncementPage.notFoundMessage')}\n </Alert>\n );\n } else {\n title = `${t('editAnnouncementPage.edit')} \"${value.title}\" – ${title}`;\n content = <AnnouncementForm initialData={value} onSubmit={onSubmit} />;\n }\n\n return (\n <Page themeId={props.themeId}>\n <Header title={title} subtitle={props.subtitle} />\n\n <Content>{content}</Content>\n </Page>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;AA2Ca,MAAA,oBAAA,GAAuB,CAAC,KAAqC,KAAA;AACxE,EAAM,MAAA,gBAAA,GAAmB,OAAO,mBAAmB,CAAA;AACnD,EAAM,MAAA,QAAA,GAAW,OAAO,WAAW,CAAA;AACnC,EAAA,MAAM,EAAE,EAAA,EAAO,GAAA,iBAAA,CAAkB,wBAAwB,CAAA;AACzD,EAAA,MAAM,EAAE,KAAA,EAAO,OAAS,EAAA,KAAA,EAAU,GAAA,QAAA;AAAA,IAAS,YACzC,gBAAiB,CAAA,gBAAA,CAAiB,EAAE;AAAA,GACtC;AACA,EAAM,MAAA,EAAE,UAAW,EAAA,GAAI,aAAc,EAAA;AACrC,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAC1C,EAAA,MAAM,WAAW,WAAY,EAAA;AAC7B,EAAM,MAAA,QAAA,GAAW,YAAY,YAAY,CAAA;AAEzC,EAAA,IAAI,QAAQ,KAAM,CAAA,KAAA;AAClB,EAAI,IAAA,OAAA,uBAAsB,QAAS,EAAA,EAAA,CAAA;AAEnC,EAAM,MAAA,QAAA,GAAW,OAAO,OAAuC,KAAA;AAC7D,IAAM,MAAA,EAAE,UAAa,GAAA,OAAA;AAErB,IAAA,MAAM,KAAQ,GAAA,UAAA,CAAW,GAAI,CAAA,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA;AACxC,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,EAAA,EAAI,OAAO,CAAA;AACrD,MAAA,QAAA,CAAS,IAAK,CAAA;AAAA,QACZ,OAAS,EAAA,SAAA;AAAA,QACT,QAAU,EAAA,SAAA;AAAA,QACV,OAAS,EAAA;AAAA,OACV,CAAA;AACD,MAAA,QAAA,CAAS,UAAU,CAAA;AAAA,aACZ,GAAK,EAAA;AACZ,MAAA,QAAA,CAAS,KAAK,EAAE,OAAA,EAAU,IAAc,OAAS,EAAA,QAAA,EAAU,SAAS,CAAA;AAAA;AACtE,GACF;AAEA,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,OAAA,uBAAW,QAAS,EAAA,EAAA,CAAA;AAAA,aACX,KAAO,EAAA;AAChB,IAAA,OAAA,mBAAW,GAAA,CAAA,KAAA,EAAA,EAAM,QAAS,EAAA,OAAA,EAAS,gBAAM,OAAQ,EAAA,CAAA;AAAA,GACnD,MAAA,IAAW,CAAC,KAAO,EAAA;AACjB,IAAA,OAAA,uBACG,KAAM,EAAA,EAAA,QAAA,EAAS,OACb,EAAA,QAAA,EAAA,CAAA,CAAE,sCAAsC,CAC3C,EAAA,CAAA;AAAA,GAEG,MAAA;AACL,IAAQ,KAAA,GAAA,CAAA,EAAG,EAAE,2BAA2B,CAAC,KAAK,KAAM,CAAA,KAAK,YAAO,KAAK,CAAA,CAAA;AACrE,IAAA,OAAA,mBAAW,GAAA,CAAA,gBAAA,EAAA,EAAiB,WAAa,EAAA,KAAA,EAAO,QAAoB,EAAA,CAAA;AAAA;AAGtE,EAAA,uBACG,IAAA,CAAA,IAAA,EAAA,EAAK,OAAS,EAAA,KAAA,CAAM,OACnB,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAO,EAAA,EAAA,KAAA,EAAc,QAAU,EAAA,KAAA,CAAM,QAAU,EAAA,CAAA;AAAA,oBAEhD,GAAA,CAAC,WAAS,QAAQ,EAAA,OAAA,EAAA;AAAA,GACpB,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { useState } from 'react';
|
|
3
|
-
import { useApi, alertApiRef } from '@backstage/core-plugin-api';
|
|
4
|
-
import { announcementsApiRef, useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';
|
|
5
|
-
import { Dialog, DialogTitle, DialogContent, TextField, DialogActions, Button } from '@material-ui/core';
|
|
6
|
-
|
|
7
|
-
const NewCategoryDialog = (props) => {
|
|
8
|
-
const announcementsApi = useApi(announcementsApiRef);
|
|
9
|
-
const { t } = useAnnouncementsTranslation();
|
|
10
|
-
const alertApi = useApi(alertApiRef);
|
|
11
|
-
const [title, setTitle] = useState("");
|
|
12
|
-
const onClose = () => {
|
|
13
|
-
props.onClose();
|
|
14
|
-
};
|
|
15
|
-
const onConfirm = async () => {
|
|
16
|
-
try {
|
|
17
|
-
await announcementsApi.createCategory({
|
|
18
|
-
title
|
|
19
|
-
});
|
|
20
|
-
alertApi.post({
|
|
21
|
-
message: t("newCategoryDialog.createdMessage"),
|
|
22
|
-
severity: "success",
|
|
23
|
-
display: "transient"
|
|
24
|
-
});
|
|
25
|
-
props.onClose();
|
|
26
|
-
setTitle("");
|
|
27
|
-
} catch (err) {
|
|
28
|
-
alertApi.post({ message: err.message, severity: "error" });
|
|
29
|
-
setTitle("");
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
const handleChange = (event) => {
|
|
33
|
-
setTitle(event.target.value);
|
|
34
|
-
};
|
|
35
|
-
return /* @__PURE__ */ jsxs(Dialog, { open: props.open, onClose, children: [
|
|
36
|
-
/* @__PURE__ */ jsx(DialogTitle, { children: t("newCategoryDialog.newCategory") }),
|
|
37
|
-
/* @__PURE__ */ jsx(DialogContent, { children: /* @__PURE__ */ jsx(
|
|
38
|
-
TextField,
|
|
39
|
-
{
|
|
40
|
-
margin: "normal",
|
|
41
|
-
id: "title",
|
|
42
|
-
label: t("newCategoryDialog.title"),
|
|
43
|
-
value: title,
|
|
44
|
-
onChange: handleChange,
|
|
45
|
-
type: "text",
|
|
46
|
-
fullWidth: true,
|
|
47
|
-
required: true
|
|
48
|
-
}
|
|
49
|
-
) }),
|
|
50
|
-
/* @__PURE__ */ jsxs(DialogActions, { children: [
|
|
51
|
-
/* @__PURE__ */ jsx(Button, { onClick: onClose, children: t("newCategoryDialog.cancelButton") }),
|
|
52
|
-
/* @__PURE__ */ jsx(Button, { onClick: onConfirm, color: "primary", disabled: !title.trim(), children: t("newCategoryDialog.createButton") })
|
|
53
|
-
] })
|
|
54
|
-
] });
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
export { NewCategoryDialog };
|
|
58
|
-
//# sourceMappingURL=NewCategoryDialog.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NewCategoryDialog.esm.js","sources":["../../../src/components/NewCategoryDialog/NewCategoryDialog.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, useState } from 'react';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport {\n announcementsApiRef,\n useAnnouncementsTranslation,\n} from '@backstage-community/plugin-announcements-react';\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n TextField,\n} from '@material-ui/core';\n\ntype NewCategoryDialogProps = {\n open: boolean;\n onClose: () => any;\n};\n\nexport const NewCategoryDialog = (props: NewCategoryDialogProps) => {\n const announcementsApi = useApi(announcementsApiRef);\n const { t } = useAnnouncementsTranslation();\n const alertApi = useApi(alertApiRef);\n\n const [title, setTitle] = useState('');\n\n const onClose = () => {\n props.onClose();\n };\n\n const onConfirm = async () => {\n try {\n await announcementsApi.createCategory({\n title,\n });\n alertApi.post({\n message: t('newCategoryDialog.createdMessage'),\n severity: 'success',\n display: 'transient',\n });\n props.onClose();\n setTitle('');\n } catch (err) {\n alertApi.post({ message: (err as Error).message, severity: 'error' });\n setTitle('');\n }\n };\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n setTitle(event.target.value);\n };\n\n return (\n <Dialog open={props.open} onClose={onClose}>\n <DialogTitle>{t('newCategoryDialog.newCategory')}</DialogTitle>\n <DialogContent>\n <TextField\n margin=\"normal\"\n id=\"title\"\n label={t('newCategoryDialog.title')}\n value={title}\n onChange={handleChange}\n type=\"text\"\n fullWidth\n required\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose}>{t('newCategoryDialog.cancelButton')}</Button>\n\n <Button onClick={onConfirm} color=\"primary\" disabled={!title.trim()}>\n {t('newCategoryDialog.createButton')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":";;;;;;AAmCa,MAAA,iBAAA,GAAoB,CAAC,KAAkC,KAAA;AAClE,EAAM,MAAA,gBAAA,GAAmB,OAAO,mBAAmB,CAAA;AACnD,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAC1C,EAAM,MAAA,QAAA,GAAW,OAAO,WAAW,CAAA;AAEnC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,EAAE,CAAA;AAErC,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,KAAA,CAAM,OAAQ,EAAA;AAAA,GAChB;AAEA,EAAA,MAAM,YAAY,YAAY;AAC5B,IAAI,IAAA;AACF,MAAA,MAAM,iBAAiB,cAAe,CAAA;AAAA,QACpC;AAAA,OACD,CAAA;AACD,MAAA,QAAA,CAAS,IAAK,CAAA;AAAA,QACZ,OAAA,EAAS,EAAE,kCAAkC,CAAA;AAAA,QAC7C,QAAU,EAAA,SAAA;AAAA,QACV,OAAS,EAAA;AAAA,OACV,CAAA;AACD,MAAA,KAAA,CAAM,OAAQ,EAAA;AACd,MAAA,QAAA,CAAS,EAAE,CAAA;AAAA,aACJ,GAAK,EAAA;AACZ,MAAA,QAAA,CAAS,KAAK,EAAE,OAAA,EAAU,IAAc,OAAS,EAAA,QAAA,EAAU,SAAS,CAAA;AACpE,MAAA,QAAA,CAAS,EAAE,CAAA;AAAA;AACb,GACF;AAEA,EAAM,MAAA,YAAA,GAAe,CAAC,KAAyC,KAAA;AAC7D,IAAS,QAAA,CAAA,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,GAC7B;AAEA,EAAA,uBACG,IAAA,CAAA,MAAA,EAAA,EAAO,IAAM,EAAA,KAAA,CAAM,MAAM,OACxB,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,WAAA,EAAA,EAAa,QAAE,EAAA,CAAA,CAAA,+BAA+B,CAAE,EAAA,CAAA;AAAA,wBAChD,aACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,MAAO,EAAA,QAAA;AAAA,QACP,EAAG,EAAA,OAAA;AAAA,QACH,KAAA,EAAO,EAAE,yBAAyB,CAAA;AAAA,QAClC,KAAO,EAAA,KAAA;AAAA,QACP,QAAU,EAAA,YAAA;AAAA,QACV,IAAK,EAAA,MAAA;AAAA,QACL,SAAS,EAAA,IAAA;AAAA,QACT,QAAQ,EAAA;AAAA;AAAA,KAEZ,EAAA,CAAA;AAAA,yBACC,aACC,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAO,EAAA,EAAA,OAAA,EAAS,OAAU,EAAA,QAAA,EAAA,CAAA,CAAE,gCAAgC,CAAE,EAAA,CAAA;AAAA,sBAE9D,GAAA,CAAA,MAAA,EAAA,EAAO,OAAS,EAAA,SAAA,EAAW,KAAM,EAAA,SAAA,EAAU,QAAU,EAAA,CAAC,KAAM,CAAA,IAAA,EAC1D,EAAA,QAAA,EAAA,CAAA,CAAE,gCAAgC,CACrC,EAAA;AAAA,KACF,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { useState } from 'react';
|
|
3
|
-
import { Dialog, DialogTitle, DialogContent, TextField, DialogActions, Button } from '@material-ui/core';
|
|
4
|
-
import { useApi, alertApiRef } from '@backstage/core-plugin-api';
|
|
5
|
-
import { announcementsApiRef, useAnnouncementsTranslation } from '@backstage-community/plugin-announcements-react';
|
|
6
|
-
|
|
7
|
-
const NewTagDialog = (props) => {
|
|
8
|
-
const { open, onClose, onSubmit } = props;
|
|
9
|
-
const [title, setTitle] = useState("");
|
|
10
|
-
const [loading, setLoading] = useState(false);
|
|
11
|
-
const alertApi = useApi(alertApiRef);
|
|
12
|
-
const announcementsApi = useApi(announcementsApiRef);
|
|
13
|
-
const { t } = useAnnouncementsTranslation();
|
|
14
|
-
const handleClose = () => {
|
|
15
|
-
setTitle("");
|
|
16
|
-
onClose();
|
|
17
|
-
};
|
|
18
|
-
const handleSubmit = async () => {
|
|
19
|
-
if (!title) return;
|
|
20
|
-
setLoading(true);
|
|
21
|
-
try {
|
|
22
|
-
const request = { title };
|
|
23
|
-
await announcementsApi.createTag(request);
|
|
24
|
-
alertApi.post({
|
|
25
|
-
message: t("newTagDialog.createdMessage"),
|
|
26
|
-
severity: "success",
|
|
27
|
-
display: "transient"
|
|
28
|
-
});
|
|
29
|
-
setTitle("");
|
|
30
|
-
onSubmit();
|
|
31
|
-
} catch (error) {
|
|
32
|
-
alertApi.post({
|
|
33
|
-
message: error.message,
|
|
34
|
-
severity: "error"
|
|
35
|
-
});
|
|
36
|
-
} finally {
|
|
37
|
-
setLoading(false);
|
|
38
|
-
onClose();
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
return /* @__PURE__ */ jsxs(Dialog, { open, onClose: handleClose, children: [
|
|
42
|
-
/* @__PURE__ */ jsx(DialogTitle, { children: t("newTagDialog.newTag") }),
|
|
43
|
-
/* @__PURE__ */ jsx(DialogContent, { children: /* @__PURE__ */ jsx(
|
|
44
|
-
TextField,
|
|
45
|
-
{
|
|
46
|
-
margin: "dense",
|
|
47
|
-
id: "title",
|
|
48
|
-
label: t("newTagDialog.title"),
|
|
49
|
-
fullWidth: true,
|
|
50
|
-
value: title,
|
|
51
|
-
onChange: (e) => setTitle(e.target.value),
|
|
52
|
-
required: true
|
|
53
|
-
}
|
|
54
|
-
) }),
|
|
55
|
-
/* @__PURE__ */ jsxs(DialogActions, { children: [
|
|
56
|
-
/* @__PURE__ */ jsx(Button, { onClick: handleClose, color: "primary", children: t("newTagDialog.cancelButton") }),
|
|
57
|
-
/* @__PURE__ */ jsx(
|
|
58
|
-
Button,
|
|
59
|
-
{
|
|
60
|
-
onClick: handleSubmit,
|
|
61
|
-
color: "primary",
|
|
62
|
-
disabled: !title || loading,
|
|
63
|
-
children: t("newTagDialog.createButton")
|
|
64
|
-
}
|
|
65
|
-
)
|
|
66
|
-
] })
|
|
67
|
-
] });
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
export { NewTagDialog };
|
|
71
|
-
//# sourceMappingURL=NewTagDialog.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NewTagDialog.esm.js","sources":["../../../src/components/NewTagDialog/NewTagDialog.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 Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n TextField,\n} from '@material-ui/core';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport {\n useAnnouncementsTranslation,\n announcementsApiRef,\n CreateTagRequest,\n} from '@backstage-community/plugin-announcements-react';\n\nexport type NewTagDialogProps = {\n open: boolean;\n onClose: () => void;\n onSubmit: () => void;\n};\n\nexport const NewTagDialog = (props: NewTagDialogProps) => {\n const { open, onClose, onSubmit } = props;\n const [title, setTitle] = useState('');\n const [loading, setLoading] = useState(false);\n const alertApi = useApi(alertApiRef);\n const announcementsApi = useApi(announcementsApiRef);\n const { t } = useAnnouncementsTranslation();\n\n const handleClose = () => {\n setTitle('');\n onClose();\n };\n\n const handleSubmit = async () => {\n if (!title) return;\n\n setLoading(true);\n try {\n const request: CreateTagRequest = { title };\n await announcementsApi.createTag(request);\n\n alertApi.post({\n message: t('newTagDialog.createdMessage'),\n severity: 'success',\n display: 'transient',\n });\n\n setTitle('');\n onSubmit();\n } catch (error) {\n alertApi.post({\n message: (error as Error).message,\n severity: 'error',\n });\n } finally {\n setLoading(false);\n onClose();\n }\n };\n\n return (\n <Dialog open={open} onClose={handleClose}>\n <DialogTitle>{t('newTagDialog.newTag')}</DialogTitle>\n <DialogContent>\n <TextField\n margin=\"dense\"\n id=\"title\"\n label={t('newTagDialog.title')}\n fullWidth\n value={title}\n onChange={e => setTitle(e.target.value)}\n required\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} color=\"primary\">\n {t('newTagDialog.cancelButton')}\n </Button>\n <Button\n onClick={handleSubmit}\n color=\"primary\"\n disabled={!title || loading}\n >\n {t('newTagDialog.createButton')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":";;;;;;AAqCa,MAAA,YAAA,GAAe,CAAC,KAA6B,KAAA;AACxD,EAAA,MAAM,EAAE,IAAA,EAAM,OAAS,EAAA,QAAA,EAAa,GAAA,KAAA;AACpC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAM,MAAA,QAAA,GAAW,OAAO,WAAW,CAAA;AACnC,EAAM,MAAA,gBAAA,GAAmB,OAAO,mBAAmB,CAAA;AACnD,EAAM,MAAA,EAAE,CAAE,EAAA,GAAI,2BAA4B,EAAA;AAE1C,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAQ,OAAA,EAAA;AAAA,GACV;AAEA,EAAA,MAAM,eAAe,YAAY;AAC/B,IAAA,IAAI,CAAC,KAAO,EAAA;AAEZ,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAI,IAAA;AACF,MAAM,MAAA,OAAA,GAA4B,EAAE,KAAM,EAAA;AAC1C,MAAM,MAAA,gBAAA,CAAiB,UAAU,OAAO,CAAA;AAExC,MAAA,QAAA,CAAS,IAAK,CAAA;AAAA,QACZ,OAAA,EAAS,EAAE,6BAA6B,CAAA;AAAA,QACxC,QAAU,EAAA,SAAA;AAAA,QACV,OAAS,EAAA;AAAA,OACV,CAAA;AAED,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAS,QAAA,EAAA;AAAA,aACF,KAAO,EAAA;AACd,MAAA,QAAA,CAAS,IAAK,CAAA;AAAA,QACZ,SAAU,KAAgB,CAAA,OAAA;AAAA,QAC1B,QAAU,EAAA;AAAA,OACX,CAAA;AAAA,KACD,SAAA;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAQ,OAAA,EAAA;AAAA;AACV,GACF;AAEA,EAAA,uBACG,IAAA,CAAA,MAAA,EAAA,EAAO,IAAY,EAAA,OAAA,EAAS,WAC3B,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,WAAA,EAAA,EAAa,QAAE,EAAA,CAAA,CAAA,qBAAqB,CAAE,EAAA,CAAA;AAAA,wBACtC,aACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,MAAO,EAAA,OAAA;AAAA,QACP,EAAG,EAAA,OAAA;AAAA,QACH,KAAA,EAAO,EAAE,oBAAoB,CAAA;AAAA,QAC7B,SAAS,EAAA,IAAA;AAAA,QACT,KAAO,EAAA,KAAA;AAAA,QACP,QAAU,EAAA,CAAA,CAAA,KAAK,QAAS,CAAA,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACtC,QAAQ,EAAA;AAAA;AAAA,KAEZ,EAAA,CAAA;AAAA,yBACC,aACC,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAO,OAAS,EAAA,WAAA,EAAa,OAAM,SACjC,EAAA,QAAA,EAAA,CAAA,CAAE,2BAA2B,CAChC,EAAA,CAAA;AAAA,sBACA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAS,EAAA,YAAA;AAAA,UACT,KAAM,EAAA,SAAA;AAAA,UACN,QAAA,EAAU,CAAC,KAAS,IAAA,OAAA;AAAA,UAEnB,YAAE,2BAA2B;AAAA;AAAA;AAChC,KACF,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TagsForm.esm.js","sources":["../../../src/components/TagsForm/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 {\n announcementCreatePermission,\n Tag,\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 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\n const { loading: loadingCreatePermission, allowed: canCreateTag } =\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={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 || !form.title || loadingCreatePermission || !canCreateTag\n }\n data-testid=\"tag-submit-button\"\n >\n {t('tagsForm.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,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;AAE1C,EAAA,MAAM,EAAE,OAAS,EAAA,uBAAA,EAAyB,OAAS,EAAA,YAAA,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,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,UACE,OAAW,IAAA,CAAC,IAAK,CAAA,KAAA,IAAS,2BAA2B,CAAC,YAAA;AAAA,gBAExD,aAAY,EAAA,mBAAA;AAAA,gBAEX,YAAE,iBAAiB;AAAA;AAAA;AACtB;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DeleteTagDialog.esm.js","sources":["../../../src/components/TagsPage/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;;;;"}
|