1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Specify id for all <Select /> to satisfy previous commit

Signed-off-by: Iku-turso <mikko.aspiala@gmail.com>
This commit is contained in:
Iku-turso 2022-03-21 16:30:53 +02:00 committed by Janne Savolainen
parent 9c024b98d3
commit ec33125373
No known key found for this signature in database
GPG Key ID: 8C6CFB2FFFE8F68A
32 changed files with 96 additions and 41 deletions

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { Kubectl } from "./kubectl"; import { Kubectl } from "./kubectl";
import directoryForKubectlBinariesInjectable from "./directory-for-kubectl-binaries/directory-for-kubectl-binaries.injectable"; import directoryForKubectlBinariesInjectable from "../../common/app-paths/directory-for-kubectl-binaries/directory-for-kubectl-binaries.injectable";
import userStoreInjectable from "../../common/user-store/user-store.injectable"; import userStoreInjectable from "../../common/user-store/user-store.injectable";
const createKubectlInjectable = getInjectable({ const createKubectlInjectable = getInjectable({

View File

@ -168,6 +168,7 @@ export class AddQuotaDialog extends React.Component<AddQuotaDialogProps> {
<SubTitle title="Namespace" /> <SubTitle title="Namespace" />
<NamespaceSelect <NamespaceSelect
id="namespace-input"
value={this.namespace} value={this.namespace}
placeholder="Namespace" placeholder="Namespace"
themeName="light" themeName="light"
@ -178,6 +179,7 @@ export class AddQuotaDialog extends React.Component<AddQuotaDialogProps> {
<SubTitle title="Values" /> <SubTitle title="Values" />
<div className="flex gaps align-center"> <div className="flex gaps align-center">
<Select <Select
id="quota-input"
className="quota-select" className="quota-select"
themeName="light" themeName="light"
placeholder="Select a quota.." placeholder="Select a quota.."

View File

@ -216,6 +216,7 @@ export class AddSecretDialog extends React.Component<AddSecretDialogProps> {
<div className="secret-namespace"> <div className="secret-namespace">
<SubTitle title="Namespace" /> <SubTitle title="Namespace" />
<NamespaceSelect <NamespaceSelect
id="secret-namespace-input"
themeName="light" themeName="light"
value={namespace} value={namespace}
onChange={({ value }) => this.namespace = value} onChange={({ value }) => this.namespace = value}
@ -224,6 +225,7 @@ export class AddSecretDialog extends React.Component<AddSecretDialogProps> {
<div className="secret-type"> <div className="secret-type">
<SubTitle title="Secret type" /> <SubTitle title="Secret type" />
<Select <Select
id="secret-input"
themeName="light" themeName="light"
options={this.types} options={this.types}
value={type} onChange={({ value }: SelectOption) => this.type = value} value={type} onChange={({ value }: SelectOption) => this.type = value}

View File

@ -101,6 +101,7 @@ export class CustomResourceDefinitions extends React.Component {
<> <>
{filters} {filters}
<Select <Select
id="crd-input"
className="group-select" className="group-select"
placeholder={placeholder} placeholder={placeholder}
options={Object.keys(crdStore.groups)} options={Object.keys(crdStore.groups)}

View File

@ -117,6 +117,7 @@ class NonInjectedHelmChartDetails extends Component<HelmChartDetailsProps & Depe
</div> </div>
<DrawerItem name="Version" className="version" onClick={stopPropagation}> <DrawerItem name="Version" className="version" onClick={stopPropagation}>
<Select <Select
id="chart-version-input"
themeName="outlined" themeName="outlined"
menuPortalTarget={null} menuPortalTarget={null}
options={chartVersions.map(chart => ({ options={chartVersions.map(chart => ({

View File

@ -75,6 +75,7 @@ class NonInjectedReleaseRollbackDialog extends React.Component<ReleaseRollbackDi
<div className="flex gaps align-center"> <div className="flex gaps align-center">
<b>Revision</b> <b>Revision</b>
<Select <Select
id="revision-input"
themeName="light" themeName="light"
value={revision} value={revision}
options={revisions} options={revisions}

View File

@ -178,7 +178,7 @@ class NonInjectedHelmReleases extends Component<Dependencies> {
filters: ( filters: (
<> <>
{filters} {filters}
<NamespaceSelectFilter /> <NamespaceSelectFilter id="namespace-select-filter" />
</> </>
), ),
searchProps: { searchProps: {

View File

@ -30,6 +30,7 @@ const NonInjectedNamespaceSelectFilter = observer(({ model }: SelectProps & Depe
onClick={model.onClick} onClick={model.onClick}
> >
<NamespaceSelect <NamespaceSelect
id="namespace-select-filter-input"
isMulti={true} isMulti={true}
menuIsOpen={model.menuIsOpen} menuIsOpen={model.menuIsOpen}
components={{ Placeholder }} components={{ Placeholder }}

View File

@ -77,6 +77,7 @@ class NonInjectedNamespaceSelect extends React.Component<NamespaceSelectProps &
return ( return (
<Select <Select
id="namespace-input"
className={cssNames("NamespaceSelect", className)} className={cssNames("NamespaceSelect", className)}
menuClass="NamespaceSelectMenu" menuClass="NamespaceSelectMenu"
formatOptionLabel={this.formatOptionLabel} formatOptionLabel={this.formatOptionLabel}

View File

@ -49,6 +49,7 @@ const NonInjectedApplication: React.FC<Dependencies> = ({ appPreferenceItems, us
<section id="appearance"> <section id="appearance">
<SubTitle title="Theme" /> <SubTitle title="Theme" />
<Select <Select
id="theme-input"
options={[ options={[
{ label: "Sync with computer", value: "system" }, { label: "Sync with computer", value: "system" },
...themeStore.themeOptions, ...themeStore.themeOptions,
@ -64,6 +65,7 @@ const NonInjectedApplication: React.FC<Dependencies> = ({ appPreferenceItems, us
<section id="extensionRegistryUrl"> <section id="extensionRegistryUrl">
<SubTitle title="Extension Install Registry" /> <SubTitle title="Extension Install Registry" />
<Select <Select
id="extension-install-registry-input"
options={Object.values(ExtensionRegistryLocation)} options={Object.values(ExtensionRegistryLocation)}
value={userStore.extensionRegistryUrl.location} value={userStore.extensionRegistryUrl.location}
onChange={action(({ value }) => { onChange={action(({ value }) => {
@ -110,6 +112,7 @@ const NonInjectedApplication: React.FC<Dependencies> = ({ appPreferenceItems, us
<section id="update-channel"> <section id="update-channel">
<SubTitle title="Update Channel" /> <SubTitle title="Update Channel" />
<Select <Select
id="update-channel-input"
options={updateChannelOptions} options={updateChannelOptions}
value={userStore.updateChannel} value={userStore.updateChannel}
onChange={({ value }) => userStore.updateChannel = value} onChange={({ value }) => userStore.updateChannel = value}
@ -122,6 +125,7 @@ const NonInjectedApplication: React.FC<Dependencies> = ({ appPreferenceItems, us
<section id="locale"> <section id="locale">
<SubTitle title="Locale Timezone" /> <SubTitle title="Locale Timezone" />
<Select <Select
id="timezone-input"
options={timezoneOptions} options={timezoneOptions}
value={userStore.localeTimezone} value={userStore.localeTimezone}
onChange={({ value }) => userStore.setLocaleTimezone(value)} onChange={({ value }) => userStore.setLocaleTimezone(value)}

View File

@ -47,6 +47,7 @@ const NonInjectedEditor = observer(({ userStore }: Dependencies) => {
<div className="flex gaps align-center"> <div className="flex gaps align-center">
<SubHeader compact>Position</SubHeader> <SubHeader compact>Position</SubHeader>
<Select <Select
id="minimap-input"
themeName="lens" themeName="lens"
options={["left", "right"]} options={["left", "right"]}
value={editorConfiguration.minimap.side} value={editorConfiguration.minimap.side}
@ -59,6 +60,7 @@ const NonInjectedEditor = observer(({ userStore }: Dependencies) => {
<section> <section>
<SubTitle title="Line numbers" /> <SubTitle title="Line numbers" />
<Select <Select
id="editor-line-numbers-input"
options={Object.entries(EditorLineNumbersStyles).map(([value, label]) => ({ options={Object.entries(EditorLineNumbersStyles).map(([value, label]) => ({
label, label,
value, value,

View File

@ -144,7 +144,8 @@ export class HelmCharts extends React.Component {
return ( return (
<div> <div>
<div className="flex gaps"> <div className="flex gaps">
<Select id="HelmRepoSelect" <Select
id="HelmRepoSelect"
placeholder="Repositories" placeholder="Repositories"
isLoading={this.loadingAvailableRepos} isLoading={this.loadingAvailableRepos}
isDisabled={this.loadingAvailableRepos} isDisabled={this.loadingAvailableRepos}

View File

@ -30,35 +30,38 @@ const NonInjectedKubectlBinaries: React.FC<Dependencies> = observer(({ defaultPa
([value, { label, platforms }]) => ({ value, label, platforms }), ([value, { label, platforms }]) => ({ value, label, platforms }),
); );
const save = () => { const save = () => {
userStore.downloadBinariesPath = downloadPath; userStore.downloadBinariesPath = downloadPath;
userStore.kubectlBinariesPath = binariesPath; userStore.kubectlBinariesPath = binariesPath;
}; };
return ( return (
<> <>
<section> <section>
<SubTitle title="Kubectl binary download"/> <SubTitle title="Kubectl binary download" />
<Switch <Switch
checked={userStore.downloadKubectlBinaries} checked={userStore.downloadKubectlBinaries}
onChange={() => userStore.downloadKubectlBinaries = !userStore.downloadKubectlBinaries} onChange={() => userStore.downloadKubectlBinaries = !userStore.downloadKubectlBinaries}
> >
Download kubectl binaries matching the Kubernetes cluster version Download kubectl binaries matching the Kubernetes cluster version
</Switch> </Switch>
</section> </section>
<section> <section>
<SubTitle title="Download mirror" /> <SubTitle title="Download mirror" />
<Select <Select
placeholder="Download mirror for kubectl" id="download-mirror-input"
options={downloadMirrorOptions} placeholder="Download mirror for kubectl"
value={userStore.downloadMirror} options={downloadMirrorOptions}
onChange={({ value }: SelectOption) => userStore.downloadMirror = value} value={userStore.downloadMirror}
disabled={!userStore.downloadKubectlBinaries} onChange={({ value }: SelectOption) => userStore.downloadMirror = value}
isOptionDisabled={({ platforms }) => !platforms.has(process.platform)} disabled={!userStore.downloadKubectlBinaries}
themeName="lens" isOptionDisabled={({ platforms }) =>
/> !platforms.has(process.platform)
</section> }
themeName="lens"
/>
</section>
<section> <section>
<SubTitle title="Directory for binaries" /> <SubTitle title="Directory for binaries" />

View File

@ -59,6 +59,7 @@ const NonInjectedTerminal = observer(({ userStore, themeStore }: Dependencies) =
<section id="terminalTheme"> <section id="terminalTheme">
<SubTitle title="Terminal theme" /> <SubTitle title="Terminal theme" />
<Select <Select
id="terminal-theme-input"
themeName="lens" themeName="lens"
options={[ options={[
{ label: "Match theme", value: "" }, { label: "Match theme", value: "" },

View File

@ -172,6 +172,7 @@ export class ClusterRoleBindingDialog extends React.Component<ClusterRoleBinding
<> <>
<SubTitle title="Cluster Role Reference" /> <SubTitle title="Cluster Role Reference" />
<Select <Select
id="cluster-role-input"
themeName="light" themeName="light"
placeholder="Select cluster role ..." placeholder="Select cluster role ..."
isDisabled={this.isEditing} isDisabled={this.isEditing}
@ -229,6 +230,7 @@ export class ClusterRoleBindingDialog extends React.Component<ClusterRoleBinding
<b>Service Accounts</b> <b>Service Accounts</b>
<Select <Select
id="service-account-input"
isMulti isMulti
themeName="light" themeName="light"
placeholder="Select service accounts ..." placeholder="Select service accounts ..."

View File

@ -176,6 +176,7 @@ export class RoleBindingDialog extends React.Component<RoleBindingDialogProps> {
<> <>
<SubTitle title="Namespace" /> <SubTitle title="Namespace" />
<NamespaceSelect <NamespaceSelect
id="dialog-namespace-input"
themeName="light" themeName="light"
isDisabled={this.isEditing} isDisabled={this.isEditing}
value={this.bindingNamespace} value={this.bindingNamespace}
@ -185,6 +186,7 @@ export class RoleBindingDialog extends React.Component<RoleBindingDialogProps> {
<SubTitle title="Role Reference" /> <SubTitle title="Role Reference" />
<Select <Select
id="role-reference-input"
themeName="light" themeName="light"
placeholder="Select role or cluster role ..." placeholder="Select role or cluster role ..."
isDisabled={this.isEditing} isDisabled={this.isEditing}
@ -226,6 +228,7 @@ export class RoleBindingDialog extends React.Component<RoleBindingDialogProps> {
<b>Service Accounts</b> <b>Service Accounts</b>
<Select <Select
id="service-account-input"
isMulti isMulti
themeName="light" themeName="light"
placeholder="Select service accounts ..." placeholder="Select service accounts ..."

View File

@ -85,6 +85,7 @@ export class AddRoleDialog extends React.Component<AddRoleDialogProps> {
/> />
<SubTitle title="Namespace" /> <SubTitle title="Namespace" />
<NamespaceSelect <NamespaceSelect
id="add-dialog-namespace-select-input"
themeName="light" themeName="light"
value={this.namespace} value={this.namespace}
onChange={({ value }) => this.namespace = value} onChange={({ value }) => this.namespace = value}

View File

@ -81,6 +81,7 @@ export class CreateServiceAccountDialog extends React.Component<CreateServiceAcc
/> />
<SubTitle title="Namespace" /> <SubTitle title="Namespace" />
<NamespaceSelect <NamespaceSelect
id="create-dialog-namespace-select-input"
themeName="light" themeName="light"
value={namespace} value={namespace}
onChange={({ value }) => this.namespace = value} onChange={({ value }) => this.namespace = value}

View File

@ -94,7 +94,7 @@ class NonInjectedWorkloadsOverview extends React.Component<Dependencies> {
<div className="header flex gaps align-center"> <div className="header flex gaps align-center">
<h5 className="box grow">Overview</h5> <h5 className="box grow">Overview</h5>
{this.renderLoadErrors()} {this.renderLoadErrors()}
<NamespaceSelectFilter /> <NamespaceSelectFilter id="overview-namespace-select-filter-input" />
</div> </div>
{this.props.detailComponents.get().map((Details, index) => ( {this.props.detailComponents.get().map((Details, index) => (

View File

@ -32,6 +32,7 @@ const NonInjectedActivateEntityCommand = observer(({ closeCommandOverlay, entiti
return ( return (
<Select <Select
id="activate-entity-input"
menuPortalTarget={null} menuPortalTarget={null}
onChange={(v) => onSelect(v.value)} onChange={(v) => onSelect(v.value)}
components={{ DropdownIndicator: null, IndicatorSeparator: null }} components={{ DropdownIndicator: null, IndicatorSeparator: null }}

View File

@ -75,6 +75,7 @@ export class ClusterMetricsSetting extends React.Component<ClusterMetricsSetting
return ( return (
<> <>
<Select <Select
id="cluster-metric-resource-type-input"
className="box grow" className="box grow"
placeholder="Select metrics to hide..." placeholder="Select metrics to hide..."
isMulti isMulti

View File

@ -116,6 +116,7 @@ export class ClusterPrometheusSetting extends React.Component<ClusterPrometheusS
? <Spinner /> ? <Spinner />
: <> : <>
<Select <Select
id="cluster-prometheus-settings-input"
value={this.provider} value={this.provider}
onChange={({ value }) => { onChange={({ value }) => {
this.provider = value; this.provider = value;

View File

@ -79,6 +79,7 @@ const NonInjectedCommandDialog = observer(({ commands, activeEntity, closeComman
return ( return (
<Select <Select
id="command-palette-search-input"
menuPortalTarget={null} menuPortalTarget={null}
onChange={v => executeAction(v.value)} onChange={v => executeAction(v.value)}
components={{ components={{

View File

@ -134,6 +134,7 @@ export class DeleteClusterDialog extends React.Component<DeleteClusterDialogProp
return ( return (
<div className="mt-4"> <div className="mt-4">
<Select <Select
id="delete-cluster-input"
options={options} options={options}
value={this.newCurrentContext} value={this.newCurrentContext}
onChange={({ value }) => this.newCurrentContext = value} onChange={({ value }) => this.newCurrentContext = value}

View File

@ -106,6 +106,7 @@ class NonInjectedCreateResource extends React.Component<CreateResourceProps & De
return ( return (
<div className="flex gaps align-center"> <div className="flex gaps align-center">
<Select <Select
id="create-resource-resource-templates-input"
autoConvertOptions={false} autoConvertOptions={false}
controlShouldRenderValue={false} // always keep initial placeholder controlShouldRenderValue={false} // always keep initial placeholder
className="TemplateSelect" className="TemplateSelect"

View File

@ -171,6 +171,7 @@ class NonInjectedInstallChart extends Component<InstallCharProps & Dependencies>
<Badge label={`${repo}/${name}`} title="Repo/Name"/> <Badge label={`${repo}/${name}`} title="Repo/Name"/>
<span>Version</span> <span>Version</span>
<Select <Select
id="chart-version-input"
className="chart-version" className="chart-version"
value={version} value={version}
options={versions} options={versions}
@ -180,6 +181,7 @@ class NonInjectedInstallChart extends Component<InstallCharProps & Dependencies>
/> />
<span>Namespace</span> <span>Namespace</span>
<NamespaceSelect <NamespaceSelect
id="install-chart-namespace-select-input"
showIcons={false} showIcons={false}
menuPlacement="top" menuPlacement="top"
themeName="outlined" themeName="outlined"

View File

@ -83,6 +83,7 @@ export const LogResourceSelector = observer(({ model }: LogResourceSelectorProps
} }
<span>Pod</span> <span>Pod</span>
<Select <Select
id="pod-selection-input"
options={podSelectOptions} options={podSelectOptions}
value={podSelectOptions.find(opt => opt.value === pod)} value={podSelectOptions.find(opt => opt.value === pod)}
formatOptionLabel={option => option.label} formatOptionLabel={option => option.label}
@ -93,6 +94,7 @@ export const LogResourceSelector = observer(({ model }: LogResourceSelectorProps
/> />
<span>Container</span> <span>Container</span>
<Select <Select
id="container-selector-input"
options={containerSelectOptions} options={containerSelectOptions}
value={{ label: selectedContainer, value: selectedContainer }} value={{ label: selectedContainer, value: selectedContainer }}
onChange={onContainerChange} onChange={onContainerChange}

View File

@ -147,6 +147,7 @@ export class NonInjectedUpgradeChart extends React.Component<UpgradeChartProps &
<span>Version</span> <Badge label={currentVersion}/> <span>Version</span> <Badge label={currentVersion}/>
<span>Upgrade version</span> <span>Upgrade version</span>
<Select <Select
id="char-version-input"
className="chart-version" className="chart-version"
menuPlacement="top" menuPlacement="top"
themeName="outlined" themeName="outlined"

View File

@ -56,6 +56,7 @@ const NonInjectedHotbarRemoveCommand = observer(({ closeCommandOverlay, hotbarSt
return ( return (
<Select <Select
id="remove-hotbar-input"
menuPortalTarget={null} menuPortalTarget={null}
onChange={(v) => onChange(v.value)} onChange={(v) => onChange(v.value)}
components={{ DropdownIndicator: null, IndicatorSeparator: null }} components={{ DropdownIndicator: null, IndicatorSeparator: null }}

View File

@ -69,6 +69,7 @@ const NonInjectedHotbarRenameCommand = observer(({ closeCommandOverlay, hotbarSt
return ( return (
<Select <Select
id="rename-hotbar-input"
menuPortalTarget={null} menuPortalTarget={null}
onChange={(v) => onSelect(v.value)} onChange={(v) => onSelect(v.value)}
components={{ DropdownIndicator: null, IndicatorSeparator: null }} components={{ DropdownIndicator: null, IndicatorSeparator: null }}

View File

@ -63,6 +63,7 @@ const NonInjectedHotbarSwitchCommand = observer(({ hotbarStore, commandOverlay }
return ( return (
<Select <Select
id="switch-to-hotbar-input"
menuPortalTarget={null} menuPortalTarget={null}
onChange={(v) => onChange(v.value)} onChange={(v) => onChange(v.value)}
components={{ DropdownIndicator: null, IndicatorSeparator: null }} components={{ DropdownIndicator: null, IndicatorSeparator: null }}

View File

@ -24,9 +24,13 @@ import clusterFrameContextInjectable from "../../cluster-frame-context/cluster-f
import kubeWatchApiInjectable from "../../kube-watch-api/kube-watch-api.injectable"; import kubeWatchApiInjectable from "../../kube-watch-api/kube-watch-api.injectable";
import type { KubeWatchSubscribeStoreOptions } from "../../kube-watch-api/kube-watch-api"; import type { KubeWatchSubscribeStoreOptions } from "../../kube-watch-api/kube-watch-api";
type ItemListLayoutPropsWithoutGetItems<K extends KubeObject> = Omit<ItemListLayoutProps<K>, "getItems">; type ItemListLayoutPropsWithoutGetItems<K extends KubeObject> = Omit<
ItemListLayoutProps<K>,
"getItems"
>;
export interface KubeObjectListLayoutProps<K extends KubeObject> extends ItemListLayoutPropsWithoutGetItems<K> { export interface KubeObjectListLayoutProps<K extends KubeObject>
extends ItemListLayoutPropsWithoutGetItems<K> {
items?: K[]; items?: K[];
getItems?: () => K[]; getItems?: () => K[];
store: KubeObjectStore<K>; store: KubeObjectStore<K>;
@ -41,7 +45,10 @@ const defaultProps: Partial<KubeObjectListLayoutProps<KubeObject>> = {
interface Dependencies { interface Dependencies {
clusterFrameContext: ClusterFrameContext; clusterFrameContext: ClusterFrameContext;
subscribeToStores: (stores: KubeObjectStore<KubeObject>[], options: KubeWatchSubscribeStoreOptions) => Disposer; subscribeToStores: (
stores: KubeObjectStore<KubeObject>[],
options: KubeWatchSubscribeStoreOptions
) => Disposer;
} }
@observer @observer
@ -63,10 +70,12 @@ class NonInjectedKubeObjectListLayout<K extends KubeObject> extends React.Compon
const { store, dependentStores = [], subscribeStores } = this.props; const { store, dependentStores = [], subscribeStores } = this.props;
const stores = Array.from(new Set([store, ...dependentStores])); const stores = Array.from(new Set([store, ...dependentStores]));
const reactions: Disposer[] = [ const reactions: Disposer[] = [
reaction(() => this.props.clusterFrameContext.contextNamespaces.slice(), () => { reaction(
// clear load errors () => this.props.clusterFrameContext.contextNamespaces.slice(),
this.loadErrors.length = 0; () => {
}), // clear load errors
this.loadErrors.length = 0;
}),
]; ];
if (subscribeStores) { if (subscribeStores) {
@ -102,8 +111,10 @@ class NonInjectedKubeObjectListLayout<K extends KubeObject> extends React.Compon
} }
render() { render() {
const { className, customizeHeader, store, items, ...layoutProps } = this.props; const { className, customizeHeader, store, items, ...layoutProps } =
const placeholderString = ResourceNames[ResourceKindMap[store.api.kind]] || store.api.kind; this.props;
const placeholderString =
ResourceNames[ResourceKindMap[store.api.kind]] || store.api.kind;
return ( return (
<ItemListLayout <ItemListLayout
@ -117,7 +128,7 @@ class NonInjectedKubeObjectListLayout<K extends KubeObject> extends React.Compon
filters: ( filters: (
<> <>
{filters} {filters}
{store.api.isNamespaced && <NamespaceSelectFilter />} {store.api.isNamespaced && <NamespaceSelectFilter id="kube-object-list-layout-namespace-select-input" />}
</> </>
), ),
searchProps: { searchProps: {
@ -141,7 +152,10 @@ class NonInjectedKubeObjectListLayout<K extends KubeObject> extends React.Compon
} }
} }
const InjectedKubeObjectListLayout = withInjectables<Dependencies, KubeObjectListLayoutProps<KubeObject>>(NonInjectedKubeObjectListLayout, { const InjectedKubeObjectListLayout = withInjectables<
Dependencies,
KubeObjectListLayoutProps<KubeObject>
>(NonInjectedKubeObjectListLayout, {
getProps: (di, props) => ({ getProps: (di, props) => ({
clusterFrameContext: di.inject(clusterFrameContextInjectable), clusterFrameContext: di.inject(clusterFrameContextInjectable),
subscribeToStores: di.inject(kubeWatchApiInjectable).subscribeStores, subscribeToStores: di.inject(kubeWatchApiInjectable).subscribeStores,