mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
* Save and restore lastActiveClusterId Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com> * Activate clusters from workspaces page Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com> * Fix saving last cluster while jumping from tray Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com> * Adding workspace switch tests Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com> * Remove console.log() Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com> * Cleaning up Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com> * Clean duplicated ClusterId definition Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com> * Moving lastActiveClusterId field into WorkspaceModel Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com> * fix extensionLoader error on dev environments where renderer might start early (#1447) Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * Add Search by Ip to Pod View (#1445) Signed-off-by: Pavel Ashevskii <pashevskii@mirantis.com> * Make BaseStore abstract (#1431) * make BaseStore abstract so that implementers are forced to decide how to store data Signed-off-by: Sebastian Malton <sebastian@malton.name> * Enforce semicolons in eslint Signed-off-by: Panu Horsmalahti <phorsmalahti@mirantis.com> * Add a few missing folders to be linted. Signed-off-by: Panu Horsmalahti <phorsmalahti@mirantis.com> * Use @typescript-eslint/semi. Signed-off-by: Panu Horsmalahti <phorsmalahti@mirantis.com> * Allow extension cluster menus to have a parent (#1452) Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> * fix SwitchCase indent rule in eslint (#1454) Signed-off-by: Sebastian Malton <sebastian@malton.name> * Revert "fix SwitchCase indent rule in eslint (#1454)" This reverts commit082774fe6e. * Revert "Allow extension cluster menus to have a parent (#1452)" This reverts commit622c45cd6d. * Revert "Use @typescript-eslint/semi." This reverts commit890fa5dd9e. * Revert "Add a few missing folders to be linted." This reverts commitc7b24c2922. * Revert "Enforce semicolons in eslint" This reverts commitca67caea60. * Revert "Make BaseStore abstract (#1431)" This reverts commit4b56ab7c61. * Revert "Add Search by Ip to Pod View (#1445)" This reverts commit4079214dc1. * Revert "fix extensionLoader error on dev environments where renderer might start early (#1447)" This reverts commit8a3613ac6f. * Split workspace tests to smaller ones Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com> * Missing semicolons Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com> * Split workspace tests a bit more Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com> * Adding extra click in Add Cluster button Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com> * Adding more awaits to check running cluster Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com> * Wait for minikube before running tests Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com> Co-authored-by: Jari Kolehmainen <jari.kolehmainen@gmail.com> Co-authored-by: pashevskii <53330707+pashevskii@users.noreply.github.com> Co-authored-by: Sebastian Malton <sebastian@malton.name> Co-authored-by: Panu Horsmalahti <phorsmalahti@mirantis.com>
127 lines
3.8 KiB
TypeScript
127 lines
3.8 KiB
TypeScript
import path from "path";
|
|
import packageInfo from "../../package.json";
|
|
import { dialog, Menu, NativeImage, nativeTheme, Tray } from "electron";
|
|
import { autorun } from "mobx";
|
|
import { showAbout } from "./menu";
|
|
import { AppUpdater } from "./app-updater";
|
|
import { WindowManager } from "./window-manager";
|
|
import { clusterStore } from "../common/cluster-store";
|
|
import { workspaceStore } from "../common/workspace-store";
|
|
import { preferencesURL } from "../renderer/components/+preferences/preferences.route";
|
|
import { clusterViewURL } from "../renderer/components/cluster-manager/cluster-view.route";
|
|
import logger from "./logger";
|
|
import { isDevelopment } from "../common/vars";
|
|
import { exitApp } from "./exit-app";
|
|
|
|
// note: instance of Tray should be saved somewhere, otherwise it disappears
|
|
export let tray: Tray;
|
|
|
|
// refresh icon when MacOS dark/light theme has changed
|
|
nativeTheme?.on("updated", () => tray?.setImage(getTrayIcon()));
|
|
|
|
export function getTrayIcon(isDark = nativeTheme.shouldUseDarkColors): string {
|
|
return path.resolve(
|
|
__static,
|
|
isDevelopment ? "../build/tray" : "icons", // copied within electron-builder extras
|
|
`tray_icon${isDark ? "_dark" : ""}.png`
|
|
);
|
|
}
|
|
|
|
export function initTray(windowManager: WindowManager) {
|
|
const dispose = autorun(() => {
|
|
try {
|
|
const menu = createTrayMenu(windowManager);
|
|
buildTray(getTrayIcon(), menu);
|
|
} catch (err) {
|
|
logger.error(`[TRAY]: building failed: ${err}`);
|
|
}
|
|
});
|
|
return () => {
|
|
dispose();
|
|
tray?.destroy();
|
|
tray = null;
|
|
};
|
|
}
|
|
|
|
export function buildTray(icon: string | NativeImage, menu: Menu) {
|
|
if (!tray) {
|
|
tray = new Tray(icon);
|
|
tray.setToolTip(packageInfo.description);
|
|
tray.setIgnoreDoubleClickEvents(true);
|
|
}
|
|
|
|
tray.setImage(icon);
|
|
tray.setContextMenu(menu);
|
|
|
|
return tray;
|
|
}
|
|
|
|
export function createTrayMenu(windowManager: WindowManager): Menu {
|
|
return Menu.buildFromTemplate([
|
|
{
|
|
label: "About Lens",
|
|
async click() {
|
|
// note: argument[1] (browserWindow) not available when app is not focused / hidden
|
|
const browserWindow = await windowManager.ensureMainWindow();
|
|
showAbout(browserWindow);
|
|
},
|
|
},
|
|
{ type: 'separator' },
|
|
{
|
|
label: "Open Lens",
|
|
async click() {
|
|
await windowManager.ensureMainWindow();
|
|
},
|
|
},
|
|
{
|
|
label: "Preferences",
|
|
click() {
|
|
windowManager.navigate(preferencesURL());
|
|
},
|
|
},
|
|
{
|
|
label: "Clusters",
|
|
submenu: workspaceStore.enabledWorkspacesList
|
|
.filter(workspace => clusterStore.getByWorkspaceId(workspace.id).length > 0) // hide empty workspaces
|
|
.map(workspace => {
|
|
const clusters = clusterStore.getByWorkspaceId(workspace.id);
|
|
return {
|
|
label: workspace.name,
|
|
toolTip: workspace.description,
|
|
submenu: clusters.map(cluster => {
|
|
const { id: clusterId, name: label, online, workspace } = cluster;
|
|
return {
|
|
label: `${online ? '✓' : '\x20'.repeat(3)/*offset*/}${label}`,
|
|
toolTip: clusterId,
|
|
async click() {
|
|
workspaceStore.setActive(workspace);
|
|
windowManager.navigate(clusterViewURL({ params: { clusterId } }));
|
|
}
|
|
};
|
|
})
|
|
};
|
|
}),
|
|
},
|
|
{
|
|
label: "Check for updates",
|
|
async click() {
|
|
const result = await AppUpdater.checkForUpdates();
|
|
if (!result) {
|
|
const browserWindow = await windowManager.ensureMainWindow();
|
|
dialog.showMessageBoxSync(browserWindow, {
|
|
message: "No updates available",
|
|
type: "info",
|
|
});
|
|
}
|
|
},
|
|
},
|
|
{ type: 'separator' },
|
|
{
|
|
label: 'Quit App',
|
|
click() {
|
|
exitApp();
|
|
}
|
|
}
|
|
]);
|
|
}
|