diff --git a/integration/__tests__/cluster-pages.tests.ts b/integration/__tests__/cluster-pages.tests.ts index 7135c93e1f..fbf4c7e0b6 100644 --- a/integration/__tests__/cluster-pages.tests.ts +++ b/integration/__tests__/cluster-pages.tests.ts @@ -377,10 +377,13 @@ utils.describeIf(minikubeReady(TEST_NAMESPACE))("Minikube based tests", () => { await kubeApiServerRow.click(); await frame.waitForSelector(".Drawer", { state: "visible" }); - await frame.waitForSelector(".Drawer .drawer-title .Icon >> text=subject").then(button => button.click()); - await frame.waitForSelector(".Dock.isOpen"); + + const showPodLogsIcon = await frame.waitForSelector(".Drawer .drawer-title .Icon >> text=subject"); + + showPodLogsIcon.click(); // Check if controls are available + await frame.waitForSelector(".Dock.isOpen"); await frame.waitForSelector(".LogList .VirtualList"); await frame.waitForSelector(".LogResourceSelector"); diff --git a/package.json b/package.json index 8f9a166ff4..2ce8a279e2 100644 --- a/package.json +++ b/package.json @@ -198,7 +198,6 @@ "electron-window-state": "^5.0.3", "filehound": "^1.17.5", "fs-extra": "^9.0.1", - "glob": "^7.2.0", "glob-to-regexp": "^0.4.1", "got": "^11.8.2", "grapheme-splitter": "^1.0.4", diff --git a/src/renderer/bootstrap.tsx b/src/renderer/bootstrap.tsx index c02d470894..cd2d941cbc 100644 --- a/src/renderer/bootstrap.tsx +++ b/src/renderer/bootstrap.tsx @@ -48,12 +48,14 @@ import { ThemeStore } from "./theme.store"; import { SentryInit } from "../common/sentry"; import { TerminalStore } from "./components/dock/terminal.store"; import { AppPaths } from "../common/app-paths"; +import { registerCustomThemes } from "./components/monaco-editor"; if (process.isMainFrame) { SentryInit(); } -configurePackages(); +configurePackages(); // global packages +registerCustomThemes(); // monaco editor themes /** * If this is a development build, wait a second to attach diff --git a/src/renderer/components/dock/dock.store.ts b/src/renderer/components/dock/dock.store.ts index 6cfb9c4883..c47ba9784c 100644 --- a/src/renderer/components/dock/dock.store.ts +++ b/src/renderer/components/dock/dock.store.ts @@ -95,8 +95,14 @@ export interface DockTabChangeEvent { } export interface DockTabChangeEventOptions extends IReactionOptions { - tabKind?: TabKind; // filter: by dockStore.selectedTab.kind == tabKind - dockIsVisible?: boolean; // filter: dock and selected tab should be visible (default: true) + /** + * filter: by dockStore.selectedTab.kind == tabKind + */ + tabKind?: TabKind; + /** + * filter: dock and selected tab should be visible (default: true) + */ + dockIsVisible?: boolean; } export interface DockTabCloseEvent { diff --git a/src/renderer/components/dock/dock.tsx b/src/renderer/components/dock/dock.tsx index 3b75a341ab..747fd37a5c 100644 --- a/src/renderer/components/dock/dock.tsx +++ b/src/renderer/components/dock/dock.tsx @@ -105,7 +105,7 @@ export class Dock extends React.Component { if (!isOpen || !selectedTab) return null; return ( -
+
{this.renderTab(selectedTab)}
); diff --git a/src/renderer/components/monaco-editor/monaco-editor.tsx b/src/renderer/components/monaco-editor/monaco-editor.tsx index 21fb2ff08b..db528e33ba 100644 --- a/src/renderer/components/monaco-editor/monaco-editor.tsx +++ b/src/renderer/components/monaco-editor/monaco-editor.tsx @@ -21,17 +21,14 @@ import styles from "./monaco-editor.module.css"; import React from "react"; -import { action, computed, makeObservable, observable, reaction } from "mobx"; import { observer } from "mobx-react"; +import { action, computed, makeObservable, observable, reaction } from "mobx"; import { editor, Uri } from "monaco-editor"; -import { MonacoTheme, registerCustomThemes } from "./monaco-themes"; -import { MonacoValidator, monacoValidators } from "./monaco-validators"; -import { cssNames, disposer, toJS } from "../../utils"; +import { MonacoTheme, MonacoValidator, monacoValidators } from "./index"; +import { debounce, merge } from "lodash"; +import { cssNames, disposer } from "../../utils"; import { UserStore } from "../../../common/user-store"; import { ThemeStore } from "../../theme.store"; -import debounce from "lodash/debounce"; - -registerCustomThemes(); // setup export type MonacoEditorId = string; @@ -87,9 +84,13 @@ export class MonacoEditor extends React.Component { makeObservable(this); } + @computed get id() { + return this.props.id ?? this.staticId; + } + @computed get model(): editor.ITextModel { - const uri = MonacoEditor.createUri(this.props.id ?? this.staticId); - const model = editor.getModels().find(model => model.uri.toString() == uri.toString()); + const uri = MonacoEditor.createUri(this.id); + const model = editor.getModel(uri); if (model) { return model; // already exists @@ -101,10 +102,17 @@ export class MonacoEditor extends React.Component { } @computed get options(): editor.IStandaloneEditorConstructionOptions { - return toJS({ - ...UserStore.getInstance().editorConfiguration, - ...(this.props.options ?? {}), - }); + return merge({}, + UserStore.getInstance().editorConfiguration, + this.props.options + ); + } + + @computed get logMetadata() { + return { + editorId: this.id, + model: this.model, + }; } /** @@ -128,9 +136,12 @@ export class MonacoEditor extends React.Component { } onModelChange = (model: editor.ITextModel, oldModel?: editor.ITextModel) => { - this.logger?.info("[MONACO]: model change", { model, oldModel }); + this.logger?.info("[MONACO]: model change", { model, oldModel }, this.logMetadata); + + if (oldModel) { + this.saveViewState(oldModel); + } - this.saveViewState(oldModel); this.editor.setModel(model); this.restoreViewState(model); this.editor.layout(); @@ -144,32 +155,30 @@ export class MonacoEditor extends React.Component { * This will allow restore cursor position, selected text, etc. * @param {editor.ITextModel} model */ - saveViewState(model = this.model) { - if (!model) return; - + private saveViewState(model: editor.ITextModel) { MonacoEditor.viewStates.set(model.uri, this.editor.saveViewState()); } - restoreViewState(model = this.model) { - if (!model) return; - + private restoreViewState(model: editor.ITextModel) { const viewState = MonacoEditor.viewStates.get(model.uri); - this.editor.restoreViewState(viewState); + if (viewState) { + this.editor.restoreViewState(viewState); + } } componentDidMount() { try { this.createEditor(); - this.logger?.info(`[MONACO]: editor did mount`); + this.logger?.info(`[MONACO]: editor did mount`, this.logMetadata); } catch (error) { - this.logger?.error(`[MONACO]: mounting failed: ${error}`, this); + this.logger?.error(`[MONACO]: mounting failed: ${error}`, this.logMetadata); } } componentWillUnmount() { this.unmounting = true; - this.saveViewState(); + this.saveViewState(this.model); this.destroy(); } @@ -189,9 +198,9 @@ export class MonacoEditor extends React.Component { ...this.options, }); - this.logger?.info(`[MONACO]: editor created for language=${language}, theme=${theme}`); + this.logger?.info(`[MONACO]: editor created for language=${language}, theme=${theme}`, this.logMetadata); this.validateLazy(); // validate initial value - this.restoreViewState(); // restore previous state if any + this.restoreViewState(this.model); // restore previous state if any if (this.props.autoFocus) { this.editor.focus();