diff --git a/src/renderer/components/+apps-helm-charts/helm-charts.tsx b/src/renderer/components/+apps-helm-charts/helm-charts.tsx index cce8090818..d8cb43a98d 100644 --- a/src/renderer/components/+apps-helm-charts/helm-charts.tsx +++ b/src/renderer/components/+apps-helm-charts/helm-charts.tsx @@ -81,7 +81,6 @@ export class HelmCharts extends Component { tableId="helm_charts" className="HelmCharts" store={helmChartStore} - isClusterScoped={true} isSelectable={false} sortingCallbacks={{ [columnId.name]: (chart: HelmChart) => chart.getName(), diff --git a/src/renderer/components/+custom-resources/crd-details.tsx b/src/renderer/components/+custom-resources/crd-details.tsx index 757f389702..cdffec10d8 100644 --- a/src/renderer/components/+custom-resources/crd-details.tsx +++ b/src/renderer/components/+custom-resources/crd-details.tsx @@ -145,7 +145,7 @@ export class CRDDetails extends React.Component { <> { isConfigurable tableId="crd_resources" className="CrdResources" - isClusterScoped={!isNamespaced} store={store} sortingCallbacks={sortingCallbacks} searchFilters={[ diff --git a/src/renderer/components/+namespaces/namespaces.tsx b/src/renderer/components/+namespaces/namespaces.tsx index 2c9a778777..60ecc2f3e5 100644 --- a/src/renderer/components/+namespaces/namespaces.tsx +++ b/src/renderer/components/+namespaces/namespaces.tsx @@ -47,7 +47,6 @@ export class Namespaces extends React.Component { return ( { isConfigurable tableId="nodes" className="Nodes" - store={nodesStore} isClusterScoped + store={nodesStore} isReady={nodesStore.isLoaded} dependentStores={[podsStore]} isSelectable={false} diff --git a/src/renderer/components/+pod-security-policies/pod-security-policies.tsx b/src/renderer/components/+pod-security-policies/pod-security-policies.tsx index addae6322e..a74a5e8623 100644 --- a/src/renderer/components/+pod-security-policies/pod-security-policies.tsx +++ b/src/renderer/components/+pod-security-policies/pod-security-policies.tsx @@ -43,7 +43,6 @@ export class PodSecurityPolicies extends React.Component { isConfigurable tableId="access_pod_security_policies" className="PodSecurityPolicies" - isClusterScoped={true} store={podSecurityPoliciesStore} sortingCallbacks={{ [columnId.name]: (item: PodSecurityPolicy) => item.getName(), diff --git a/src/renderer/components/+storage-classes/storage-classes.tsx b/src/renderer/components/+storage-classes/storage-classes.tsx index 39182abb46..f052e3e8ef 100644 --- a/src/renderer/components/+storage-classes/storage-classes.tsx +++ b/src/renderer/components/+storage-classes/storage-classes.tsx @@ -49,7 +49,7 @@ export class StorageClasses extends React.Component { isConfigurable tableId="storage_classes" className="StorageClasses" - store={storageClassStore} isClusterScoped + store={storageClassStore} sortingCallbacks={{ [columnId.name]: (item: StorageClass) => item.getName(), [columnId.age]: (item: StorageClass) => item.getTimeDiffFromNow(), diff --git a/src/renderer/components/+storage-volumes/volumes.tsx b/src/renderer/components/+storage-volumes/volumes.tsx index 858d362bb2..2eb25dbdb3 100644 --- a/src/renderer/components/+storage-volumes/volumes.tsx +++ b/src/renderer/components/+storage-volumes/volumes.tsx @@ -52,7 +52,7 @@ export class PersistentVolumes extends React.Component { isConfigurable tableId="storage_volumes" className="PersistentVolumes" - store={volumesStore} isClusterScoped + store={volumesStore} sortingCallbacks={{ [columnId.name]: (item: PersistentVolume) => item.getName(), [columnId.storageClass]: (item: PersistentVolume) => item.getStorageClass(), 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 2deb06fd95..f894f90a4a 100644 --- a/src/renderer/components/item-object-list/item-list-layout.tsx +++ b/src/renderer/components/item-object-list/item-list-layout.tsx @@ -24,7 +24,7 @@ import groupBy from "lodash/groupBy"; import React, { ReactNode } from "react"; import { computed, makeObservable } from "mobx"; -import { disposeOnUnmount, observer } from "mobx-react"; +import { observer } from "mobx-react"; import { ConfirmDialog, ConfirmDialogParams } from "../confirm-dialog"; import { Table, TableCell, TableCellProps, TableHead, TableProps, TableRow, TableRowProps, TableSortCallback } from "../table"; import { boundMethod, createStorage, cssNames, IClassName, isReactNode, noop, ObservableToggleSet, prevDefault, stopPropagation } from "../../utils"; @@ -36,13 +36,14 @@ import { SearchInputUrl } from "../input"; import { Filter, FilterType, pageFilters } from "./page-filters.store"; import { PageFiltersList } from "./page-filters-list"; import { PageFiltersSelect } from "./page-filters-select"; -import { NamespaceSelectFilter } from "../+namespaces/namespace-select-filter"; import { ThemeStore } from "../../theme.store"; import { MenuActions } from "../menu/menu-actions"; import { MenuItem } from "../menu"; import { Checkbox } from "../checkbox"; import { UserStore } from "../../../common/user-store"; import { namespaceStore } from "../+namespaces/namespace.store"; +import { KubeObjectStore } from "../../kube-object.store"; +import { NamespaceSelectFilter } from "../+namespaces/namespace-select-filter"; // todo: refactor, split to small re-usable components @@ -63,7 +64,6 @@ export interface ItemListLayoutProps { store: ItemStore; dependentStores?: ItemStore[]; preloadStores?: boolean; - isClusterScoped?: boolean; hideFilters?: boolean; searchFilters?: SearchFilter[]; /** @deprecated */ @@ -137,7 +137,7 @@ export class ItemListLayout extends React.Component { } async componentDidMount() { - const { isClusterScoped, isConfigurable, tableId, preloadStores } = this.props; + const { isConfigurable, tableId, preloadStores } = this.props; if (isConfigurable && !tableId) { throw new Error("[ItemListLayout]: configurable list require props.tableId to be specified"); @@ -149,12 +149,6 @@ export class ItemListLayout extends React.Component { if (preloadStores) { this.loadStores(); - - if (!isClusterScoped) { - disposeOnUnmount(this, [ - namespaceStore.onContextChange(() => this.loadStores()) - ]); - } } } @@ -162,7 +156,6 @@ export class ItemListLayout extends React.Component { const { store, dependentStores } = this.props; const stores = Array.from(new Set([store, ...dependentStores])); - // load context namespaces by default (see also: ``) stores.forEach(store => store.loadAll(namespaceStore.contextNamespaces)); } @@ -224,7 +217,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[] = []; @@ -330,7 +323,7 @@ export class ItemListLayout extends React.Component { return null; } - return ; + return ; } renderNoItems() { @@ -355,7 +348,7 @@ export class ItemListLayout extends React.Component { ); } - return ; + return ; } renderItems() { @@ -397,20 +390,26 @@ export class ItemListLayout extends React.Component { } renderHeader() { - const { showHeader, customizeHeader, renderHeaderTitle, headerClassName, isClusterScoped } = this.props; + const { showHeader, customizeHeader, renderHeaderTitle, headerClassName } = this.props; - if (!showHeader) return null; + if (!showHeader) { + return null; + } + + const showNamespaceSelectFilter = this.props.store instanceof KubeObjectStore && this.props.store.api.isNamespaced; const title = typeof renderHeaderTitle === "function" ? renderHeaderTitle(this) : renderHeaderTitle; const placeholders: IHeaderPlaceholders = { title:
{title}
, info: this.renderInfo(), - filters: <> - {!isClusterScoped && } - - , - search: , + filters: ( + <> + {showNamespaceSelectFilter && } + + + ), + search: , }; let header = this.renderHeaderContent(placeholders); diff --git a/src/renderer/components/layout/__test__/main-layout-header.test.tsx b/src/renderer/components/layout/__test__/main-layout-header.test.tsx index 0a4dc4babd..ad50d77fe8 100644 --- a/src/renderer/components/layout/__test__/main-layout-header.test.tsx +++ b/src/renderer/components/layout/__test__/main-layout-header.test.tsx @@ -29,6 +29,19 @@ import { MainLayoutHeader } from "../main-layout-header"; import { Cluster } from "../../../../main/cluster"; import { ClusterStore } from "../../../../common/cluster-store"; import mockFs from "mock-fs"; +import { ThemeStore } from "../../../theme.store"; +import { UserStore } from "../../../../common/user-store"; + +jest.mock("electron", () => { + return { + app: { + getVersion: () => "99.99.99", + getPath: () => "tmp", + getLocale: () => "en", + setLoginItemSettings: jest.fn(), + }, + }; +}); describe("", () => { let cluster: Cluster; @@ -60,6 +73,8 @@ describe("", () => { mockFs(mockOpts); + UserStore.createInstance(); + ThemeStore.createInstance(); ClusterStore.createInstance(); cluster = new Cluster({ @@ -71,6 +86,8 @@ describe("", () => { afterEach(() => { ClusterStore.resetInstance(); + ThemeStore.resetInstance(); + UserStore.resetInstance(); mockFs.restore(); });