1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

allow to prompt on entity menu click

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>
This commit is contained in:
Jari Kolehmainen 2021-04-08 09:02:54 +03:00
parent ddec03bf52
commit 9e5996b9cb
5 changed files with 48 additions and 6 deletions

View File

@ -54,7 +54,10 @@ export class KubernetesCluster implements CatalogEntity {
{ {
icon: "delete", icon: "delete",
title: "Delete", title: "Delete",
onClick: async () => clusterStore.removeById(this.metadata.uid) onClick: async () => clusterStore.removeById(this.metadata.uid),
confirm: {
message: `Remove Kubernetes Cluster "${this.metadata.name} from Lens?`
}
}, },
]; ];

View File

@ -45,6 +45,9 @@ export type CatalogEntityContextMenu = {
icon: string; icon: string;
title: string; title: string;
onClick: () => Promise<void>; onClick: () => Promise<void>;
confirm?: {
message: string;
}
}; };
export interface CatalogEntityContextMenuContext { export interface CatalogEntityContextMenuContext {

View File

@ -2,7 +2,7 @@ import { navigate } from "../navigation";
import { commandRegistry } from "../../extensions/registries"; import { commandRegistry } from "../../extensions/registries";
import { CatalogEntity } from "../../common/catalog-entity"; import { CatalogEntity } from "../../common/catalog-entity";
export { CatalogEntity, CatalogEntityData, CatalogEntityActionContext, CatalogEntityContextMenuContext } from "../../common/catalog-entity"; export { CatalogEntity, CatalogEntityData, CatalogEntityActionContext, CatalogEntityContextMenu, CatalogEntityContextMenuContext } from "../../common/catalog-entity";
export const catalogEntityRunContext = { export const catalogEntityRunContext = {
navigate: (url: string) => navigate(url), navigate: (url: string) => navigate(url),

View File

@ -9,12 +9,13 @@ import { kebabCase } from "lodash";
import { PageLayout } from "../layout/page-layout"; import { PageLayout } from "../layout/page-layout";
import { MenuItem, MenuActions } from "../menu"; import { MenuItem, MenuActions } from "../menu";
import { Icon } from "../icon"; import { Icon } from "../icon";
import { CatalogEntityContextMenuContext, catalogEntityRunContext } from "../../api/catalog-entity"; import { CatalogEntityContextMenu, CatalogEntityContextMenuContext, catalogEntityRunContext } from "../../api/catalog-entity";
import { Badge } from "../badge"; import { Badge } from "../badge";
import { hotbarStore } from "../../../common/hotbar-store"; import { hotbarStore } from "../../../common/hotbar-store";
import { addClusterURL } from "../+add-cluster"; import { addClusterURL } from "../+add-cluster";
import { autobind } from "../../utils"; import { autobind } from "../../utils";
import { Notifications } from "../notifications"; import { Notifications } from "../notifications";
import { ConfirmDialog } from "../confirm-dialog";
enum sortBy { enum sortBy {
name = "name", name = "name",
@ -71,6 +72,23 @@ export class Catalog extends React.Component {
item.onRun(catalogEntityRunContext); item.onRun(catalogEntityRunContext);
} }
onMenuItemClick(menuItem: CatalogEntityContextMenu) {
if (menuItem.confirm) {
ConfirmDialog.open({
okButtonProps: {
primary: false,
accent: true,
},
ok: () => {
menuItem.onClick();
},
message: menuItem.confirm.message
});
} else {
menuItem.onClick();
}
}
@autobind() @autobind()
renderItemMenu(item: CatalogEntityItem) { renderItemMenu(item: CatalogEntityItem) {
const onOpen = async () => { const onOpen = async () => {
@ -87,7 +105,7 @@ export class Catalog extends React.Component {
</MenuItem> </MenuItem>
{ this.contextMenu.menuItems.map((menuItem, index) => { { this.contextMenu.menuItems.map((menuItem, index) => {
return ( return (
<MenuItem key={`menuitem-${index}`} onClick={() => menuItem.onClick()}> <MenuItem key={`menuitem-${index}`} onClick={() => this.onMenuItemClick(menuItem)}>
<Icon material={menuItem.icon} small interactive={true} title={menuItem.title}/> {menuItem.title} <Icon material={menuItem.icon} small interactive={true} title={menuItem.title}/> {menuItem.title}
</MenuItem> </MenuItem>
); );

View File

@ -5,12 +5,13 @@ import { observer } from "mobx-react";
import { cssNames, IClassName } from "../../utils"; import { cssNames, IClassName } from "../../utils";
import { Tooltip } from "../tooltip"; import { Tooltip } from "../tooltip";
import { Avatar } from "@material-ui/core"; import { Avatar } from "@material-ui/core";
import { CatalogEntity, CatalogEntityContextMenuContext } from "../../../common/catalog-entity"; import { CatalogEntity, CatalogEntityContextMenu, CatalogEntityContextMenuContext } from "../../../common/catalog-entity";
import { Menu, MenuItem } from "../menu"; import { Menu, MenuItem } from "../menu";
import { Icon } from "../icon"; import { Icon } from "../icon";
import { observable } from "mobx"; import { observable } from "mobx";
import { navigate } from "../../navigation"; import { navigate } from "../../navigation";
import { hotbarStore } from "../../../common/hotbar-store"; import { hotbarStore } from "../../../common/hotbar-store";
import { ConfirmDialog } from "../confirm-dialog";
interface Props extends DOMAttributes<HTMLElement> { interface Props extends DOMAttributes<HTMLElement> {
entity: CatalogEntity; entity: CatalogEntity;
@ -66,6 +67,23 @@ export class HotbarIcon extends React.Component<Props> {
hotbar.items = hotbar.items.filter((i) => i.entity.uid !== item.metadata.uid); hotbar.items = hotbar.items.filter((i) => i.entity.uid !== item.metadata.uid);
} }
onMenuItemClick(menuItem: CatalogEntityContextMenu) {
if (menuItem.confirm) {
ConfirmDialog.open({
okButtonProps: {
primary: false,
accent: true,
},
ok: () => {
menuItem.onClick();
},
message: menuItem.confirm.message
});
} else {
menuItem.onClick();
}
}
render() { render() {
const { const {
entity, errorClass, isActive, entity, errorClass, isActive,
@ -99,7 +117,7 @@ export class HotbarIcon extends React.Component<Props> {
</MenuItem> </MenuItem>
{ this.contextMenu && this.contextMenu.menuItems.map((menuItem) => { { this.contextMenu && this.contextMenu.menuItems.map((menuItem) => {
return ( return (
<MenuItem key={menuItem.title} onClick={() => menuItem.onClick()}> <MenuItem key={menuItem.title} onClick={() => this.onMenuItemClick(menuItem) }>
<Icon material={menuItem.icon} small interactive={true} title={menuItem.title}/> {menuItem.title} <Icon material={menuItem.icon} small interactive={true} title={menuItem.title}/> {menuItem.title}
</MenuItem> </MenuItem>
); );