From 35732e5a59eb29450e8ddacb47e8c9c84c04827b Mon Sep 17 00:00:00 2001 From: Roman Date: Tue, 4 May 2021 20:21:03 +0300 Subject: [PATCH] autobind-related fixes / refactoring Signed-off-by: Roman --- src/common/search-store.ts | 6 +- src/common/utils/autobind.ts | 83 ++++++++++--------- src/renderer/api/api-manager.ts | 2 + .../api/endpoints/cluster-role.api.ts | 2 +- src/renderer/api/endpoints/configmap.api.ts | 2 +- src/renderer/api/endpoints/cron-job.api.ts | 2 +- src/renderer/api/endpoints/daemon-set.api.ts | 2 +- src/renderer/api/endpoints/deployment.api.ts | 2 +- src/renderer/api/endpoints/endpoint.api.ts | 2 +- src/renderer/api/endpoints/events.api.ts | 2 +- src/renderer/api/endpoints/helm-charts.api.ts | 2 +- .../api/endpoints/helm-releases.api.ts | 2 +- src/renderer/api/endpoints/ingress.api.ts | 2 +- src/renderer/api/endpoints/job.api.ts | 2 +- src/renderer/api/endpoints/limit-range.api.ts | 2 +- src/renderer/api/endpoints/namespaces.api.ts | 2 +- .../api/endpoints/network-policy.api.ts | 2 +- src/renderer/api/endpoints/nodes.api.ts | 2 +- .../endpoints/persistent-volume-claims.api.ts | 2 +- .../api/endpoints/persistent-volume.api.ts | 2 +- .../api/endpoints/poddisruptionbudget.api.ts | 2 +- src/renderer/api/endpoints/pods.api.ts | 2 +- .../api/endpoints/podsecuritypolicy.api.ts | 2 +- src/renderer/api/endpoints/replica-set.api.ts | 2 +- .../api/endpoints/role-binding.api.ts | 2 +- src/renderer/api/endpoints/secret.api.ts | 2 +- .../api/endpoints/service-accounts.api.ts | 2 +- src/renderer/api/endpoints/service.api.ts | 2 +- .../api/endpoints/stateful-set.api.ts | 2 +- .../api/endpoints/storage-class.api.ts | 2 +- src/renderer/api/kube-object.ts | 2 +- src/renderer/api/kube-watch-api.ts | 3 +- src/renderer/api/terminal-api.ts | 2 +- .../+apps-helm-charts/helm-chart-details.tsx | 4 +- .../+apps-helm-charts/helm-chart.store.ts | 2 + .../+apps-releases/release-menu.tsx | 6 +- .../+apps-releases/release.store.ts | 3 +- .../+catalog/catalog-add-button.tsx | 6 +- .../+catalog/catalog-entity.store.ts | 3 + src/renderer/components/+catalog/catalog.tsx | 2 +- .../components/+cluster/cluster-issues.tsx | 2 +- .../+cluster/cluster-overview.store.ts | 5 +- .../+config-autoscalers/hpa.store.ts | 2 + .../limit-ranges.store.ts | 2 + .../+config-maps/config-maps.store.ts | 2 + .../pod-disruption-budgets.store.ts | 2 + .../resource-quotas.store.ts | 2 + .../+config-secrets/secrets.store.ts | 2 + .../+custom-resources/crd-resource.store.ts | 2 + .../components/+custom-resources/crd.store.ts | 3 +- .../components/+events/event.store.ts | 2 + .../+extensions/extension-install.store.ts | 12 +-- .../components/+extensions/extensions.tsx | 2 +- .../components/+namespaces/namespace.store.ts | 3 +- .../endpoint-subset-list.tsx | 6 +- .../+network-endpoints/endpoints.store.ts | 2 + .../+network-ingresses/ingress.store.ts | 2 + .../+network-policies/network-policy.store.ts | 2 + .../+network-services/services.store.ts | 2 + src/renderer/components/+nodes/nodes.store.ts | 2 + .../pod-security-policies.store.ts | 2 + .../+storage-classes/storage-class.store.ts | 2 + .../volume-claim.store.ts | 2 + .../+storage-volumes/volume-details-list.tsx | 2 +- .../+storage-volumes/volumes.store.ts | 2 + .../role-binding-details.tsx | 2 +- .../role-bindings.store.ts | 2 + .../+user-management-roles/roles.store.ts | 2 + .../service-accounts.store.ts | 2 + .../+workloads-cronjobs/cronjob.store.ts | 2 + .../+workloads-daemonsets/daemonsets.store.ts | 2 + .../deployments.store.ts | 2 + .../components/+workloads-jobs/job.store.ts | 2 + .../+workloads-overview/overview-statuses.tsx | 2 +- .../+workloads-pods/pod-details-list.tsx | 2 +- .../+workloads-pods/pod-details.tsx | 2 +- .../components/+workloads-pods/pods.store.ts | 3 +- .../replicasets.store.ts | 2 + .../statefulset.store.ts | 2 + .../components/ace-editor/ace-editor.tsx | 4 +- src/renderer/components/animate/animate.tsx | 2 +- src/renderer/components/checkbox/checkbox.tsx | 2 +- .../components/clipboard/clipboard.tsx | 2 +- .../components/cluster-kubeconfig.tsx | 2 +- .../components/remove-cluster-button.tsx | 2 +- .../components/dock/create-resource.store.ts | 2 + .../components/dock/dock-tab.store.ts | 3 +- src/renderer/components/dock/dock-tab.tsx | 2 +- src/renderer/components/dock/dock.store.ts | 14 ++-- .../components/dock/edit-resource.store.ts | 3 +- .../components/dock/install-chart.store.ts | 1 + .../components/dock/install-chart.tsx | 12 +-- src/renderer/components/dock/log.store.ts | 3 +- src/renderer/components/dock/logs.tsx | 4 +- src/renderer/components/dock/terminal-tab.tsx | 2 +- .../components/dock/terminal.store.ts | 2 + src/renderer/components/dock/terminal.ts | 2 +- .../editable-list/editable-list.tsx | 2 +- src/renderer/components/icon/icon.tsx | 4 +- .../components/input/drop-file-input.tsx | 8 +- src/renderer/components/input/input.tsx | 10 +-- .../components/input/search-input.tsx | 6 +- .../item-object-list/item-list-layout.tsx | 8 +- .../item-object-list/page-filters.store.ts | 2 + .../kube-object/kube-object-menu.tsx | 6 +- .../kubeconfig-dialog/kubeconfig-dialog.tsx | 4 +- .../components/layout/page-layout.tsx | 2 +- src/renderer/components/menu/menu-actions.tsx | 2 +- src/renderer/components/menu/menu.tsx | 4 +- src/renderer/components/select/select.tsx | 4 +- src/renderer/components/table/table-cell.tsx | 2 +- src/renderer/components/table/table.tsx | 4 +- src/renderer/components/tabs/tabs.tsx | 10 +-- src/renderer/components/tooltip/tooltip.tsx | 8 +- src/renderer/item.store.ts | 3 + src/renderer/kube-object.store.ts | 8 +- src/renderer/protocol-handler/router.ts | 4 +- src/renderer/theme.store.ts | 4 +- 118 files changed, 263 insertions(+), 182 deletions(-) diff --git a/src/common/search-store.ts b/src/common/search-store.ts index 01d38bce9d..d9e3a3689a 100644 --- a/src/common/search-store.ts +++ b/src/common/search-store.ts @@ -108,12 +108,12 @@ export class SearchStore { return prev; } - @autobind() + @autobind public setNextOverlayActive(): void { this.activeOverlayIndex = this.getNextOverlay(true); } - @autobind() + @autobind public setPrevOverlayActive(): void { this.activeOverlayIndex = this.getPrevOverlay(true); } @@ -139,7 +139,7 @@ export class SearchStore { * @param line Index of the line where overlay is located * @param occurrence Number of the overlay within one line */ - @autobind() + @autobind public isActiveOverlay(line: number, occurrence: number): boolean { const firstLineIndex = this.occurrences.findIndex(item => item === line); diff --git a/src/common/utils/autobind.ts b/src/common/utils/autobind.ts index 83d3971173..f37d3a0797 100644 --- a/src/common/utils/autobind.ts +++ b/src/common/utils/autobind.ts @@ -1,46 +1,47 @@ -// Decorator for binding class methods -// Can be applied to class or single method as @autobind() -type Constructor = new (...args: any[]) => T; +// Auto-binding class method(s) to proper "this"-context. +// Useful when calling methods after object-destruction or when method copied to scope variable. -// FIXME-or-REMOVE: doesn't work as class-decorator with mobx-6 decorators, e.g. @action, @computed, etc. -export function autobind() { - return function (target: Constructor | object, prop?: string, descriptor?: PropertyDescriptor) { - if (target instanceof Function) return bindClass(target); - else return bindMethod(target, prop, descriptor); - }; -} +type Constructor = new (...args: any[]) => object; -function bindClass(constructor: T) { - const proto = constructor.prototype; - const descriptors = Object.getOwnPropertyDescriptors(proto); - const skipMethod = (methodName: string) => { - return methodName === "constructor" - || typeof descriptors[methodName].value !== "function"; - }; +export function autobind>(target: T): T; +export function autobind(target: T, prop?: PropertyKey, descriptor?: PropertyDescriptor): PropertyDescriptor; - Object.keys(descriptors).forEach(prop => { - if (skipMethod(prop)) return; - const boundDescriptor = bindMethod(proto, prop, descriptors[prop]); - - Object.defineProperty(proto, prop, boundDescriptor); - }); -} - -function bindMethod(target: object, prop?: string, descriptor?: PropertyDescriptor) { - if (!descriptor || typeof descriptor.value !== "function") { - throw new Error(`@autobind() must be used on class or method only`); +export function autobind(target: any, prop?: PropertyKey, descriptor?: PropertyDescriptor) { + if (typeof target === "function") { + return bindClass(target); + } + if (typeof descriptor === "object") { + return bindMethod(target, prop, descriptor); + } +} + +export function bindClass>(target: T): T { + return new Proxy(target, { + construct(target, args: any[], newTarget?: any) { + const instance = Reflect.construct(target, args, newTarget); + const protoDescriptors = Object.entries(Object.getOwnPropertyDescriptors(target.prototype)); + protoDescriptors.forEach(([prop, descriptor]) => bindMethod(instance, prop, descriptor)); + return instance; + } + }) +} + +export function bindMethod(target: T, prop: PropertyKey, descriptor: PropertyDescriptor): PropertyDescriptor { + const originalMethod = descriptor.value; + + if (typeof originalMethod === "function") { + const boundDescriptor: PropertyDescriptor = { + configurable: descriptor.configurable, + enumerable: descriptor.enumerable, + get() { + return (...args: any[]) => Reflect.apply(originalMethod, this, args); + }, + set(value: any) { + Object.defineProperty(target, prop, { ...descriptor, value }); + } + }; + + Object.defineProperty(target, prop, boundDescriptor); + return boundDescriptor; } - const { value: func, enumerable, configurable } = descriptor; - const boundFunc = new WeakMap(); - - return Object.defineProperty(target, prop, { - enumerable, - configurable, - get() { - if (this === target) return func; // direct access from prototype - if (!boundFunc.has(this)) boundFunc.set(this, func.bind(this)); - - return boundFunc.get(this); - } - }); } diff --git a/src/renderer/api/api-manager.ts b/src/renderer/api/api-manager.ts index bbabb19085..88bb4dfabf 100644 --- a/src/renderer/api/api-manager.ts +++ b/src/renderer/api/api-manager.ts @@ -1,7 +1,9 @@ import type { KubeObjectStore } from "../kube-object.store"; import { action, makeObservable, observable } from "mobx"; import { KubeApi, parseKubeApi } from "./kube-api"; +import { autobind } from "../../common/utils"; +@autobind export class ApiManager { private apis = observable.map(); private stores = observable.map(); diff --git a/src/renderer/api/endpoints/cluster-role.api.ts b/src/renderer/api/endpoints/cluster-role.api.ts index 9e3c90ca2e..b89dc6ef1a 100644 --- a/src/renderer/api/endpoints/cluster-role.api.ts +++ b/src/renderer/api/endpoints/cluster-role.api.ts @@ -2,7 +2,7 @@ import { autobind } from "../../utils"; import { Role } from "./role.api"; import { KubeApi } from "../kube-api"; -@autobind() +@autobind export class ClusterRole extends Role { static kind = "ClusterRole"; static namespaced = false; diff --git a/src/renderer/api/endpoints/configmap.api.ts b/src/renderer/api/endpoints/configmap.api.ts index 94d8a9de50..15c9ad53ba 100644 --- a/src/renderer/api/endpoints/configmap.api.ts +++ b/src/renderer/api/endpoints/configmap.api.ts @@ -5,7 +5,7 @@ import { KubeApi } from "../kube-api"; export type ConfigMapData = Record; -@autobind() +@autobind export class ConfigMap extends KubeObject { static kind = "ConfigMap"; static namespaced = true; diff --git a/src/renderer/api/endpoints/cron-job.api.ts b/src/renderer/api/endpoints/cron-job.api.ts index 462b42b58b..319943ddb7 100644 --- a/src/renderer/api/endpoints/cron-job.api.ts +++ b/src/renderer/api/endpoints/cron-job.api.ts @@ -37,7 +37,7 @@ export class CronJobApi extends KubeApi { } } -@autobind() +@autobind export class CronJob extends KubeObject { static kind = "CronJob"; static namespaced = true; diff --git a/src/renderer/api/endpoints/daemon-set.api.ts b/src/renderer/api/endpoints/daemon-set.api.ts index d7131aa120..5852ecf20a 100644 --- a/src/renderer/api/endpoints/daemon-set.api.ts +++ b/src/renderer/api/endpoints/daemon-set.api.ts @@ -4,7 +4,7 @@ import { IAffinity, WorkloadKubeObject } from "../workload-kube-object"; import { autobind } from "../../utils"; import { KubeApi } from "../kube-api"; -@autobind() +@autobind export class DaemonSet extends WorkloadKubeObject { static kind = "DaemonSet"; static namespaced = true; diff --git a/src/renderer/api/endpoints/deployment.api.ts b/src/renderer/api/endpoints/deployment.api.ts index adebd1467b..169ef853ed 100644 --- a/src/renderer/api/endpoints/deployment.api.ts +++ b/src/renderer/api/endpoints/deployment.api.ts @@ -66,7 +66,7 @@ interface IContainerProbe { failureThreshold?: number; } -@autobind() +@autobind export class Deployment extends WorkloadKubeObject { static kind = "Deployment"; static namespaced = true; diff --git a/src/renderer/api/endpoints/endpoint.api.ts b/src/renderer/api/endpoints/endpoint.api.ts index d19c2f127e..fe055d1747 100644 --- a/src/renderer/api/endpoints/endpoint.api.ts +++ b/src/renderer/api/endpoints/endpoint.api.ts @@ -100,7 +100,7 @@ export class EndpointSubset implements IEndpointSubset { } } -@autobind() +@autobind export class Endpoint extends KubeObject { static kind = "Endpoints"; static namespaced = true; diff --git a/src/renderer/api/endpoints/events.api.ts b/src/renderer/api/endpoints/events.api.ts index 4fb21aaaa5..26c712b72b 100644 --- a/src/renderer/api/endpoints/events.api.ts +++ b/src/renderer/api/endpoints/events.api.ts @@ -4,7 +4,7 @@ import { formatDuration } from "../../utils/formatDuration"; import { autobind } from "../../utils"; import { KubeApi } from "../kube-api"; -@autobind() +@autobind export class KubeEvent extends KubeObject { static kind = "Event"; static namespaced = true; diff --git a/src/renderer/api/endpoints/helm-charts.api.ts b/src/renderer/api/endpoints/helm-charts.api.ts index 9d4b5d4575..925f7c1d88 100644 --- a/src/renderer/api/endpoints/helm-charts.api.ts +++ b/src/renderer/api/endpoints/helm-charts.api.ts @@ -62,7 +62,7 @@ export async function getChartValues(repo: string, name: string, version: string return apiBase.get(`/v2/charts/${repo}/${name}/values?${stringify({ version })}`); } -@autobind() +@autobind export class HelmChart { constructor(data: any) { Object.assign(this, data); diff --git a/src/renderer/api/endpoints/helm-releases.api.ts b/src/renderer/api/endpoints/helm-releases.api.ts index a0556a9a91..38235e9739 100644 --- a/src/renderer/api/endpoints/helm-releases.api.ts +++ b/src/renderer/api/endpoints/helm-releases.api.ts @@ -134,7 +134,7 @@ export async function rollbackRelease(name: string, namespace: string, revision: }); } -@autobind() +@autobind export class HelmRelease implements ItemObject { constructor(data: any) { Object.assign(this, data); diff --git a/src/renderer/api/endpoints/ingress.api.ts b/src/renderer/api/endpoints/ingress.api.ts index 7d035ad591..6af26710d0 100644 --- a/src/renderer/api/endpoints/ingress.api.ts +++ b/src/renderer/api/endpoints/ingress.api.ts @@ -61,7 +61,7 @@ export const getBackendServiceNamePort = (backend: IIngressBackend) => { return { serviceName, servicePort }; }; -@autobind() +@autobind export class Ingress extends KubeObject { static kind = "Ingress"; static namespaced = true; diff --git a/src/renderer/api/endpoints/job.api.ts b/src/renderer/api/endpoints/job.api.ts index dbe0fec613..109bdbeec2 100644 --- a/src/renderer/api/endpoints/job.api.ts +++ b/src/renderer/api/endpoints/job.api.ts @@ -5,7 +5,7 @@ import { IPodContainer } from "./pods.api"; import { KubeApi } from "../kube-api"; import { JsonApiParams } from "../json-api"; -@autobind() +@autobind export class Job extends WorkloadKubeObject { static kind = "Job"; static namespaced = true; diff --git a/src/renderer/api/endpoints/limit-range.api.ts b/src/renderer/api/endpoints/limit-range.api.ts index bbb3941c87..fcab56d9ce 100644 --- a/src/renderer/api/endpoints/limit-range.api.ts +++ b/src/renderer/api/endpoints/limit-range.api.ts @@ -29,7 +29,7 @@ export interface LimitRangeItem extends LimitRangeParts { type: string } -@autobind() +@autobind export class LimitRange extends KubeObject { static kind = "LimitRange"; static namespaced = true; diff --git a/src/renderer/api/endpoints/namespaces.api.ts b/src/renderer/api/endpoints/namespaces.api.ts index 430565bf57..b5fee4d214 100644 --- a/src/renderer/api/endpoints/namespaces.api.ts +++ b/src/renderer/api/endpoints/namespaces.api.ts @@ -7,7 +7,7 @@ export enum NamespaceStatus { TERMINATING = "Terminating", } -@autobind() +@autobind export class Namespace extends KubeObject { static kind = "Namespace"; static namespaced = false; diff --git a/src/renderer/api/endpoints/network-policy.api.ts b/src/renderer/api/endpoints/network-policy.api.ts index eb531990c2..a0894d7e6f 100644 --- a/src/renderer/api/endpoints/network-policy.api.ts +++ b/src/renderer/api/endpoints/network-policy.api.ts @@ -35,7 +35,7 @@ export interface IPolicyEgress { }[]; } -@autobind() +@autobind export class NetworkPolicy extends KubeObject { static kind = "NetworkPolicy"; static namespaced = true; diff --git a/src/renderer/api/endpoints/nodes.api.ts b/src/renderer/api/endpoints/nodes.api.ts index d1794f0fb7..24f20c6eaa 100644 --- a/src/renderer/api/endpoints/nodes.api.ts +++ b/src/renderer/api/endpoints/nodes.api.ts @@ -28,7 +28,7 @@ export interface INodeMetrics { fsSize: T; } -@autobind() +@autobind export class Node extends KubeObject { static kind = "Node"; static namespaced = false; diff --git a/src/renderer/api/endpoints/persistent-volume-claims.api.ts b/src/renderer/api/endpoints/persistent-volume-claims.api.ts index 1d9e1f1dce..1e7245e16b 100644 --- a/src/renderer/api/endpoints/persistent-volume-claims.api.ts +++ b/src/renderer/api/endpoints/persistent-volume-claims.api.ts @@ -21,7 +21,7 @@ export interface IPvcMetrics { diskCapacity: T; } -@autobind() +@autobind export class PersistentVolumeClaim extends KubeObject { static kind = "PersistentVolumeClaim"; static namespaced = true; diff --git a/src/renderer/api/endpoints/persistent-volume.api.ts b/src/renderer/api/endpoints/persistent-volume.api.ts index db286db062..7c0abcf0d2 100644 --- a/src/renderer/api/endpoints/persistent-volume.api.ts +++ b/src/renderer/api/endpoints/persistent-volume.api.ts @@ -3,7 +3,7 @@ import { unitsToBytes } from "../../utils/convertMemory"; import { autobind } from "../../utils"; import { KubeApi } from "../kube-api"; -@autobind() +@autobind export class PersistentVolume extends KubeObject { static kind = "PersistentVolume"; static namespaced = false; diff --git a/src/renderer/api/endpoints/poddisruptionbudget.api.ts b/src/renderer/api/endpoints/poddisruptionbudget.api.ts index 50ab2d5b3d..4423c64151 100644 --- a/src/renderer/api/endpoints/poddisruptionbudget.api.ts +++ b/src/renderer/api/endpoints/poddisruptionbudget.api.ts @@ -2,7 +2,7 @@ import { autobind } from "../../utils"; import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; -@autobind() +@autobind export class PodDisruptionBudget extends KubeObject { static kind = "PodDisruptionBudget"; static namespaced = true; diff --git a/src/renderer/api/endpoints/pods.api.ts b/src/renderer/api/endpoints/pods.api.ts index 8a6bc9452d..b31638a033 100644 --- a/src/renderer/api/endpoints/pods.api.ts +++ b/src/renderer/api/endpoints/pods.api.ts @@ -181,7 +181,7 @@ export interface IPodContainerStatus { started?: boolean; } -@autobind() +@autobind export class Pod extends WorkloadKubeObject { static kind = "Pod"; static namespaced = true; diff --git a/src/renderer/api/endpoints/podsecuritypolicy.api.ts b/src/renderer/api/endpoints/podsecuritypolicy.api.ts index dc5113625d..09aee92ac1 100644 --- a/src/renderer/api/endpoints/podsecuritypolicy.api.ts +++ b/src/renderer/api/endpoints/podsecuritypolicy.api.ts @@ -2,7 +2,7 @@ import { autobind } from "../../utils"; import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; -@autobind() +@autobind export class PodSecurityPolicy extends KubeObject { static kind = "PodSecurityPolicy"; static namespaced = false; diff --git a/src/renderer/api/endpoints/replica-set.api.ts b/src/renderer/api/endpoints/replica-set.api.ts index 50c689ebb0..ae90d0a58b 100644 --- a/src/renderer/api/endpoints/replica-set.api.ts +++ b/src/renderer/api/endpoints/replica-set.api.ts @@ -27,7 +27,7 @@ export class ReplicaSetApi extends KubeApi { } } -@autobind() +@autobind export class ReplicaSet extends WorkloadKubeObject { static kind = "ReplicaSet"; static namespaced = true; diff --git a/src/renderer/api/endpoints/role-binding.api.ts b/src/renderer/api/endpoints/role-binding.api.ts index 866656ee56..75f884a2d6 100644 --- a/src/renderer/api/endpoints/role-binding.api.ts +++ b/src/renderer/api/endpoints/role-binding.api.ts @@ -9,7 +9,7 @@ export interface IRoleBindingSubject { apiGroup?: string; } -@autobind() +@autobind export class RoleBinding extends KubeObject { static kind = "RoleBinding"; static namespaced = true; diff --git a/src/renderer/api/endpoints/secret.api.ts b/src/renderer/api/endpoints/secret.api.ts index 16262570df..08f05e9187 100644 --- a/src/renderer/api/endpoints/secret.api.ts +++ b/src/renderer/api/endpoints/secret.api.ts @@ -19,7 +19,7 @@ export interface ISecretRef { name: string; } -@autobind() +@autobind export class Secret extends KubeObject { static kind = "Secret"; static namespaced = true; diff --git a/src/renderer/api/endpoints/service-accounts.api.ts b/src/renderer/api/endpoints/service-accounts.api.ts index 9f449cdec4..2790573df9 100644 --- a/src/renderer/api/endpoints/service-accounts.api.ts +++ b/src/renderer/api/endpoints/service-accounts.api.ts @@ -2,7 +2,7 @@ import { autobind } from "../../utils"; import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; -@autobind() +@autobind export class ServiceAccount extends KubeObject { static kind = "ServiceAccount"; static namespaced = true; diff --git a/src/renderer/api/endpoints/service.api.ts b/src/renderer/api/endpoints/service.api.ts index 4619475c65..b45415a328 100644 --- a/src/renderer/api/endpoints/service.api.ts +++ b/src/renderer/api/endpoints/service.api.ts @@ -29,7 +29,7 @@ export class ServicePort implements IServicePort { } } -@autobind() +@autobind export class Service extends KubeObject { static kind = "Service"; static namespaced = true; diff --git a/src/renderer/api/endpoints/stateful-set.api.ts b/src/renderer/api/endpoints/stateful-set.api.ts index cdb56adccf..dcb9bff9c0 100644 --- a/src/renderer/api/endpoints/stateful-set.api.ts +++ b/src/renderer/api/endpoints/stateful-set.api.ts @@ -27,7 +27,7 @@ export class StatefulSetApi extends KubeApi { } } -@autobind() +@autobind export class StatefulSet extends WorkloadKubeObject { static kind = "StatefulSet"; static namespaced = true; diff --git a/src/renderer/api/endpoints/storage-class.api.ts b/src/renderer/api/endpoints/storage-class.api.ts index 085701742c..0d747f9720 100644 --- a/src/renderer/api/endpoints/storage-class.api.ts +++ b/src/renderer/api/endpoints/storage-class.api.ts @@ -2,7 +2,7 @@ import { autobind } from "../../utils"; import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; -@autobind() +@autobind export class StorageClass extends KubeObject { static kind = "StorageClass"; static namespaced = false; diff --git a/src/renderer/api/kube-object.ts b/src/renderer/api/kube-object.ts index 9734aea9be..8e79cc729a 100644 --- a/src/renderer/api/kube-object.ts +++ b/src/renderer/api/kube-object.ts @@ -66,7 +66,7 @@ export class KubeStatus { export type IKubeMetaField = keyof IKubeObjectMetadata; -@autobind() +@autobind export class KubeObject implements ItemObject { static readonly kind: string; static readonly namespaced: boolean; diff --git a/src/renderer/api/kube-watch-api.ts b/src/renderer/api/kube-watch-api.ts index e1e16123c9..2d0b37fcf1 100644 --- a/src/renderer/api/kube-watch-api.ts +++ b/src/renderer/api/kube-watch-api.ts @@ -5,7 +5,7 @@ import type { KubeObjectStore } from "../kube-object.store"; import type { ClusterContext } from "../components/context"; import plimit from "p-limit"; import { comparer, IReactionDisposer, makeObservable, observable, reaction, when } from "mobx"; -import { noop } from "../utils"; +import { autobind, noop } from "../utils"; import { KubeJsonApiData } from "./kube-json-api"; import { isDebugging, isProduction } from "../../common/vars"; @@ -27,6 +27,7 @@ export interface IKubeWatchLog { cssStyle?: string; } +@autobind export class KubeWatchApi { @observable context: ClusterContext = null; diff --git a/src/renderer/api/terminal-api.ts b/src/renderer/api/terminal-api.ts index 1a94052586..714ca165c5 100644 --- a/src/renderer/api/terminal-api.ts +++ b/src/renderer/api/terminal-api.ts @@ -85,7 +85,7 @@ export class TerminalApi extends WebSocketApi { this.onReady.removeAllListeners(); } - @autobind() + @autobind protected _onReady(data: string) { if (!data) return; this.isReady = true; diff --git a/src/renderer/components/+apps-helm-charts/helm-chart-details.tsx b/src/renderer/components/+apps-helm-charts/helm-chart-details.tsx index 0f71d046a1..b03a851cba 100644 --- a/src/renderer/components/+apps-helm-charts/helm-chart-details.tsx +++ b/src/renderer/components/+apps-helm-charts/helm-chart-details.tsx @@ -51,7 +51,7 @@ export class HelmChartDetails extends Component { }); }); - @autobind() + @autobind async onVersionChange({ value: version }: SelectOption) { this.selectedChart = this.chartVersions.find(chart => chart.version === version); this.readme = null; @@ -68,7 +68,7 @@ export class HelmChartDetails extends Component { } } - @autobind() + @autobind install() { createInstallChartTab(this.selectedChart); this.props.hideDetails(); diff --git a/src/renderer/components/+apps-helm-charts/helm-chart.store.ts b/src/renderer/components/+apps-helm-charts/helm-chart.store.ts index 9698866ef8..a364429c38 100644 --- a/src/renderer/components/+apps-helm-charts/helm-chart.store.ts +++ b/src/renderer/components/+apps-helm-charts/helm-chart.store.ts @@ -3,12 +3,14 @@ import { makeObservable, observable } from "mobx"; import { getChartDetails, HelmChart, listCharts } from "../../api/endpoints/helm-charts.api"; import { ItemStore } from "../../item.store"; import flatten from "lodash/flatten"; +import { autobind } from "../../../common/utils"; export interface IChartVersion { repo: string; version: string; } +@autobind export class HelmChartStore extends ItemStore { @observable versions = observable.map(); diff --git a/src/renderer/components/+apps-releases/release-menu.tsx b/src/renderer/components/+apps-releases/release-menu.tsx index e482bb000a..8d22fb0496 100644 --- a/src/renderer/components/+apps-releases/release-menu.tsx +++ b/src/renderer/components/+apps-releases/release-menu.tsx @@ -14,12 +14,12 @@ interface Props extends MenuActionsProps { } export class HelmReleaseMenu extends React.Component { - @autobind() + @autobind remove() { return releaseStore.remove(this.props.release); } - @autobind() + @autobind upgrade() { const { release, hideDetails } = this.props; @@ -27,7 +27,7 @@ export class HelmReleaseMenu extends React.Component { hideDetails && hideDetails(); } - @autobind() + @autobind rollback() { ReleaseRollbackDialog.open(this.props.release); } diff --git a/src/renderer/components/+apps-releases/release.store.ts b/src/renderer/components/+apps-releases/release.store.ts index 8f8aa824db..552de0679b 100644 --- a/src/renderer/components/+apps-releases/release.store.ts +++ b/src/renderer/components/+apps-releases/release.store.ts @@ -6,8 +6,9 @@ import { Secret } from "../../api/endpoints"; import { secretsStore } from "../+config-secrets/secrets.store"; import { namespaceStore } from "../+namespaces/namespace.store"; import { Notifications } from "../notifications"; -import { toJS } from "../../../common/utils"; +import { autobind, toJS } from "../../../common/utils"; +@autobind export class ReleaseStore extends ItemStore { releaseSecrets = observable.map(); diff --git a/src/renderer/components/+catalog/catalog-add-button.tsx b/src/renderer/components/+catalog/catalog-add-button.tsx index 1d6328f838..b416692c03 100644 --- a/src/renderer/components/+catalog/catalog-add-button.tsx +++ b/src/renderer/components/+catalog/catalog-add-button.tsx @@ -40,17 +40,17 @@ export class CatalogAddButton extends React.Component { ]); } - @autobind() + @autobind onOpen() { this.isOpen = true; } - @autobind() + @autobind onClose() { this.isOpen = false; } - @autobind() + @autobind onButtonClick() { if (this.menuItems.length == 1) { this.menuItems[0].onClick(); diff --git a/src/renderer/components/+catalog/catalog-entity.store.ts b/src/renderer/components/+catalog/catalog-entity.store.ts index ea705c98dc..6d0fb615c4 100644 --- a/src/renderer/components/+catalog/catalog-entity.store.ts +++ b/src/renderer/components/+catalog/catalog-entity.store.ts @@ -3,7 +3,9 @@ import { catalogEntityRegistry } from "../../api/catalog-entity-registry"; import { CatalogEntity, CatalogEntityActionContext } from "../../api/catalog-entity"; import { ItemObject, ItemStore } from "../../item.store"; import { CatalogCategory } from "../../../common/catalog"; +import { autobind } from "../../../common/utils"; +@autobind export class CatalogEntityItem implements ItemObject { constructor(public entity: CatalogEntity) { makeObservable(this); @@ -63,6 +65,7 @@ export class CatalogEntityItem implements ItemObject { } } +@autobind export class CatalogEntityStore extends ItemStore { @observable activeCategory?: CatalogCategory; diff --git a/src/renderer/components/+catalog/catalog.tsx b/src/renderer/components/+catalog/catalog.tsx index 61f6936973..70ecf71896 100644 --- a/src/renderer/components/+catalog/catalog.tsx +++ b/src/renderer/components/+catalog/catalog.tsx @@ -112,7 +112,7 @@ export class Catalog extends React.Component { ); } - @autobind() + @autobind renderItemMenu(item: CatalogEntityItem) { const menuItems = this.contextMenu.menuItems.filter((menuItem) => !menuItem.onlyVisibleForSource || menuItem.onlyVisibleForSource === item.entity.metadata.source); diff --git a/src/renderer/components/+cluster/cluster-issues.tsx b/src/renderer/components/+cluster/cluster-issues.tsx index fabfd1c3cd..1b44e954a5 100644 --- a/src/renderer/components/+cluster/cluster-issues.tsx +++ b/src/renderer/components/+cluster/cluster-issues.tsx @@ -87,7 +87,7 @@ export class ClusterIssues extends React.Component { return warnings; } - @autobind() + @autobind getTableRow(uid: string) { const { warnings } = this; const warning = warnings.find(warn => warn.getId() == uid); diff --git a/src/renderer/components/+cluster/cluster-overview.store.ts b/src/renderer/components/+cluster/cluster-overview.store.ts index c6682c3f5b..6358512b5a 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, StorageHelper } from "../../utils"; +import { autobind, createStorage, StorageHelper } from "../../utils"; import { IMetricsReqParams, normalizeMetrics } from "../../api/endpoints/metrics.api"; import { nodesStore } from "../+nodes/nodes.store"; import { apiManager } from "../../api/api-manager"; @@ -21,6 +21,7 @@ export interface ClusterOverviewStorageState { metricNodeRole: MetricNodeRole, } +@autobind export class ClusterOverviewStore extends KubeObjectStore implements ClusterOverviewStorageState { api = clusterApi; @@ -30,13 +31,13 @@ export class ClusterOverviewStore extends KubeObjectStore implements Cl constructor() { super(); + makeObservable(this); this.storage = createStorage("cluster_overview", { metricType: MetricType.CPU, // setup defaults metricNodeRole: MetricNodeRole.WORKER, }); - makeObservable(this); this.init(); } diff --git a/src/renderer/components/+config-autoscalers/hpa.store.ts b/src/renderer/components/+config-autoscalers/hpa.store.ts index f45a7f9d64..2a9b107f8f 100644 --- a/src/renderer/components/+config-autoscalers/hpa.store.ts +++ b/src/renderer/components/+config-autoscalers/hpa.store.ts @@ -1,7 +1,9 @@ import { KubeObjectStore } from "../../kube-object.store"; import { HorizontalPodAutoscaler, hpaApi } from "../../api/endpoints/hpa.api"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class HPAStore extends KubeObjectStore { api = hpaApi; } diff --git a/src/renderer/components/+config-limit-ranges/limit-ranges.store.ts b/src/renderer/components/+config-limit-ranges/limit-ranges.store.ts index f5311c02f8..1f2ef4a4fc 100644 --- a/src/renderer/components/+config-limit-ranges/limit-ranges.store.ts +++ b/src/renderer/components/+config-limit-ranges/limit-ranges.store.ts @@ -1,7 +1,9 @@ import { KubeObjectStore } from "../../kube-object.store"; import { apiManager } from "../../api/api-manager"; import { LimitRange, limitRangeApi } from "../../api/endpoints/limit-range.api"; +import { autobind } from "../../../common/utils"; +@autobind export class LimitRangesStore extends KubeObjectStore { api = limitRangeApi; } diff --git a/src/renderer/components/+config-maps/config-maps.store.ts b/src/renderer/components/+config-maps/config-maps.store.ts index 151203e0dc..36b9c99ad9 100644 --- a/src/renderer/components/+config-maps/config-maps.store.ts +++ b/src/renderer/components/+config-maps/config-maps.store.ts @@ -1,7 +1,9 @@ import { KubeObjectStore } from "../../kube-object.store"; import { ConfigMap, configMapApi } from "../../api/endpoints/configmap.api"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class ConfigMapsStore extends KubeObjectStore { api = configMapApi; } diff --git a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.store.ts b/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.store.ts index 04fd163ea9..a2f70a9272 100644 --- a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.store.ts +++ b/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.store.ts @@ -1,7 +1,9 @@ import { KubeObjectStore } from "../../kube-object.store"; import { pdbApi, PodDisruptionBudget } from "../../api/endpoints/poddisruptionbudget.api"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class PodDisruptionBudgetsStore extends KubeObjectStore { api = pdbApi; } diff --git a/src/renderer/components/+config-resource-quotas/resource-quotas.store.ts b/src/renderer/components/+config-resource-quotas/resource-quotas.store.ts index 5b62683d46..19753d2406 100644 --- a/src/renderer/components/+config-resource-quotas/resource-quotas.store.ts +++ b/src/renderer/components/+config-resource-quotas/resource-quotas.store.ts @@ -1,7 +1,9 @@ import { KubeObjectStore } from "../../kube-object.store"; import { ResourceQuota, resourceQuotaApi } from "../../api/endpoints/resource-quota.api"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class ResourceQuotasStore extends KubeObjectStore { api = resourceQuotaApi; } diff --git a/src/renderer/components/+config-secrets/secrets.store.ts b/src/renderer/components/+config-secrets/secrets.store.ts index 1eb39a4e85..d4429aed2f 100644 --- a/src/renderer/components/+config-secrets/secrets.store.ts +++ b/src/renderer/components/+config-secrets/secrets.store.ts @@ -1,7 +1,9 @@ import { KubeObjectStore } from "../../kube-object.store"; import { Secret, secretsApi } from "../../api/endpoints"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class SecretsStore extends KubeObjectStore { api = secretsApi; } diff --git a/src/renderer/components/+custom-resources/crd-resource.store.ts b/src/renderer/components/+custom-resources/crd-resource.store.ts index 18ab9c029a..26d53ae552 100644 --- a/src/renderer/components/+custom-resources/crd-resource.store.ts +++ b/src/renderer/components/+custom-resources/crd-resource.store.ts @@ -1,7 +1,9 @@ import { KubeApi } from "../../api/kube-api"; import { KubeObjectStore } from "../../kube-object.store"; import { KubeObject } from "../../api/kube-object"; +import { autobind } from "../../../common/utils"; +@autobind export class CRDResourceStore extends KubeObjectStore { api: KubeApi; diff --git a/src/renderer/components/+custom-resources/crd.store.ts b/src/renderer/components/+custom-resources/crd.store.ts index 0ad576bb58..a609a98bb2 100644 --- a/src/renderer/components/+custom-resources/crd.store.ts +++ b/src/renderer/components/+custom-resources/crd.store.ts @@ -5,7 +5,7 @@ import { apiManager } from "../../api/api-manager"; import { KubeApi } from "../../api/kube-api"; import { CRDResourceStore } from "./crd-resource.store"; import { KubeObject } from "../../api/kube-object"; -import { toJS } from "../../../common/utils"; +import { autobind, toJS } from "../../../common/utils"; function initStore(crd: CustomResourceDefinition) { const apiBase = crd.getResourceApiBase(); @@ -18,6 +18,7 @@ function initStore(crd: CustomResourceDefinition) { } } +@autobind export class CRDStore extends KubeObjectStore { api = crdApi; diff --git a/src/renderer/components/+events/event.store.ts b/src/renderer/components/+events/event.store.ts index 77c899fd06..49aebe165f 100644 --- a/src/renderer/components/+events/event.store.ts +++ b/src/renderer/components/+events/event.store.ts @@ -6,7 +6,9 @@ import { KubeObject } from "../../api/kube-object"; import { Pod } from "../../api/endpoints/pods.api"; import { podsStore } from "../+workloads-pods/pods.store"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class EventStore extends KubeObjectStore { api = eventApi; limit = 1000; diff --git a/src/renderer/components/+extensions/extension-install.store.ts b/src/renderer/components/+extensions/extension-install.store.ts index 787dc2b364..8d0a6d8263 100644 --- a/src/renderer/components/+extensions/extension-install.store.ts +++ b/src/renderer/components/+extensions/extension-install.store.ts @@ -30,7 +30,7 @@ export class ExtensionInstallationStateStore { }); } - @action static reset() { + static reset() { logger.warn(`${Prefix}: resetting, may throw errors`); ExtensionInstallationStateStore.InstallingExtensions.clear(); ExtensionInstallationStateStore.UninstallingExtensions.clear(); @@ -42,7 +42,7 @@ export class ExtensionInstallationStateStore { * @param extId the ID of the extension * @throws if state is not IDLE */ - @action static setInstalling(extId: string): void { + static setInstalling(extId: string): void { logger.debug(`${Prefix}: trying to set ${extId} as installing`); const curState = ExtensionInstallationStateStore.getInstallationState(extId); @@ -76,7 +76,7 @@ export class ExtensionInstallationStateStore { * determined. * @returns a disposer which should be called to mark the end of the install phase */ - @action static startPreInstall(): ExtendableDisposer { + static startPreInstall(): ExtendableDisposer { const preInstallStepId = uuid.v4(); logger.debug(`${Prefix}: starting a new preinstall phase: ${preInstallStepId}`); @@ -93,7 +93,7 @@ export class ExtensionInstallationStateStore { * @param extId the ID of the extension * @throws if state is not IDLE */ - @action static setUninstalling(extId: string): void { + static setUninstalling(extId: string): void { logger.debug(`${Prefix}: trying to set ${extId} as uninstalling`); const curState = ExtensionInstallationStateStore.getInstallationState(extId); @@ -110,7 +110,7 @@ export class ExtensionInstallationStateStore { * @param extId The ID of the extension * @throws if state is not INSTALLING */ - @action static clearInstalling(extId: string): void { + static clearInstalling(extId: string): void { logger.debug(`${Prefix}: trying to clear ${extId} as installing`); const curState = ExtensionInstallationStateStore.getInstallationState(extId); @@ -128,7 +128,7 @@ export class ExtensionInstallationStateStore { * @param extId The ID of the extension * @throws if state is not UNINSTALLING */ - @action static clearUninstalling(extId: string): void { + static clearUninstalling(extId: string): void { logger.debug(`${Prefix}: trying to clear ${extId} as uninstalling`); const curState = ExtensionInstallationStateStore.getInstallationState(extId); diff --git a/src/renderer/components/+extensions/extensions.tsx b/src/renderer/components/+extensions/extensions.tsx index 47379bdf27..1629ae5d33 100644 --- a/src/renderer/components/+extensions/extensions.tsx +++ b/src/renderer/components/+extensions/extensions.tsx @@ -519,7 +519,7 @@ export class Extensions extends React.Component { ); } - @autobind() + @autobind renderExtension(extension: InstalledExtension) { const { id, isEnabled, manifest } = extension; const { name, description, version } = manifest; diff --git a/src/renderer/components/+namespaces/namespace.store.ts b/src/renderer/components/+namespaces/namespace.store.ts index 2a5d0a7604..0b8a78115b 100644 --- a/src/renderer/components/+namespaces/namespace.store.ts +++ b/src/renderer/components/+namespaces/namespace.store.ts @@ -1,5 +1,5 @@ import { action, comparer, computed, IReactionDisposer, IReactionOptions, makeObservable, observable, reaction, } from "mobx"; -import { createStorage } from "../../utils"; +import { autobind, createStorage } from "../../utils"; import { KubeObjectStore, KubeObjectStoreLoadingParams } from "../../kube-object.store"; import { Namespace, namespacesApi } from "../../api/endpoints/namespaces.api"; import { createPageParam } from "../../navigation"; @@ -27,6 +27,7 @@ export function getDummyNamespace(name: string) { }); } +@autobind export class NamespaceStore extends KubeObjectStore { api = namespacesApi; diff --git a/src/renderer/components/+network-endpoints/endpoint-subset-list.tsx b/src/renderer/components/+network-endpoints/endpoint-subset-list.tsx index 07d97d0aef..6ce78842d4 100644 --- a/src/renderer/components/+network-endpoints/endpoint-subset-list.tsx +++ b/src/renderer/components/+network-endpoints/endpoint-subset-list.tsx @@ -29,7 +29,7 @@ export class EndpointSubsetList extends React.Component { return this.renderAddressTableRow(address); } - @autobind() + @autobind getNotReadyAddressTableRow(ip: string) { const { subset} = this.props; const address = subset.getNotReadyAddresses().find(address => address.getId() == ip); @@ -37,7 +37,7 @@ export class EndpointSubsetList extends React.Component { return this.renderAddressTableRow(address); } - @autobind() + @autobind renderAddressTable(addresses: EndpointAddress[], virtual: boolean) { return (
@@ -63,7 +63,7 @@ export class EndpointSubsetList extends React.Component { ); } - @autobind() + @autobind renderAddressTableRow(address: EndpointAddress) { const { endpoint } = this.props; diff --git a/src/renderer/components/+network-endpoints/endpoints.store.ts b/src/renderer/components/+network-endpoints/endpoints.store.ts index db19e927c3..6b31b22190 100644 --- a/src/renderer/components/+network-endpoints/endpoints.store.ts +++ b/src/renderer/components/+network-endpoints/endpoints.store.ts @@ -1,7 +1,9 @@ import { KubeObjectStore } from "../../kube-object.store"; import { Endpoint, endpointApi } from "../../api/endpoints/endpoint.api"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class EndpointStore extends KubeObjectStore { api = endpointApi; } diff --git a/src/renderer/components/+network-ingresses/ingress.store.ts b/src/renderer/components/+network-ingresses/ingress.store.ts index e8d6257d0b..eb7c238140 100644 --- a/src/renderer/components/+network-ingresses/ingress.store.ts +++ b/src/renderer/components/+network-ingresses/ingress.store.ts @@ -2,7 +2,9 @@ import { makeObservable, observable } from "mobx"; import { KubeObjectStore } from "../../kube-object.store"; import { IIngressMetrics, Ingress, ingressApi } from "../../api/endpoints"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class IngressStore extends KubeObjectStore { api = ingressApi; @observable metrics: IIngressMetrics = null; diff --git a/src/renderer/components/+network-policies/network-policy.store.ts b/src/renderer/components/+network-policies/network-policy.store.ts index 5ee584dd93..8d07eba73a 100644 --- a/src/renderer/components/+network-policies/network-policy.store.ts +++ b/src/renderer/components/+network-policies/network-policy.store.ts @@ -1,7 +1,9 @@ import { KubeObjectStore } from "../../kube-object.store"; import { NetworkPolicy, networkPolicyApi } from "../../api/endpoints/network-policy.api"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class NetworkPolicyStore extends KubeObjectStore { api = networkPolicyApi; } diff --git a/src/renderer/components/+network-services/services.store.ts b/src/renderer/components/+network-services/services.store.ts index 62c7c63736..f14c4d5410 100644 --- a/src/renderer/components/+network-services/services.store.ts +++ b/src/renderer/components/+network-services/services.store.ts @@ -1,7 +1,9 @@ import { KubeObjectStore } from "../../kube-object.store"; import { Service, serviceApi } from "../../api/endpoints/service.api"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class ServiceStore extends KubeObjectStore { api = serviceApi; } diff --git a/src/renderer/components/+nodes/nodes.store.ts b/src/renderer/components/+nodes/nodes.store.ts index b9958f41ba..c193510ca0 100644 --- a/src/renderer/components/+nodes/nodes.store.ts +++ b/src/renderer/components/+nodes/nodes.store.ts @@ -3,7 +3,9 @@ import { action, computed, makeObservable, observable } from "mobx"; import { clusterApi, IClusterMetrics, INodeMetrics, Node, nodesApi } from "../../api/endpoints"; import { KubeObjectStore } from "../../kube-object.store"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class NodesStore extends KubeObjectStore { api = nodesApi; diff --git a/src/renderer/components/+pod-security-policies/pod-security-policies.store.ts b/src/renderer/components/+pod-security-policies/pod-security-policies.store.ts index 784aedb889..241b4b42e9 100644 --- a/src/renderer/components/+pod-security-policies/pod-security-policies.store.ts +++ b/src/renderer/components/+pod-security-policies/pod-security-policies.store.ts @@ -1,7 +1,9 @@ import { PodSecurityPolicy, pspApi } from "../../api/endpoints"; import { KubeObjectStore } from "../../kube-object.store"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class PodSecurityPoliciesStore extends KubeObjectStore { api = pspApi; } diff --git a/src/renderer/components/+storage-classes/storage-class.store.ts b/src/renderer/components/+storage-classes/storage-class.store.ts index 0ec7277b36..df39266820 100644 --- a/src/renderer/components/+storage-classes/storage-class.store.ts +++ b/src/renderer/components/+storage-classes/storage-class.store.ts @@ -2,7 +2,9 @@ import { KubeObjectStore } from "../../kube-object.store"; import { StorageClass, storageClassApi } from "../../api/endpoints/storage-class.api"; import { apiManager } from "../../api/api-manager"; import { volumesStore } from "../+storage-volumes/volumes.store"; +import { autobind } from "../../../common/utils"; +@autobind export class StorageClassStore extends KubeObjectStore { api = storageClassApi; diff --git a/src/renderer/components/+storage-volume-claims/volume-claim.store.ts b/src/renderer/components/+storage-volume-claims/volume-claim.store.ts index 563606602a..3a0d4731c4 100644 --- a/src/renderer/components/+storage-volume-claims/volume-claim.store.ts +++ b/src/renderer/components/+storage-volume-claims/volume-claim.store.ts @@ -2,7 +2,9 @@ import { action, makeObservable, observable } from "mobx"; import { KubeObjectStore } from "../../kube-object.store"; import { IPvcMetrics, PersistentVolumeClaim, pvcApi } from "../../api/endpoints"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class VolumeClaimStore extends KubeObjectStore { api = pvcApi; @observable metrics: IPvcMetrics = null; diff --git a/src/renderer/components/+storage-volumes/volume-details-list.tsx b/src/renderer/components/+storage-volumes/volume-details-list.tsx index 58d1e75824..3b5673f532 100644 --- a/src/renderer/components/+storage-volumes/volume-details-list.tsx +++ b/src/renderer/components/+storage-volumes/volume-details-list.tsx @@ -39,7 +39,7 @@ export class VolumeDetailsList extends React.Component { makeObservable(this); } - @autobind() + @autobind getTableRow(uid: string) { const { persistentVolumes } = this.props; const volume = persistentVolumes.find(volume => volume.getId() === uid); diff --git a/src/renderer/components/+storage-volumes/volumes.store.ts b/src/renderer/components/+storage-volumes/volumes.store.ts index f5ea598ced..74d3ddde6b 100644 --- a/src/renderer/components/+storage-volumes/volumes.store.ts +++ b/src/renderer/components/+storage-volumes/volumes.store.ts @@ -2,7 +2,9 @@ import { KubeObjectStore } from "../../kube-object.store"; import { PersistentVolume, persistentVolumeApi } from "../../api/endpoints/persistent-volume.api"; import { apiManager } from "../../api/api-manager"; import { StorageClass } from "../../api/endpoints/storage-class.api"; +import { autobind } from "../../../common/utils"; +@autobind export class PersistentVolumesStore extends KubeObjectStore { api = persistentVolumeApi; diff --git a/src/renderer/components/+user-management-roles-bindings/role-binding-details.tsx b/src/renderer/components/+user-management-roles-bindings/role-binding-details.tsx index eb28725422..0b57604a63 100644 --- a/src/renderer/components/+user-management-roles-bindings/role-binding-details.tsx +++ b/src/renderer/components/+user-management-roles-bindings/role-binding-details.tsx @@ -47,7 +47,7 @@ export class RoleBindingDetails extends React.Component { ); } - @autobind() + @autobind removeSelectedSubjects() { const { object: roleBinding } = this.props; const { selectedSubjects } = this; diff --git a/src/renderer/components/+user-management-roles-bindings/role-bindings.store.ts b/src/renderer/components/+user-management-roles-bindings/role-bindings.store.ts index 1fd13cc130..ff2f184f6b 100644 --- a/src/renderer/components/+user-management-roles-bindings/role-bindings.store.ts +++ b/src/renderer/components/+user-management-roles-bindings/role-bindings.store.ts @@ -3,7 +3,9 @@ import uniqBy from "lodash/uniqBy"; import { clusterRoleBindingApi, IRoleBindingSubject, RoleBinding, roleBindingApi } from "../../api/endpoints"; import { KubeObjectStore, KubeObjectStoreLoadingParams } from "../../kube-object.store"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class RoleBindingsStore extends KubeObjectStore { api = clusterRoleBindingApi; diff --git a/src/renderer/components/+user-management-roles/roles.store.ts b/src/renderer/components/+user-management-roles/roles.store.ts index 6160ec3e06..65177d1b5f 100644 --- a/src/renderer/components/+user-management-roles/roles.store.ts +++ b/src/renderer/components/+user-management-roles/roles.store.ts @@ -1,7 +1,9 @@ import { clusterRoleApi, Role, roleApi } from "../../api/endpoints"; import { KubeObjectStore, KubeObjectStoreLoadingParams } from "../../kube-object.store"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class RolesStore extends KubeObjectStore { api = clusterRoleApi; diff --git a/src/renderer/components/+user-management-service-accounts/service-accounts.store.ts b/src/renderer/components/+user-management-service-accounts/service-accounts.store.ts index 4ff42b80cf..34a7a14531 100644 --- a/src/renderer/components/+user-management-service-accounts/service-accounts.store.ts +++ b/src/renderer/components/+user-management-service-accounts/service-accounts.store.ts @@ -1,7 +1,9 @@ import { ServiceAccount, serviceAccountsApi } from "../../api/endpoints"; import { KubeObjectStore } from "../../kube-object.store"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class ServiceAccountsStore extends KubeObjectStore { api = serviceAccountsApi; diff --git a/src/renderer/components/+workloads-cronjobs/cronjob.store.ts b/src/renderer/components/+workloads-cronjobs/cronjob.store.ts index cf701f3487..060c74ca80 100644 --- a/src/renderer/components/+workloads-cronjobs/cronjob.store.ts +++ b/src/renderer/components/+workloads-cronjobs/cronjob.store.ts @@ -2,7 +2,9 @@ import { KubeObjectStore } from "../../kube-object.store"; import { CronJob, cronJobApi } from "../../api/endpoints/cron-job.api"; import { jobStore } from "../+workloads-jobs/job.store"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class CronJobStore extends KubeObjectStore { api = cronJobApi; diff --git a/src/renderer/components/+workloads-daemonsets/daemonsets.store.ts b/src/renderer/components/+workloads-daemonsets/daemonsets.store.ts index 148dbebb4c..7da741f2d3 100644 --- a/src/renderer/components/+workloads-daemonsets/daemonsets.store.ts +++ b/src/renderer/components/+workloads-daemonsets/daemonsets.store.ts @@ -3,7 +3,9 @@ import { KubeObjectStore } from "../../kube-object.store"; import { DaemonSet, daemonSetApi, IPodMetrics, Pod, podsApi, PodStatus } from "../../api/endpoints"; import { podsStore } from "../+workloads-pods/pods.store"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class DaemonSetStore extends KubeObjectStore { api = daemonSetApi; diff --git a/src/renderer/components/+workloads-deployments/deployments.store.ts b/src/renderer/components/+workloads-deployments/deployments.store.ts index 3391e1107f..3019eb1c94 100644 --- a/src/renderer/components/+workloads-deployments/deployments.store.ts +++ b/src/renderer/components/+workloads-deployments/deployments.store.ts @@ -3,7 +3,9 @@ import { Deployment, deploymentApi, IPodMetrics, podsApi, PodStatus } from "../. import { KubeObjectStore } from "../../kube-object.store"; import { podsStore } from "../+workloads-pods/pods.store"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class DeploymentStore extends KubeObjectStore { api = deploymentApi; @observable metrics: IPodMetrics = null; diff --git a/src/renderer/components/+workloads-jobs/job.store.ts b/src/renderer/components/+workloads-jobs/job.store.ts index 2eca7ac88c..7c177641d6 100644 --- a/src/renderer/components/+workloads-jobs/job.store.ts +++ b/src/renderer/components/+workloads-jobs/job.store.ts @@ -3,7 +3,9 @@ import { Job, jobApi } from "../../api/endpoints/job.api"; import { CronJob, Pod, PodStatus } from "../../api/endpoints"; import { podsStore } from "../+workloads-pods/pods.store"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class JobStore extends KubeObjectStore { api = jobApi; diff --git a/src/renderer/components/+workloads-overview/overview-statuses.tsx b/src/renderer/components/+workloads-overview/overview-statuses.tsx index 0bbb938d6b..bf7ac406f2 100644 --- a/src/renderer/components/+workloads-overview/overview-statuses.tsx +++ b/src/renderer/components/+workloads-overview/overview-statuses.tsx @@ -29,7 +29,7 @@ export class OverviewStatuses extends React.Component { makeObservable(this); } - @autobind() + @autobind renderWorkload(resource: KubeResource): React.ReactElement { const store = workloadStores[resource]; const items = store.getAllByNs(namespaceStore.contextNamespaces); diff --git a/src/renderer/components/+workloads-pods/pod-details-list.tsx b/src/renderer/components/+workloads-pods/pod-details-list.tsx index f4a4542f4c..154ba30e44 100644 --- a/src/renderer/components/+workloads-pods/pod-details-list.tsx +++ b/src/renderer/components/+workloads-pods/pod-details-list.tsx @@ -103,7 +103,7 @@ export class PodDetailsList extends React.Component { ); } - @autobind() + @autobind getTableRow(uid: string) { const { pods } = this.props; const pod = pods.find(pod => pod.getId() == uid); diff --git a/src/renderer/components/+workloads-pods/pod-details.tsx b/src/renderer/components/+workloads-pods/pod-details.tsx index f21b32b68b..4f34436525 100644 --- a/src/renderer/components/+workloads-pods/pod-details.tsx +++ b/src/renderer/components/+workloads-pods/pod-details.tsx @@ -56,7 +56,7 @@ export class PodDetails extends React.Component { podsStore.reset(); } - @autobind() + @autobind async loadMetrics() { const { object: pod } = this.props; diff --git a/src/renderer/components/+workloads-pods/pods.store.ts b/src/renderer/components/+workloads-pods/pods.store.ts index ab075650d4..fd5ce473ca 100644 --- a/src/renderer/components/+workloads-pods/pods.store.ts +++ b/src/renderer/components/+workloads-pods/pods.store.ts @@ -1,11 +1,12 @@ import countBy from "lodash/countBy"; import { action, makeObservable, observable } from "mobx"; import { KubeObjectStore } from "../../kube-object.store"; -import { cpuUnitsToNumber, unitsToBytes } from "../../utils"; +import { autobind, cpuUnitsToNumber, unitsToBytes } from "../../utils"; import { IPodMetrics, Pod, PodMetrics, podMetricsApi, podsApi } from "../../api/endpoints"; import { apiManager } from "../../api/api-manager"; import { WorkloadKubeObject } from "../../api/workload-kube-object"; +@autobind export class PodsStore extends KubeObjectStore { api = podsApi; diff --git a/src/renderer/components/+workloads-replicasets/replicasets.store.ts b/src/renderer/components/+workloads-replicasets/replicasets.store.ts index 6b5cc10ad3..cf345a5be0 100644 --- a/src/renderer/components/+workloads-replicasets/replicasets.store.ts +++ b/src/renderer/components/+workloads-replicasets/replicasets.store.ts @@ -4,7 +4,9 @@ import { Deployment, IPodMetrics, podsApi, ReplicaSet, replicaSetApi } from "../ import { podsStore } from "../+workloads-pods/pods.store"; import { apiManager } from "../../api/api-manager"; import { PodStatus } from "../../api/endpoints/pods.api"; +import { autobind } from "../../../common/utils"; +@autobind export class ReplicaSetStore extends KubeObjectStore { api = replicaSetApi; @observable metrics: IPodMetrics = null; diff --git a/src/renderer/components/+workloads-statefulsets/statefulset.store.ts b/src/renderer/components/+workloads-statefulsets/statefulset.store.ts index 533d972721..4831cf459a 100644 --- a/src/renderer/components/+workloads-statefulsets/statefulset.store.ts +++ b/src/renderer/components/+workloads-statefulsets/statefulset.store.ts @@ -3,7 +3,9 @@ import { KubeObjectStore } from "../../kube-object.store"; import { IPodMetrics, podsApi, PodStatus, StatefulSet, statefulSetApi } from "../../api/endpoints"; import { podsStore } from "../+workloads-pods/pods.store"; import { apiManager } from "../../api/api-manager"; +import { autobind } from "../../../common/utils"; +@autobind export class StatefulSetStore extends KubeObjectStore { api = statefulSetApi; @observable metrics: IPodMetrics = null; diff --git a/src/renderer/components/ace-editor/ace-editor.tsx b/src/renderer/components/ace-editor/ace-editor.tsx index bc977361d4..33fe1e9de8 100644 --- a/src/renderer/components/ace-editor/ace-editor.tsx +++ b/src/renderer/components/ace-editor/ace-editor.tsx @@ -130,7 +130,7 @@ export class AceEditor extends React.Component { }); } - @autobind() + @autobind onCursorPosChange() { const { onCursorPosChange } = this.props; @@ -139,7 +139,7 @@ export class AceEditor extends React.Component { } } - @autobind() + @autobind onChange(delta: Ace.Delta) { const { onChange } = this.props; diff --git a/src/renderer/components/animate/animate.tsx b/src/renderer/components/animate/animate.tsx index 4006d25c5b..335690016d 100644 --- a/src/renderer/components/animate/animate.tsx +++ b/src/renderer/components/animate/animate.tsx @@ -71,7 +71,7 @@ export class Animate extends React.Component { this.statusClassName.leave = false; } - @autobind() + @autobind onTransitionEnd(evt: React.TransitionEvent) { const { enter, leave } = this.statusClassName; const { onTransitionEnd } = this.contentElem.props; diff --git a/src/renderer/components/checkbox/checkbox.tsx b/src/renderer/components/checkbox/checkbox.tsx index 8d452a1198..5754a78653 100644 --- a/src/renderer/components/checkbox/checkbox.tsx +++ b/src/renderer/components/checkbox/checkbox.tsx @@ -15,7 +15,7 @@ export interface CheckboxProps { export class Checkbox extends React.PureComponent { private input: HTMLInputElement; - @autobind() + @autobind onChange(evt: React.ChangeEvent) { if (this.props.onChange) { this.props.onChange(this.input.checked, evt); diff --git a/src/renderer/components/clipboard/clipboard.tsx b/src/renderer/components/clipboard/clipboard.tsx index f387b487d6..e582626111 100644 --- a/src/renderer/components/clipboard/clipboard.tsx +++ b/src/renderer/components/clipboard/clipboard.tsx @@ -33,7 +33,7 @@ export class Clipboard extends React.Component { return React.Children.only(this.props.children) as React.ReactElement; } - @autobind() + @autobind onClick(evt: React.MouseEvent) { if (this.rootReactElem.props.onClick) { this.rootReactElem.props.onClick(evt); // pass event to children-root-element if any diff --git a/src/renderer/components/cluster-settings/components/cluster-kubeconfig.tsx b/src/renderer/components/cluster-settings/components/cluster-kubeconfig.tsx index f1a475c325..fe8af9b871 100644 --- a/src/renderer/components/cluster-settings/components/cluster-kubeconfig.tsx +++ b/src/renderer/components/cluster-settings/components/cluster-kubeconfig.tsx @@ -12,7 +12,7 @@ interface Props { @observer export class ClusterKubeconfig extends React.Component { - @autobind() + @autobind openKubeconfig() { const { cluster } = this.props; diff --git a/src/renderer/components/cluster-settings/components/remove-cluster-button.tsx b/src/renderer/components/cluster-settings/components/remove-cluster-button.tsx index 62a749ec8e..9c0b35dddd 100644 --- a/src/renderer/components/cluster-settings/components/remove-cluster-button.tsx +++ b/src/renderer/components/cluster-settings/components/remove-cluster-button.tsx @@ -18,7 +18,7 @@ export class RemoveClusterButton extends React.Component { makeObservable(this); } - @autobind() + @autobind confirmRemoveCluster() { const { cluster } = this.props; diff --git a/src/renderer/components/dock/create-resource.store.ts b/src/renderer/components/dock/create-resource.store.ts index 5b99e68b52..ea3a30016b 100644 --- a/src/renderer/components/dock/create-resource.store.ts +++ b/src/renderer/components/dock/create-resource.store.ts @@ -6,7 +6,9 @@ import filehound from "filehound"; import { watch } from "chokidar"; import { DockTabStore } from "./dock-tab.store"; import { dockStore, IDockTab, TabKind } from "./dock.store"; +import { autobind } from "../../../common/utils"; +@autobind export class CreateResourceStore extends DockTabStore { constructor() { diff --git a/src/renderer/components/dock/dock-tab.store.ts b/src/renderer/components/dock/dock-tab.store.ts index f524fbfda7..47d96d5801 100644 --- a/src/renderer/components/dock/dock-tab.store.ts +++ b/src/renderer/components/dock/dock-tab.store.ts @@ -1,5 +1,5 @@ import { autorun, observable, reaction } from "mobx"; -import { createStorage, StorageHelper, toJS } from "../../utils"; +import { autobind, createStorage, StorageHelper, toJS } from "../../utils"; import { dockStore, TabId } from "./dock.store"; export interface DockTabStoreOptions { @@ -9,6 +9,7 @@ export interface DockTabStoreOptions { export type DockTabStorageState = Record; +@autobind export class DockTabStore { protected storage?: StorageHelper>; protected data = observable.map(); diff --git a/src/renderer/components/dock/dock-tab.tsx b/src/renderer/components/dock/dock-tab.tsx index 64e2ef3511..d001337172 100644 --- a/src/renderer/components/dock/dock-tab.tsx +++ b/src/renderer/components/dock/dock-tab.tsx @@ -26,7 +26,7 @@ export class DockTab extends React.Component { return this.props.value.id; } - @autobind() + @autobind close() { dockStore.closeTab(this.tabId); } diff --git a/src/renderer/components/dock/dock.store.ts b/src/renderer/components/dock/dock.store.ts index 21f1125518..f487ab25f8 100644 --- a/src/renderer/components/dock/dock.store.ts +++ b/src/renderer/components/dock/dock.store.ts @@ -1,6 +1,6 @@ import MD5 from "crypto-js/md5"; import { action, computed, IReactionOptions, makeObservable, observable, reaction } from "mobx"; -import { createStorage, StorageHelper } from "../../utils"; +import { autobind, createStorage, StorageHelper } from "../../utils"; import throttle from "lodash/throttle"; export type TabId = string; @@ -28,7 +28,12 @@ export interface DockStorageState { isOpen?: boolean; } +@autobind export class DockStore implements DockStorageState { + private storage: StorageHelper; + public readonly minHeight = 100; + @observable fullSize = false; + constructor() { makeObservable(this); @@ -42,10 +47,6 @@ export class DockStore implements DockStorageState { this.bindEvents(); } - private storage: StorageHelper; - public readonly minHeight = 100; - @observable fullSize = false; - get isOpen(): boolean { return this.storage.get().isOpen; } @@ -127,6 +128,7 @@ export class DockStore implements DockStorageState { } } + @action close() { this.isOpen = false; } @@ -142,7 +144,7 @@ export class DockStore implements DockStorageState { this.fullSize = !this.fullSize; } - getTabById(tabId: TabId) { + getTabById(tabId: TabId): IDockTab | undefined { return this.tabs.find(tab => tab.id === tabId); } diff --git a/src/renderer/components/dock/edit-resource.store.ts b/src/renderer/components/dock/edit-resource.store.ts index ed6f706eec..538f19b7c0 100644 --- a/src/renderer/components/dock/edit-resource.store.ts +++ b/src/renderer/components/dock/edit-resource.store.ts @@ -1,4 +1,4 @@ -import { noop } from "../../utils"; +import { autobind, noop } from "../../utils"; import { DockTabStore } from "./dock-tab.store"; import { autorun, IReactionDisposer } from "mobx"; import { dockStore, IDockTab, TabId, TabKind } from "./dock.store"; @@ -11,6 +11,7 @@ export interface EditingResource { draft?: string; // edited draft in yaml } +@autobind export class EditResourceStore extends DockTabStore { private watchers = new Map(); diff --git a/src/renderer/components/dock/install-chart.store.ts b/src/renderer/components/dock/install-chart.store.ts index a3efc706a3..f5625cfce8 100644 --- a/src/renderer/components/dock/install-chart.store.ts +++ b/src/renderer/components/dock/install-chart.store.ts @@ -25,6 +25,7 @@ export class InstallChartStore extends DockTabStore { storageKey: "install_charts" }); makeObservable(this); + autorun(() => { const { selectedTab, isOpen } = dockStore; diff --git a/src/renderer/components/dock/install-chart.tsx b/src/renderer/components/dock/install-chart.tsx index c146ba32e6..0fdbf9ea40 100644 --- a/src/renderer/components/dock/install-chart.tsx +++ b/src/renderer/components/dock/install-chart.tsx @@ -54,7 +54,7 @@ export class InstallChart extends Component { return installChartStore.details.getData(this.tabId); } - @autobind() + @autobind viewRelease() { const { release } = this.releaseDetails; @@ -67,14 +67,14 @@ export class InstallChart extends Component { dockStore.closeTab(this.tabId); } - @autobind() + @autobind save(data: Partial) { const chart = { ...this.chartData, ...data }; installChartStore.setData(this.tabId, chart); } - @autobind() + @autobind onVersionChange(option: SelectOption) { const version = option.value; @@ -82,18 +82,18 @@ export class InstallChart extends Component { installChartStore.loadValues(this.tabId); } - @autobind() + @autobind onValuesChange(values: string, error?: string) { this.error = error; this.save({ values }); } - @autobind() + @autobind onNamespaceChange(opt: SelectOption) { this.save({ namespace: opt.value }); } - @autobind() + @autobind onReleaseNameChange(name: string) { this.save({ releaseName: name }); } diff --git a/src/renderer/components/dock/log.store.ts b/src/renderer/components/dock/log.store.ts index 8a179d0ae2..21722d93cc 100644 --- a/src/renderer/components/dock/log.store.ts +++ b/src/renderer/components/dock/log.store.ts @@ -1,6 +1,6 @@ import { autorun, computed, makeObservable, observable } from "mobx"; import { IPodLogsQuery, Pod, podsApi } from "../../api/endpoints"; -import { interval } from "../../utils"; +import { autobind, interval } from "../../utils"; import { dockStore, TabId } from "./dock.store"; import { isLogsTab, logTabStore } from "./log-tab.store"; @@ -8,6 +8,7 @@ type PodLogLine = string; const logLinesToLoad = 500; +@autobind export class LogStore { private refresher = interval(10, () => { const id = dockStore.selectedTabId; diff --git a/src/renderer/components/dock/logs.tsx b/src/renderer/components/dock/logs.tsx index e698c543ca..498fcd9343 100644 --- a/src/renderer/components/dock/logs.tsx +++ b/src/renderer/components/dock/logs.tsx @@ -54,7 +54,7 @@ export class Logs extends React.Component { * A function for various actions after search is happened * @param query {string} A text from search field */ - @autobind() + @autobind onSearch() { this.toOverlay(); } @@ -62,7 +62,7 @@ export class Logs extends React.Component { /** * Scrolling to active overlay (search word highlight) */ - @autobind() + @autobind toOverlay() { const { activeOverlayLine } = searchStore; diff --git a/src/renderer/components/dock/terminal-tab.tsx b/src/renderer/components/dock/terminal-tab.tsx index c9ea467989..ba3f757581 100644 --- a/src/renderer/components/dock/terminal-tab.tsx +++ b/src/renderer/components/dock/terminal-tab.tsx @@ -28,7 +28,7 @@ export class TerminalTab extends React.Component { return terminalStore.isDisconnected(this.tabId); } - @autobind() + @autobind reconnect() { terminalStore.reconnect(this.tabId); } diff --git a/src/renderer/components/dock/terminal.store.ts b/src/renderer/components/dock/terminal.store.ts index dd3f41bfcc..ac0777bec6 100644 --- a/src/renderer/components/dock/terminal.store.ts +++ b/src/renderer/components/dock/terminal.store.ts @@ -3,6 +3,7 @@ import { Terminal } from "./terminal"; import { TerminalApi } from "../../api/terminal-api"; import { dockStore, IDockTab, TabId, TabKind } from "./dock.store"; import { WebSocketApiState } from "../../api/websocket-api"; +import { autobind } from "../../../common/utils"; export interface ITerminalTab extends IDockTab { node?: string; // activate node shell mode @@ -20,6 +21,7 @@ export function createTerminalTab(tabParams: Partial = {}) { }); } +@autobind export class TerminalStore { protected terminals = new Map(); protected connections = observable.map(); diff --git a/src/renderer/components/dock/terminal.ts b/src/renderer/components/dock/terminal.ts index 96c07f5c73..623f041da8 100644 --- a/src/renderer/components/dock/terminal.ts +++ b/src/renderer/components/dock/terminal.ts @@ -35,7 +35,7 @@ export class Terminal { public scrollPos = 0; public disposers: Function[] = []; - @autobind() + @autobind protected setTheme(colors: Record) { // Replacing keys stored in styles to format accepted by terminal // E.g. terminalBrightBlack -> brightBlack diff --git a/src/renderer/components/editable-list/editable-list.tsx b/src/renderer/components/editable-list/editable-list.tsx index c2eaa703f7..e0f72c4bca 100644 --- a/src/renderer/components/editable-list/editable-list.tsx +++ b/src/renderer/components/editable-list/editable-list.tsx @@ -33,7 +33,7 @@ export class EditableList extends React.Component> { makeObservable(this); } - @autobind() + @autobind onSubmit(val: string) { const { add } = this.props; diff --git a/src/renderer/components/icon/icon.tsx b/src/renderer/components/icon/icon.tsx index 246e68414d..0c4cec3fef 100644 --- a/src/renderer/components/icon/icon.tsx +++ b/src/renderer/components/icon/icon.tsx @@ -36,7 +36,7 @@ export class Icon extends React.PureComponent { return interactive ?? !!(onClick || href || link); } - @autobind() + @autobind onClick(evt: React.MouseEvent) { if (this.props.disabled) { return; @@ -47,7 +47,7 @@ export class Icon extends React.PureComponent { } } - @autobind() + @autobind onKeyDown(evt: React.KeyboardEvent) { switch (evt.nativeEvent.code) { case "Space": diff --git a/src/renderer/components/input/drop-file-input.tsx b/src/renderer/components/input/drop-file-input.tsx index 81cbb2d5f9..7be233e1d6 100644 --- a/src/renderer/components/input/drop-file-input.tsx +++ b/src/renderer/components/input/drop-file-input.tsx @@ -24,17 +24,17 @@ export class DropFileInput extends React.Component< makeObservable(this); } - @autobind() + @autobind onDragEnter() { this.dropAreaActive = true; } - @autobind() + @autobind onDragLeave() { this.dropAreaActive = false; } - @autobind() + @autobind onDragOver(evt: React.DragEvent) { if (this.props.onDragOver) { this.props.onDragOver(evt); @@ -43,7 +43,7 @@ export class DropFileInput extends React.Component< evt.dataTransfer.dropEffect = "move"; } - @autobind() + @autobind onDrop(evt: React.DragEvent) { if (this.props.onDrop) { this.props.onDrop(evt); diff --git a/src/renderer/components/input/input.tsx b/src/renderer/components/input/input.tsx index ad3b77c8e8..c90831a6b9 100644 --- a/src/renderer/components/input/input.tsx +++ b/src/renderer/components/input/input.tsx @@ -195,7 +195,7 @@ export class Input extends React.Component { this.setState({ dirty }); } - @autobind() + @autobind onFocus(evt: React.FocusEvent) { const { onFocus, autoSelectOnFocus } = this.props; @@ -204,7 +204,7 @@ export class Input extends React.Component { this.setState({ focused: true }); } - @autobind() + @autobind onBlur(evt: React.FocusEvent) { const { onBlur } = this.props; @@ -213,7 +213,7 @@ export class Input extends React.Component { this.setState({ focused: false }); } - @autobind() + @autobind onChange(evt: React.ChangeEvent) { if (this.props.onChange) { this.props.onChange(evt.currentTarget.value, evt); @@ -232,7 +232,7 @@ export class Input extends React.Component { } } - @autobind() + @autobind onKeyDown(evt: React.KeyboardEvent) { const modified = evt.shiftKey || evt.metaKey || evt.altKey || evt.ctrlKey; @@ -281,7 +281,7 @@ export class Input extends React.Component { } } - @autobind() + @autobind bindRef(elem: InputElement) { this.input = elem; } diff --git a/src/renderer/components/input/search-input.tsx b/src/renderer/components/input/search-input.tsx index 144cf10ada..43da86bdeb 100644 --- a/src/renderer/components/input/search-input.tsx +++ b/src/renderer/components/input/search-input.tsx @@ -37,7 +37,7 @@ export class SearchInput extends React.Component { window.removeEventListener("keydown", this.onGlobalKey); } - @autobind() + @autobind onGlobalKey(evt: KeyboardEvent) { const meta = evt.metaKey || evt.ctrlKey; @@ -46,7 +46,7 @@ export class SearchInput extends React.Component { } } - @autobind() + @autobind onKeyDown(evt: React.KeyboardEvent) { if (this.props.onKeyDown) { this.props.onKeyDown(evt); @@ -60,7 +60,7 @@ export class SearchInput extends React.Component { } } - @autobind() + @autobind clear() { if (this.props.onClear) { this.props.onClear(); diff --git a/src/renderer/components/item-object-list/item-list-layout.tsx b/src/renderer/components/item-object-list/item-list-layout.tsx index 00eb682ef1..5bf6cfdefb 100644 --- a/src/renderer/components/item-object-list/item-list-layout.tsx +++ b/src/renderer/components/item-object-list/item-list-layout.tsx @@ -94,6 +94,7 @@ const defaultProps: Partial = { customizeTableRowProps: () => ({} as TableRowProps), }; +@autobind @observer export class ItemListLayout extends React.Component { static defaultProps = defaultProps as object; @@ -203,7 +204,7 @@ export class ItemListLayout extends React.Component { } @computed get items() { - const {filters, filterCallbacks } = this; + const { filters, filterCallbacks } = this; const filterGroups = groupBy(filters, ({ type }) => type); const filterItems: ItemsFilter[] = []; @@ -221,7 +222,6 @@ export class ItemListLayout extends React.Component { return this.applyFilters(filterItems.concat(this.props.filterItems), items); } - @autobind() getRow(uid: string) { const { isSelectable, renderTableHeader, renderTableContents, renderItemMenu, @@ -274,7 +274,6 @@ export class ItemListLayout extends React.Component { ); } - @autobind() removeItemsDialog() { const { customizeRemoveDialog, store } = this.props; const { selectedItems } = store; @@ -294,7 +293,6 @@ export class ItemListLayout extends React.Component { }); } - @autobind() toggleFilters() { this.showFilters = !this.showFilters; } @@ -316,7 +314,7 @@ export class ItemListLayout extends React.Component { } if (!this.isReady) { - return ; + return ; } if (this.filters.length > 0) { diff --git a/src/renderer/components/item-object-list/page-filters.store.ts b/src/renderer/components/item-object-list/page-filters.store.ts index 55d8cfeacf..c89e0e4636 100644 --- a/src/renderer/components/item-object-list/page-filters.store.ts +++ b/src/renderer/components/item-object-list/page-filters.store.ts @@ -1,5 +1,6 @@ import { computed, makeObservable, observable, reaction } from "mobx"; import { searchUrlParam } from "../input/search-input-url"; +import { autobind } from "../../../common/utils"; export enum FilterType { SEARCH = "search", @@ -11,6 +12,7 @@ export interface Filter { value: string; } +@autobind export class PageFiltersStore { protected filters = observable.array([], { deep: false }); protected isDisabled = observable.map(); diff --git a/src/renderer/components/kube-object/kube-object-menu.tsx b/src/renderer/components/kube-object/kube-object-menu.tsx index 470e98dac4..c8a1dedad6 100644 --- a/src/renderer/components/kube-object/kube-object-menu.tsx +++ b/src/renderer/components/kube-object/kube-object-menu.tsx @@ -34,13 +34,13 @@ export class KubeObjectMenu extends React.Component extends React.Component { export class KubeConfigDialog extends React.Component { static metadata = observable({ isOpen: false, - data: null as IKubeconfigDialogData, + data: {} as IKubeconfigDialogData, }); @observable.ref configTextArea: HTMLTextAreaElement; // required for coping config text diff --git a/src/renderer/components/layout/page-layout.tsx b/src/renderer/components/layout/page-layout.tsx index 2f1992a11d..7152843d76 100644 --- a/src/renderer/components/layout/page-layout.tsx +++ b/src/renderer/components/layout/page-layout.tsx @@ -23,7 +23,7 @@ const defaultProps: Partial = { export class PageLayout extends React.Component { static defaultProps = defaultProps as object; - @autobind() + @autobind back(evt?: React.MouseEvent | KeyboardEvent) { if (this.props.back) { this.props.back(evt); diff --git a/src/renderer/components/menu/menu-actions.tsx b/src/renderer/components/menu/menu-actions.tsx index 6415018d95..ef3d6880f4 100644 --- a/src/renderer/components/menu/menu-actions.tsx +++ b/src/renderer/components/menu/menu-actions.tsx @@ -43,7 +43,7 @@ export class MenuActions extends React.Component { makeObservable(this); } - @autobind() + @autobind remove() { const { removeAction } = this.props; let { removeConfirmationMessage } = this.props; diff --git a/src/renderer/components/menu/menu.tsx b/src/renderer/components/menu/menu.tsx index 308e6f863f..22a6d96187 100644 --- a/src/renderer/components/menu/menu.tsx +++ b/src/renderer/components/menu/menu.tsx @@ -47,7 +47,7 @@ const defaultPropsMenu: Partial = { toggleEvent: "click" }; -@autobind() +@autobind export class Menu extends React.Component { static defaultProps = defaultPropsMenu as object; @@ -319,7 +319,7 @@ const defaultPropsMenuItem: Partial = { onClick: noop, }; -@autobind() +@autobind export class MenuItem extends React.Component { static defaultProps = defaultPropsMenuItem as object; static contextType = MenuContext; diff --git a/src/renderer/components/select/select.tsx b/src/renderer/components/select/select.tsx index 543433bb06..905423036a 100644 --- a/src/renderer/components/select/select.tsx +++ b/src/renderer/components/select/select.tsx @@ -85,14 +85,14 @@ export class Select extends React.Component { return options as SelectOption[]; } - @autobind() + @autobind onChange(value: SelectOption, meta: ActionMeta) { if (this.props.onChange) { this.props.onChange(value, meta); } } - @autobind() + @autobind onKeyDown(evt: React.KeyboardEvent) { if (this.props.onKeyDown) { this.props.onKeyDown(evt); diff --git a/src/renderer/components/table/table-cell.tsx b/src/renderer/components/table/table-cell.tsx index 81e2f9f85f..714c0810e0 100644 --- a/src/renderer/components/table/table-cell.tsx +++ b/src/renderer/components/table/table-cell.tsx @@ -23,7 +23,7 @@ export interface TableCellProps extends React.DOMAttributes { } export class TableCell extends React.Component { - @autobind() + @autobind onClick(evt: React.MouseEvent) { if (this.props.onClick) { this.props.onClick(evt); diff --git a/src/renderer/components/table/table.tsx b/src/renderer/components/table/table.tsx index a9d626b5c3..efaf1a671e 100644 --- a/src/renderer/components/table/table.tsx +++ b/src/renderer/components/table/table.tsx @@ -122,7 +122,7 @@ export class Table extends React.Component { return orderBy(items, sortingCallback, order as any); } - @autobind() + @autobind protected onSort({ sortBy, orderBy }: TableSortParams) { setSortParams(this.props.tableId, { sortBy, orderBy }); const { sortSyncWithUrl, onSort } = this.props; @@ -137,7 +137,7 @@ export class Table extends React.Component { } } - @autobind() + @autobind sort(colName: TableSortBy) { const { sortBy, orderBy } = this.sortParams; const sameColumn = sortBy == colName; diff --git a/src/renderer/components/tabs/tabs.tsx b/src/renderer/components/tabs/tabs.tsx index fa81e43929..f497c63f9e 100644 --- a/src/renderer/components/tabs/tabs.tsx +++ b/src/renderer/components/tabs/tabs.tsx @@ -24,7 +24,7 @@ export interface TabsProps extends TabsContextValue, Omit { public elem: HTMLElement; - @autobind() + @autobind protected bindRef(elem: HTMLElement) { this.elem = elem; } @@ -82,7 +82,7 @@ export class Tab extends React.PureComponent { }); } - @autobind() + @autobind onClick(evt: React.MouseEvent) { const { value, active, disabled, onClick } = this.props; const { onChange } = this.context; @@ -92,7 +92,7 @@ export class Tab extends React.PureComponent { if (onChange) onChange(value); } - @autobind() + @autobind onFocus(evt: React.FocusEvent) { const { onFocus } = this.props; @@ -100,7 +100,7 @@ export class Tab extends React.PureComponent { this.scrollIntoView(); } - @autobind() + @autobind onKeyDown(evt: React.KeyboardEvent) { const ENTER_KEY = evt.keyCode === 13; const SPACE_KEY = evt.keyCode === 32; @@ -117,7 +117,7 @@ export class Tab extends React.PureComponent { } } - @autobind() + @autobind protected bindRef(elem: HTMLElement) { this.elem = elem; } diff --git a/src/renderer/components/tooltip/tooltip.tsx b/src/renderer/components/tooltip/tooltip.tsx index 69a88aabe4..db4f65c1f9 100644 --- a/src/renderer/components/tooltip/tooltip.tsx +++ b/src/renderer/components/tooltip/tooltip.tsx @@ -78,18 +78,18 @@ export class Tooltip extends React.Component { this.hoverTarget.removeEventListener("mouseleave", this.onLeaveTarget); } - @autobind() + @autobind protected onEnterTarget() { this.isVisible = true; this.refreshPosition(); } - @autobind() + @autobind protected onLeaveTarget() { this.isVisible = false; } - @autobind() + @autobind refreshPosition() { const { preferredPositions } = this.props; const { elem, targetElem } = this; @@ -199,7 +199,7 @@ export class Tooltip extends React.Component { }; } - @autobind() + @autobind bindRef(elem: HTMLElement) { this.elem = elem; } diff --git a/src/renderer/item.store.ts b/src/renderer/item.store.ts index d9f06d57ee..dbdcbc1735 100644 --- a/src/renderer/item.store.ts +++ b/src/renderer/item.store.ts @@ -1,11 +1,14 @@ import { action, computed, makeObservable, observable, toJS, when } from "mobx"; import { noop, orderBy } from "lodash"; +import { autobind } from "../common/utils"; export interface ItemObject { getId(): string; getName(): string; } +// @ts-ignore +@autobind export abstract class ItemStore { abstract loadAll(...args: any[]): Promise; diff --git a/src/renderer/kube-object.store.ts b/src/renderer/kube-object.store.ts index 351636259e..0da7ab678c 100644 --- a/src/renderer/kube-object.store.ts +++ b/src/renderer/kube-object.store.ts @@ -1,7 +1,7 @@ import type { ClusterContext } from "./components/context"; -import { action, computed, observable, reaction, when, makeObservable } from "mobx"; -import { noop, rejectPromiseBy } from "./utils"; +import { action, computed, makeObservable, observable, reaction, when } from "mobx"; +import { autobind, noop, rejectPromiseBy } from "./utils"; import { KubeObject, KubeStatus } from "./api/kube-object"; import { IKubeWatchEvent } from "./api/kube-watch-api"; import { ItemStore } from "./item.store"; @@ -16,6 +16,8 @@ export interface KubeObjectStoreLoadingParams { reqInit?: RequestInit; } +// @ts-ignore +@autobind export abstract class KubeObjectStore extends ItemStore { static metadata = observable({ context: null as ClusterContext, // TODO: support multiple cluster contexts @@ -349,7 +351,7 @@ export abstract class KubeObjectStore extends ItemSt watch(); } - @action.bound + @action protected updateFromEventsBuffer() { const items = this.items.toJSON(); diff --git a/src/renderer/protocol-handler/router.ts b/src/renderer/protocol-handler/router.ts index d1dc0ceafd..711d2c3dc1 100644 --- a/src/renderer/protocol-handler/router.ts +++ b/src/renderer/protocol-handler/router.ts @@ -14,7 +14,7 @@ export class LensProtocolRouterRenderer extends proto.LensProtocolRouter { .on(proto.ProtocolHandlerExtension, this.ipcExtensionHandler); } - @autobind() + @autobind private ipcInternalHandler(event: Electron.IpcRendererEvent, ...args: any[]): void { if (args.length !== 1) { return void logger.warn(`${proto.LensProtocolRouter.LoggingPrefix}: unexpected number of args`, { args }); @@ -26,7 +26,7 @@ export class LensProtocolRouterRenderer extends proto.LensProtocolRouter { this._routeToInternal(url); } - @autobind() + @autobind private ipcExtensionHandler(event: Electron.IpcRendererEvent, ...args: any[]): void { if (args.length !== 1) { return void logger.warn(`${proto.LensProtocolRouter.LoggingPrefix}: unexpected number of args`, { args }); diff --git a/src/renderer/theme.store.ts b/src/renderer/theme.store.ts index 70c4d7d7b5..f48c61fcc7 100644 --- a/src/renderer/theme.store.ts +++ b/src/renderer/theme.store.ts @@ -19,6 +19,7 @@ export interface Theme { author?: string; } +@autobind export class ThemeStore extends Singleton { protected styles: HTMLStyleElement; @@ -76,7 +77,6 @@ export class ThemeStore extends Singleton { return this.allThemes.get(themeId); } - @autobind() protected async loadTheme(themeId: ThemeId): Promise { try { const existingTheme = this.getThemeById(themeId); @@ -85,7 +85,7 @@ export class ThemeStore extends Singleton { const theme = await import( /* webpackChunkName: "themes/[name]" */ `./themes/${themeId}.json` - ); + ); existingTheme.author = theme.author; existingTheme.colors = theme.colors;