customize unregister entity menuitem

Signed-off-by: sjeyaraman <sjeyaraman@expedia.com>
This commit is contained in:
sjeyaraman
2022-06-05 12:40:43 -07:00
parent f9e2ec2551
commit 888731df92
4 changed files with 70 additions and 17 deletions
@@ -165,9 +165,22 @@ const EntityLayoutWrapper = (props: { children?: ReactNode }) => {
];
}, []);
type VisibleType = 'visible' | 'hidden' | 'disabled';
type contextMenuOptions = {
disableUnregister: boolean | VisibleType;
};
const options: contextMenuOptions = {
disableUnregister: false,
};
return (
<>
<EntityLayout UNSTABLE_extraContextMenuItems={extraMenuItems}>
<EntityLayout
UNSTABLE_extraContextMenuItems={extraMenuItems}
UNSTABLE_contextMenuOptions={options}
>
{props.children}
</EntityLayout>
<EntityBadgesDialog
@@ -42,7 +42,6 @@ function render(children: React.ReactNode) {
describe('ComponentContextMenu', () => {
it('should call onUnregisterEntity on button click', async () => {
const mockCallback = jest.fn();
await render(
<EntityContextMenu
onUnregisterEntity={mockCallback}
@@ -61,6 +60,30 @@ describe('ComponentContextMenu', () => {
expect(mockCallback).toBeCalled();
});
it('check Unregister entity button is disabled', async () => {
const mockCallback = jest.fn();
const { getByText } = await render(
<EntityContextMenu
UNSTABLE_contextMenuOptions={{ disableUnregister: 'disabled' }}
onUnregisterEntity={mockCallback}
onInspectEntity={() => {}}
/>,
);
const button = await screen.findByTestId('menu-button');
expect(button).toBeInTheDocument();
fireEvent.click(button);
const unregister = await screen.getByText('Unregister entity');
expect(unregister).toBeInTheDocument();
const unregisterSpanItem = getByText(/Unregister entity/);
const unregisterMenuListItem =
unregisterSpanItem?.parentElement?.parentElement;
expect(unregisterMenuListItem).toHaveAttribute('aria-disabled');
});
it('should call onInspectEntity on button click', async () => {
const mockCallback = jest.fn();
@@ -55,9 +55,11 @@ interface ExtraContextMenuItem {
onClick: () => void;
}
type VisibleType = 'visible' | 'hidden' | 'disabled';
// unstable context menu option, eg: disable the unregister entity menu
interface contextMenuOptions {
disableUnregister: boolean;
disableUnregister: boolean | VisibleType;
}
interface EntityContextMenuProps {
@@ -106,11 +108,35 @@ export function EntityContextMenu(props: EntityContextMenuProps) {
<Divider key="the divider is here!" />,
];
const isBoolean =
typeof UNSTABLE_contextMenuOptions?.disableUnregister === 'boolean';
const disableUnregister =
(!unregisterPermission.allowed ||
UNSTABLE_contextMenuOptions?.disableUnregister) ??
(isBoolean
? UNSTABLE_contextMenuOptions?.disableUnregister
: UNSTABLE_contextMenuOptions?.disableUnregister === 'disabled')) ??
false;
let unregisterButton = <></>;
if (UNSTABLE_contextMenuOptions?.disableUnregister !== 'hidden') {
unregisterButton = (
<MenuItem
onClick={() => {
onClose();
onUnregisterEntity();
}}
disabled={disableUnregister}
>
<ListItemIcon>
<CancelIcon fontSize="small" />
</ListItemIcon>
<ListItemText primary="Unregister entity" />
</MenuItem>
);
}
return (
<>
<IconButton
@@ -136,18 +162,7 @@ export function EntityContextMenu(props: EntityContextMenuProps) {
>
<MenuList>
{extraItems}
<MenuItem
onClick={() => {
onClose();
onUnregisterEntity();
}}
disabled={disableUnregister}
>
<ListItemIcon>
<CancelIcon fontSize="small" />
</ListItemIcon>
<ListItemText primary="Unregister entity" />
</MenuItem>
{unregisterButton}
<MenuItem
onClick={() => {
onClose();
@@ -142,9 +142,11 @@ interface ExtraContextMenuItem {
onClick: () => void;
}
type VisibleType = 'visible' | 'hidden' | 'disabled';
// unstable context menu option, eg: disable the unregister entity menu
interface contextMenuOptions {
disableUnregister: boolean;
disableUnregister: boolean | VisibleType;
}
/** @public */