From e89a5e4f207413b76de3b2c85f5ee57fe0f56d68 Mon Sep 17 00:00:00 2001 From: Jari Kolehmainen Date: Wed, 15 Dec 2021 13:39:43 +0200 Subject: [PATCH] fix namespace selector performance issues on large clusters Signed-off-by: Jari Kolehmainen --- .../+namespaces/namespace-select-filter.tsx | 32 ++++++++++++------- .../+namespaces/namespace-select.tsx | 21 +++++++++++- 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/renderer/components/+namespaces/namespace-select-filter.tsx b/src/renderer/components/+namespaces/namespace-select-filter.tsx index 929530aa97..5fad393684 100644 --- a/src/renderer/components/+namespaces/namespace-select-filter.tsx +++ b/src/renderer/components/+namespaces/namespace-select-filter.tsx @@ -35,6 +35,10 @@ import { isMac } from "../../../common/vars"; const Placeholder = observer((props: PlaceholderProps) => { const getPlaceholder = (): React.ReactNode => { + if (props.isFocused) { + return <>Search Namespaces ...; + } + const namespaces = namespaceStore.contextNamespaces; if (namespaceStore.areAllSelectedImplicitly || !namespaces.length) { @@ -91,7 +95,11 @@ export class NamespaceSelectFilter extends React.Component { disposeOnUnmount(this, [ reaction(() => this.isMenuOpen, newVal => { if (newVal) { // rising edge of selection - this.selected.replace(namespaceStore.selectedNames); + if (namespaceStore.areAllSelectedImplicitly) { + this.selected.replace([""]); + } else { + this.selected.replace(namespaceStore.selectedNames); + } this.didToggle = false; } }), @@ -99,19 +107,21 @@ export class NamespaceSelectFilter extends React.Component { } formatOptionLabel({ value: namespace, label }: SelectOption) { - if (namespace) { - const isSelected = namespaceStore.hasContext(namespace); + let isSelected = false; - return ( -
- - {namespace} - {isSelected && } -
- ); + if (namespace) { + isSelected = !namespaceStore.areAllSelectedImplicitly && namespaceStore.hasContext(namespace); + } else { + isSelected = namespaceStore.areAllSelectedImplicitly; } - return label; + return ( +
+ + {label} + {isSelected && } +
+ ); } @action diff --git a/src/renderer/components/+namespaces/namespace-select.tsx b/src/renderer/components/+namespaces/namespace-select.tsx index 7974b25f79..d79623ec3c 100644 --- a/src/renderer/components/+namespaces/namespace-select.tsx +++ b/src/renderer/components/+namespaces/namespace-select.tsx @@ -53,7 +53,7 @@ export class NamespaceSelect extends React.Component { @computed.struct get options(): SelectOption[] { const { customizeOptions, showAllNamespacesOption, sort } = this.props; - let options: SelectOption[] = namespaceStore.items.map(ns => ({ value: ns.getName() })); + let options: SelectOption[] = namespaceStore.items.map(ns => ({ value: ns.getName(), label: ns.getName() })); if (sort) { options.sort(sort); @@ -82,6 +82,24 @@ export class NamespaceSelect extends React.Component { ); }; + filterOption = (option: SelectOption, rawInput: string) => { + if (option.value === "" || (!namespaceStore.areAllSelectedImplicitly && namespaceStore.selectedNames.has(option.value))) { + return true; + } + + if (namespaceStore.items.length > 500 && rawInput.length < 3) { + return false; + } + + if (rawInput && !option.value.includes(rawInput)) { + return false; + } + + console.log("raw", rawInput); + + return true; + }; + render() { const { className, showIcons, customizeOptions, components = {}, ...selectProps } = this.props; @@ -92,6 +110,7 @@ export class NamespaceSelect extends React.Component { formatOptionLabel={this.formatOptionLabel} options={this.options} components={components} + filterOption={this.filterOption} {...selectProps} /> );