Change Cluster Settings button to be consistent with cluster icon menu (#2065)

Co-authored-by: Sebastian Malton <sebastian@malton.name>
Co-authored-by: Alex Culliere <alozhkin@mirantis.com>
This commit is contained in:
authored and GitHub committed 2021-03-23 08:41:58 -04:00
1 parent 72e1915ef4
commit e718b250cc
6 files changed
+147 -63

No files matched your search

@@ -7,15 +7,18 @@ import "@testing-library/jest-dom/extend-expect";
import { MainLayoutHeader } from "../main-layout-header";
import { Cluster } from "../../../../main/cluster";
import { workspaceStore } from "../../../../common/workspace-store";
import { broadcastMessage } from "../../../../common/ipc";
import { broadcastMessage, requestMain } from "../../../../common/ipc";
import { clusterDisconnectHandler } from "../../../../common/cluster-ipc";
import { ConfirmDialog } from "../../confirm-dialog";
const mockBroadcastIpc = broadcastMessage as jest.MockedFunction<typeof broadcastMessage>;
const mockRequestMain = requestMain as jest.MockedFunction<typeof requestMain>;
const cluster: Cluster = new Cluster({
id: "foo",
contextName: "minikube",
kubeConfigPath: "minikube-config.yml",
workspace: workspaceStore.currentWorkspaceId
workspace: workspaceStore.currentWorkspaceId,
});
describe("<MainLayoutHeader />", () => {
@@ -25,20 +28,12 @@ describe("<MainLayoutHeader />", () => {
expect(container).toBeInstanceOf(HTMLElement);
});
it("renders gear icon", () => {
it("renders three dots icon", () => {
const { container } = render(<MainLayoutHeader cluster={cluster} />);
const icon = container.querySelector(".Icon .icon");
expect(icon).toBeInstanceOf(HTMLElement);
expect(icon).toHaveTextContent("settings");
});
it("navigates to cluster settings", () => {
const { container } = render(<MainLayoutHeader cluster={cluster} />);
const icon = container.querySelector(".Icon");
fireEvent.click(icon);
expect(mockBroadcastIpc).toBeCalledWith("renderer:navigate", "/cluster/foo/settings");
expect(icon).toHaveTextContent("more_vert");
});
it("renders cluster name", () => {
@@ -46,4 +41,60 @@ describe("<MainLayoutHeader />", () => {
expect(getByText("minikube")).toBeInTheDocument();
});
describe("Cluster Actions Menu", () => {
let settingsBtn: Element;
let disconnectBtn: Element;
let removeBtn: Element;
beforeEach(() => {
const { container } = render(<div>
<MainLayoutHeader cluster={cluster} />
<ConfirmDialog />
</div>);
const icon = container.querySelector(".Icon");
cluster.online = true;
fireEvent.click(icon);
[settingsBtn, disconnectBtn, removeBtn] = Array.from(document.querySelectorAll("ul.ClusterActionsMenu > li"))
.map(el => el.querySelector("span"));
});
afterEach(() => {
cluster.online = false;
});
it("renders cluster menu items", () => {
expect(settingsBtn).toBeDefined();
expect(settingsBtn.textContent).toBe("Settings");
expect(disconnectBtn).toBeDefined();
expect(disconnectBtn.textContent).toBe("Disconnect");
expect(removeBtn).toBeDefined();
expect(removeBtn.textContent).toBe("Remove");
});
it("navigates to cluster settings", () => {
fireEvent.click(settingsBtn);
expect(mockBroadcastIpc).toBeCalledWith("renderer:navigate", "/cluster/foo/settings");
});
it("disconnects from cluster", () => {
fireEvent.click(disconnectBtn);
expect(mockRequestMain).toBeCalledWith(clusterDisconnectHandler, cluster.id);
});
it("opens 'Remove cluster' dialog", async () => {
fireEvent.click(removeBtn);
const dialog = document.querySelector(".ConfirmDialog");
expect(dialog).toBeDefined();
expect(dialog).not.toBe(null);
const okBtn = dialog.querySelector("button.ok");
expect(okBtn.textContent).toBe("Remove");
});
});
});
@@ -1,11 +1,10 @@
import { observer } from "mobx-react";
import React from "react";
import { observer } from "mobx-react";
import { clusterSettingsURL } from "../+cluster-settings";
import { broadcastMessage } from "../../../common/ipc";
import { ClusterActions } from "../cluster-manager";
import { Cluster } from "../../../main/cluster";
import { cssNames } from "../../utils";
import { Icon } from "../icon";
import { MenuActions, MenuItem } from "../menu";
interface Props {
cluster: Cluster
@@ -13,21 +12,28 @@ interface Props {
}
export const MainLayoutHeader = observer(({ cluster, className }: Props) => {
const actions = ClusterActions(cluster);
const renderMenu = () => (
<MenuActions autoCloseOnSelect className="ClusterActionsMenu">
<MenuItem onClick={actions.showSettings}>
<span>Settings</span>
</MenuItem>
<MenuItem onClick={actions.disconnect}>
<span>Disconnect</span>
</MenuItem>
{
!cluster.isManaged && (
<MenuItem onClick={actions.remove}>
<span>Remove</span>
</MenuItem>
)
}
</MenuActions>);
return (
<header className={cssNames("flex gaps align-center justify-space-between", className)}>
<span className="cluster">{cluster.name}</span>
<Icon
material="settings"
tooltip="Open cluster settings"
interactive
onClick={() => {
broadcastMessage("renderer:navigate", clusterSettingsURL({
params: {
clusterId: cluster.id
}
}));
}}
/>
{renderMenu()}
</header>
);
});