add useIsDisabled hook

Signed-off-by: Mark Dunphy <markd@spotify.com>
This commit is contained in:
Mark Dunphy
2025-03-21 16:34:57 -04:00
parent c8c0065394
commit cce3770453
2 changed files with 53 additions and 8 deletions
@@ -30,11 +30,13 @@ export type FactoryHrefParams =
useTitle: () => string;
icon: React.JSX.Element;
useHref: () => string;
useIsDisabled?: () => boolean;
}
| {
useTitle: () => string;
icon: React.JSX.Element;
href: string;
useIsDisabled?: () => boolean;
};
/** @alpha */
@@ -42,6 +44,7 @@ export type FactoryDialogParams = {
useOnClick: () => React.MouseEventHandler<HTMLLIElement>;
useTitle: () => string;
icon: React.JSX.Element;
useIsDisabled?: () => boolean;
};
/** @alpha */
@@ -73,9 +76,11 @@ export const EntityContextMenuItemBlueprint = createExtensionBlueprint({
return ({ onClose }) => {
const onClick = params.useOnClick();
const title = params.useTitle();
const disabled = params.useIsDisabled?.() ?? false;
return (
<MenuItem
disabled={disabled}
onClick={e => {
onClose();
onClick(e);
@@ -93,9 +98,10 @@ export const EntityContextMenuItemBlueprint = createExtensionBlueprint({
return () => {
const href = useHref();
const title = params.useTitle();
const disabled = params.useIsDisabled?.() ?? false;
return (
<MenuItem component="a" href={href}>
<MenuItem disabled={disabled} component="a" href={href}>
<ListItemIcon>{params.icon}</ListItemIcon>
<ListItemText primary={title} />
</MenuItem>
+46 -7
View File
@@ -15,15 +15,28 @@
*/
import React from 'react';
import { EntityContextMenuItemBlueprint } from '@backstage/plugin-catalog-react/alpha';
import {
EntityContextMenuItemBlueprint,
useEntityPermission,
} from '@backstage/plugin-catalog-react/alpha';
import FileCopyTwoToneIcon from '@material-ui/icons/FileCopyTwoTone';
import BugReportIcon from '@material-ui/icons/BugReport';
import CancelIcon from '@material-ui/icons/Cancel';
import useCopyToClipboard from 'react-use/esm/useCopyToClipboard';
import { alertApiRef, useApi } from '@backstage/core-plugin-api';
import { useTranslationRef } from '@backstage/frontend-plugin-api';
import { alertApiRef, useApi, useRouteRef } from '@backstage/core-plugin-api';
import {
dialogApiRef,
useTranslationRef,
type DialogApiDialog,
} from '@backstage/frontend-plugin-api';
import { catalogTranslationRef } from './translation';
import { useSearchParams } from 'react-router-dom';
import { useNavigate, useSearchParams } from 'react-router-dom';
import {
UnregisterEntityDialog,
useEntity,
} from '@backstage/plugin-catalog-react';
import { rootRouteRef, unregisterRedirectRouteRef } from '../routes';
import { catalogEntityDeletePermission } from '@backstage/plugin-catalog-common/alpha';
export const copyEntityUrlContextMenuItem = EntityContextMenuItemBlueprint.make(
{
@@ -86,10 +99,36 @@ export const unregisterEntityContextMenuItem =
const { t } = useTranslationRef(catalogTranslationRef);
return t('entityContextMenu.unregisterMenuTitle');
},
useIsDisabled: () => {
const unregisterPermission = useEntityPermission(
catalogEntityDeletePermission,
);
return !unregisterPermission.allowed;
},
useOnClick: () => {
return () => {
// eslint-disable-next-line no-alert
window.alert('unregister clicked');
const { entity } = useEntity();
const dialogApi = useApi(dialogApiRef);
const navigate = useNavigate();
const catalogRoute = useRouteRef(rootRouteRef);
const unregisterRedirectRoute = useRouteRef(unregisterRedirectRouteRef);
return async () => {
dialogApi.showModal(({ dialog }: { dialog: DialogApiDialog }) => (
<UnregisterEntityDialog
open
entity={entity}
onClose={() => dialog.close()}
onConfirm={() => {
dialog.close();
navigate(
unregisterRedirectRoute
? unregisterRedirectRoute()
: catalogRoute(),
);
}}
/>
));
};
},
},