From ddf45c20252855ef41edb9198d1b1736f5bef16e Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 8 Jan 2021 14:29:00 +0200 Subject: [PATCH] fixes Signed-off-by: Roman --- src/renderer/api/kube-watch-api.ts | 4 ++++ .../components/+namespaces/namespace.store.ts | 19 +++++++++-------- .../role-bindings.store.ts | 1 + .../+user-management-roles/roles.store.ts | 1 + .../+workloads-overview/overview.tsx | 21 +++++-------------- .../item-object-list/item-list-layout.tsx | 6 +++--- .../item-object-list/page-filters.store.ts | 6 +++--- src/renderer/kube-object.store.ts | 1 + 8 files changed, 28 insertions(+), 31 deletions(-) diff --git a/src/renderer/api/kube-watch-api.ts b/src/renderer/api/kube-watch-api.ts index 196d2775b0..fe35a04baa 100644 --- a/src/renderer/api/kube-watch-api.ts +++ b/src/renderer/api/kube-watch-api.ts @@ -67,16 +67,20 @@ export class KubeWatchApi { // https://github.com/lensapp/lens/issues/1898 protected async getQuery() { const { namespaceStore } = await import("../components/+namespaces/namespace.store"); + await namespaceStore.whenReady; const { isAdmin } = getHostedCluster(); + return { api: this.activeApis.map(api => { if (isAdmin && !api.isNamespaced) { return api.getWatchUrl(); } + if (api.isNamespaced) { return namespaceStore.getContextNamespaces().map(namespace => api.getWatchUrl(namespace)); } + return []; }).flat() }; diff --git a/src/renderer/components/+namespaces/namespace.store.ts b/src/renderer/components/+namespaces/namespace.store.ts index e70bb34a74..1001163fc0 100644 --- a/src/renderer/components/+namespaces/namespace.store.ts +++ b/src/renderer/components/+namespaces/namespace.store.ts @@ -1,4 +1,4 @@ -import { action, comparer, IReactionDisposer, IReactionOptions, observable, reaction, when } from "mobx"; +import { action, comparer, IReactionDisposer, IReactionOptions, observable, reaction, toJS, when } from "mobx"; import { autobind, createStorage } from "../../utils"; import { KubeObjectStore, KubeObjectStoreLoadingParams } from "../../kube-object.store"; import { Namespace, namespacesApi } from "../../api/endpoints/namespaces.api"; @@ -36,7 +36,7 @@ export class NamespaceStore extends KubeObjectStore { return reaction(() => this.contextNs.toJS(), callback, { equals: comparer.identity, ...opts, - }) + }); } private async init() { @@ -59,13 +59,10 @@ export class NamespaceStore extends KubeObjectStore { equals: comparer.identity, }) ); - + // auto-load allowed namespaces disposers.push( - reaction(() => this.allowedNamespaces, () => { - this.loadAll(); - this.setContext(this.initNamespaces) - }, { + reaction(() => this.allowedNamespaces, () => this.loadAll(), { fireImmediately: true, equals: comparer.identity, }) @@ -75,7 +72,7 @@ export class NamespaceStore extends KubeObjectStore { } get allowedNamespaces(): string[] { - return getHostedCluster().allowedNamespaces; + return toJS(getHostedCluster().allowedNamespaces); } get initNamespaces() { @@ -106,10 +103,12 @@ export class NamespaceStore extends KubeObjectStore { } getContextNamespaces(): string[] { - let namespaces = this.contextNs.toJS(); + const namespaces = this.contextNs.toJS(); + if (!namespaces.length) { return [...this.allowedNamespaces]; // show all namespaces when nothing selected } + return namespaces; } @@ -143,9 +142,11 @@ export class NamespaceStore extends KubeObjectStore { if (isAdmin) { return this.api.list(); } + if (!isAllowedResource("namespaces")) { return namespaces.map(this.getDummyNamespace); } + return Promise.all(namespaces.map(name => this.api.get({ name }))); } 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 4b96ee8ffc..64ecf0f921 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 @@ -31,6 +31,7 @@ export class RoleBindingsStore extends KubeObjectStore { super.loadItems({ isAdmin, namespaces, api: clusterRoleBindingApi }), super.loadItems({ isAdmin, namespaces, api: roleBindingApi }), ]); + return items.flat(); } diff --git a/src/renderer/components/+user-management-roles/roles.store.ts b/src/renderer/components/+user-management-roles/roles.store.ts index f395dfc69c..dc136091c0 100644 --- a/src/renderer/components/+user-management-roles/roles.store.ts +++ b/src/renderer/components/+user-management-roles/roles.store.ts @@ -29,6 +29,7 @@ export class RolesStore extends KubeObjectStore { super.loadItems({ isAdmin, namespaces, api: clusterRoleApi }), super.loadItems({ isAdmin, namespaces, api: roleApi }), ]); + return items.flat(); } diff --git a/src/renderer/components/+workloads-overview/overview.tsx b/src/renderer/components/+workloads-overview/overview.tsx index 93d29df631..a77e2d0d4e 100644 --- a/src/renderer/components/+workloads-overview/overview.tsx +++ b/src/renderer/components/+workloads-overview/overview.tsx @@ -33,7 +33,6 @@ export class WorkloadsOverview extends React.Component { isAllowedResource("deployments") && deploymentStore, isAllowedResource("daemonsets") && daemonSetStore, isAllowedResource("statefulsets") && statefulSetStore, - isAllowedResource("statefulsets") && statefulSetStore, isAllowedResource("replicasets") && replicaSetStore, isAllowedResource("jobs") && jobStore, isAllowedResource("cronjobs") && cronJobStore, @@ -46,8 +45,10 @@ export class WorkloadsOverview extends React.Component { const loadStores = async () => { this.isLoading = true; + for (const store of stores) { if (this.isUnmounting) break; + try { store.reset(); await store.loadAll(); @@ -58,7 +59,7 @@ export class WorkloadsOverview extends React.Component { } } this.isLoading = false; - } + }; namespaceStore.onContextChange(loadStores, { fireImmediately: true, @@ -73,23 +74,11 @@ export class WorkloadsOverview extends React.Component { this.isUnmounting = true; } - get contents() { - return ( - <> - - {isAllowedResource("events") && } - - ); - } - render() { return (
- {this.contents} + + {isAllowedResource("events") && }
); } 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 28af7baddf..e4f7da237c 100644 --- a/src/renderer/components/item-object-list/item-list-layout.tsx +++ b/src/renderer/components/item-object-list/item-list-layout.tsx @@ -95,9 +95,8 @@ export class ItemListLayout extends React.Component { @observable isLoaded = false; @observable isUnmounting = false; - // default user settings (ui show-hide tweaks mostly) @observable userSettings: ItemListLayoutUserSettings = { - showAppliedFilters: false, + showAppliedFilters: true, }; constructor(props: ItemListLayoutProps) { @@ -140,8 +139,9 @@ export class ItemListLayout extends React.Component { this.unsubscribeStores(); // load - for (let store of stores) { + for (const store of stores) { if (this.isUnmounting) break; + try { store.reset(); await store.loadAll(); 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 9bff008aa6..d931cd2575 100644 --- a/src/renderer/components/item-object-list/page-filters.store.ts +++ b/src/renderer/components/item-object-list/page-filters.store.ts @@ -34,14 +34,14 @@ export class PageFiltersStore { namespaceStore.setContext(filteredNs); } }), - reaction(() => namespaceStore.contextNs.toJS(), contextNs => { + namespaceStore.onContextChange(namespaces => { const filteredNs = this.getValues(FilterType.NAMESPACE); - const isChanged = contextNs.length !== filteredNs.length; + const isChanged = namespaces.length !== filteredNs.length; if (isChanged) { this.filters.replace([ ...this.filters.filter(({ type }) => type !== FilterType.NAMESPACE), - ...contextNs.map(ns => ({ type: FilterType.NAMESPACE, value: ns })), + ...namespaces.map(ns => ({ type: FilterType.NAMESPACE, value: ns })), ]); } }, { diff --git a/src/renderer/kube-object.store.ts b/src/renderer/kube-object.store.ts index eb57814ce5..f188dd8625 100644 --- a/src/renderer/kube-object.store.ts +++ b/src/renderer/kube-object.store.ts @@ -80,6 +80,7 @@ export abstract class KubeObjectStore extends ItemSt protected async loadItems({ isAdmin, namespaces, api }: KubeObjectStoreLoadingParams): Promise { if (!api.isNamespaced) { if (isAdmin) return api.list({}, this.query); + return []; }