diff --git a/src/common/utils/toJS.ts b/src/common/utils/toJS.ts index 35965c4547..48b698fc5d 100644 --- a/src/common/utils/toJS.ts +++ b/src/common/utils/toJS.ts @@ -1,25 +1,13 @@ // Converts mobx-observable or partially observable object to corresponding plain JS-structure. // Since mobx >= 6.x toJS() recursively converts only top-level observables. import * as mobx from "mobx"; +import { isObservable, observable } from "mobx"; export function toJS(data: T): T { - if (mobx.isObservable(data)) { - return mobx.toJS(data); // data recursively converted, nothing to worry about. + if (isObservable(data)) { + return mobx.toJS(data); } - // convert top-level plain array or object - if (typeof data === "object" && data !== null) { - let convertedData: any[] | T; - - if (Array.isArray(data)) { - convertedData = data.map(toJS); - } else { - convertedData = Object.fromEntries( - Object.entries(data).map(([key, value]) => [key, toJS(value)]) - ) as T; - } - Object.assign(data, convertedData); - } - - return data; + // make data observable for recursive toJS()-call + return mobx.toJS(observable.box(data).get()); } diff --git a/src/main/helm/helm-repo-manager.ts b/src/main/helm/helm-repo-manager.ts index 53826bf1bf..bc13dec1f4 100644 --- a/src/main/helm/helm-repo-manager.ts +++ b/src/main/helm/helm-repo-manager.ts @@ -125,7 +125,7 @@ export class HelmRepoManager extends Singleton { return stdout; } - public static async addСustomRepo(repoAttributes : HelmRepo) { + public static async addCustomRepo(repoAttributes : HelmRepo) { logger.info(`[HELM]: adding repo "${repoAttributes.name}" from ${repoAttributes.url}`); const helm = await helmCli.binaryPath(); diff --git a/src/renderer/components/+apps-releases/release-rollback-dialog.tsx b/src/renderer/components/+apps-releases/release-rollback-dialog.tsx index 4166111934..91bd23077b 100644 --- a/src/renderer/components/+apps-releases/release-rollback-dialog.tsx +++ b/src/renderer/components/+apps-releases/release-rollback-dialog.tsx @@ -1,7 +1,7 @@ import "./release-rollback-dialog.scss"; import React from "react"; -import { observable, makeObservable } from "mobx"; +import { makeObservable, observable } from "mobx"; import { observer } from "mobx-react"; import { Dialog, DialogProps } from "../dialog"; import { Wizard, WizardStep } from "../wizard"; @@ -16,8 +16,10 @@ interface Props extends DialogProps { @observer export class ReleaseRollbackDialog extends React.Component { - @observable static isOpen = false; - @observable.ref static release: HelmRelease = null; + static metadata = observable({ + isOpen: false, + release: null as HelmRelease, + }); @observable isLoading = false; @observable revision: IReleaseRevision; @@ -29,16 +31,16 @@ export class ReleaseRollbackDialog extends React.Component { } static open(release: HelmRelease) { - ReleaseRollbackDialog.isOpen = true; - ReleaseRollbackDialog.release = release; + ReleaseRollbackDialog.metadata.isOpen = true; + ReleaseRollbackDialog.metadata.release = release; } static close() { - ReleaseRollbackDialog.isOpen = false; + ReleaseRollbackDialog.metadata.isOpen = false; } get release(): HelmRelease { - return ReleaseRollbackDialog.release; + return ReleaseRollbackDialog.metadata.release; } onOpen = async () => { @@ -99,7 +101,7 @@ export class ReleaseRollbackDialog extends React.Component { diff --git a/src/renderer/components/+cluster/cluster-overview.store.ts b/src/renderer/components/+cluster/cluster-overview.store.ts index 755d6ca0ef..c6682c3f5b 100644 --- a/src/renderer/components/+cluster/cluster-overview.store.ts +++ b/src/renderer/components/+cluster/cluster-overview.store.ts @@ -1,7 +1,7 @@ import { action, makeObservable, observable, reaction, when } from "mobx"; import { KubeObjectStore } from "../../kube-object.store"; import { Cluster, clusterApi, IClusterMetrics } from "../../api/endpoints"; -import { createStorage } from "../../utils"; +import { createStorage, StorageHelper } from "../../utils"; import { IMetricsReqParams, normalizeMetrics } from "../../api/endpoints/metrics.api"; import { nodesStore } from "../+nodes/nodes.store"; import { apiManager } from "../../api/api-manager"; @@ -24,13 +24,21 @@ export interface ClusterOverviewStorageState { export class ClusterOverviewStore extends KubeObjectStore implements ClusterOverviewStorageState { api = clusterApi; + private storage: StorageHelper; @observable metrics: Partial = {}; @observable metricsLoaded = false; - private storage = createStorage("cluster_overview", { - metricType: MetricType.CPU, // setup defaults - metricNodeRole: MetricNodeRole.WORKER, - }); + constructor() { + super(); + + this.storage = createStorage("cluster_overview", { + metricType: MetricType.CPU, // setup defaults + metricNodeRole: MetricNodeRole.WORKER, + }); + + makeObservable(this); + this.init(); + } get metricType(): MetricType { return this.storage.get().metricType; @@ -48,12 +56,6 @@ export class ClusterOverviewStore extends KubeObjectStore implements Cl this.storage.merge({ metricNodeRole: value }); } - constructor() { - super(); - makeObservable(this); - this.init(); - } - private init() { // TODO: refactor, seems not a correct place to be // auto-refresh metrics on user-action diff --git a/src/renderer/components/+config-resource-quotas/add-quota-dialog.tsx b/src/renderer/components/+config-resource-quotas/add-quota-dialog.tsx index c7d3a24502..33df7726bf 100644 --- a/src/renderer/components/+config-resource-quotas/add-quota-dialog.tsx +++ b/src/renderer/components/+config-resource-quotas/add-quota-dialog.tsx @@ -1,7 +1,7 @@ import "./add-quota-dialog.scss"; import React from "react"; -import { computed, observable, makeObservable } from "mobx"; +import { computed, makeObservable, observable } from "mobx"; import { observer } from "mobx-react"; import { Dialog, DialogProps } from "../dialog"; import { Wizard, WizardStep } from "../wizard"; @@ -20,7 +20,9 @@ interface Props extends DialogProps { @observer export class AddQuotaDialog extends React.Component { - @observable static isOpen = false; + static metadata = observable({ + isOpen: false, + }); static defaultQuotas: IResourceQuotaValues = { "limits.cpu": "", @@ -57,11 +59,11 @@ export class AddQuotaDialog extends React.Component { } static open() { - AddQuotaDialog.isOpen = true; + AddQuotaDialog.metadata.isOpen = true; } static close() { - AddQuotaDialog.isOpen = false; + AddQuotaDialog.metadata.isOpen = false; } @computed get quotaEntries() { @@ -77,7 +79,7 @@ export class AddQuotaDialog extends React.Component { const icon = isCompute ? "memory" : isStorage ? "storage" : isCount ? "looks_one" : ""; return { - label: icon ? {quota} : quota, + label: icon ? {quota} : quota, value: quota, }; }); @@ -138,7 +140,7 @@ export class AddQuotaDialog extends React.Component { @@ -158,7 +160,7 @@ export class AddQuotaDialog extends React.Component { /> - + { onChange={({ value }) => this.namespace = value} /> - +
this.setFilepath(fileType, v)} /> this.selectFileDialog(fileType, {name: placeholder, extensions: fileExtensions})} + onClick={() => this.selectFileDialog(fileType, { name: placeholder, extensions: fileExtensions })} tooltip="Browse" />
); @@ -114,7 +118,7 @@ export class AddHelmRepoDialog extends React.Component { renderOptions() { return ( <> - + { {this.renderFileInput(`Key file`, FileType.KeyFile, AddHelmRepoDialog.keyExtensions)} {this.renderFileInput(`Ca file`, FileType.CaFile, AddHelmRepoDialog.certExtensions)} {this.renderFileInput(`Cerificate file`, FileType.CertFile, AddHelmRepoDialog.certExtensions)} - + this.helmRepo.username = v} + value={this.helmRepo.username} onChange={v => this.helmRepo.username = v} /> { - {this.addCustomRepo();}}> + { + this.addCustomRepo(); + }}>
{ validators={isUrl} value={this.helmRepo.url} onChange={v => this.helmRepo.url = v} /> -