From 6080a9c09401385aed89a9eef2d04f4a937a1423 Mon Sep 17 00:00:00 2001 From: Joao Silva <100691367+JoaoSilvaGrafana@users.noreply.github.com> Date: Tue, 12 Mar 2024 15:00:51 +0000 Subject: [PATCH] Cascader: Don't lose input value when typing (#84274) --- .../src/components/Cascader/Cascader.tsx | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/packages/grafana-ui/src/components/Cascader/Cascader.tsx b/packages/grafana-ui/src/components/Cascader/Cascader.tsx index e995efbe341..108d285366f 100644 --- a/packages/grafana-ui/src/components/Cascader/Cascader.tsx +++ b/packages/grafana-ui/src/components/Cascader/Cascader.tsx @@ -46,6 +46,7 @@ interface CascaderState { //Array for cascade navigation rcValue: SelectableValue; activeLabel: string; + inputValue: string; } export interface CascaderOption { @@ -84,6 +85,7 @@ export class Cascader extends PureComponent { focusCascade: false, rcValue, activeLabel, + inputValue: '', }; } @@ -141,6 +143,7 @@ export class Cascader extends PureComponent { focusCascade: true, activeLabel, isSearching: false, + inputValue: activeLabel, }; this.setState(state); this.props.onSelect(selectedOptions[selectedOptions.length - 1].value); @@ -152,6 +155,7 @@ export class Cascader extends PureComponent { const activeLabel = this.props.displayAllSelectedLevels ? obj.label : obj.singleLabel || ''; const state: CascaderState = { activeLabel: activeLabel, + inputValue: activeLabel, rcValue: { value: valueArray, label: activeLabel }, isSearching: false, focusCascade: false, @@ -163,6 +167,7 @@ export class Cascader extends PureComponent { onCreateOption = (value: string) => { this.setState({ activeLabel: value, + inputValue: value, rcValue: [], isSearching: false, }); @@ -192,26 +197,26 @@ export class Cascader extends PureComponent { }; onInputKeyDown = (e: React.KeyboardEvent) => { - if (['ArrowDown', 'ArrowUp', 'Enter', 'ArrowLeft', 'ArrowRight', 'Backspace'].includes(e.key)) { + if (['ArrowDown', 'ArrowUp', 'Enter', 'ArrowLeft', 'ArrowRight'].includes(e.key)) { return; } + const { activeLabel } = this.state; this.setState({ focusCascade: false, isSearching: true, + inputValue: activeLabel, }); }; onSelectInputChange = (value: string) => { - if (value === '') { - this.setState({ - isSearching: false, - }); - } + this.setState({ + inputValue: value, + }); }; render() { const { allowCustomValue, formatCreateLabel, placeholder, width, changeOnSelect, options, disabled } = this.props; - const { focusCascade, isSearching, rcValue, activeLabel } = this.state; + const { focusCascade, isSearching, rcValue, activeLabel, inputValue } = this.state; const searchableOptions = this.getSearchableOptions(options); @@ -230,6 +235,7 @@ export class Cascader extends PureComponent { width={width} onInputChange={this.onSelectInputChange} disabled={disabled} + inputValue={inputValue} /> ) : (