diff --git a/packages/frontend/src/components/Chain/Chain.tsx b/packages/frontend/src/components/Chain/Chain.tsx index 7e66726..d07b4d7 100644 --- a/packages/frontend/src/components/Chain/Chain.tsx +++ b/packages/frontend/src/components/Chain/Chain.tsx @@ -18,7 +18,6 @@ const MAP_HEIGHT_ADJUST = 400 / 350; const HEADER = 148; const ESCAPE_KEY = 27; -const BACKSPACE_KEY = 8; import './Chain.css'; @@ -74,12 +73,12 @@ export class Chain extends React.Component { this.calculateMapDimensions(); window.addEventListener('resize', this.calculateMapDimensions); - window.addEventListener('keyup', this.onKeyPress); + window.addEventListener('keyup', this.onKeyUp); } public componentWillUnmount() { window.removeEventListener('resize', this.calculateMapDimensions); - window.removeEventListener('keyup', this.onKeyPress); + window.removeEventListener('keyup', this.onKeyUp); } public render() { @@ -252,20 +251,18 @@ export class Chain extends React.Component { this.setState({ map: { top, left, width, height }}); } - private onKeyPress = (event: KeyboardEvent) => { + private onKeyUp = (event: KeyboardEvent) => { if (event.ctrlKey) { return; } const { filter } = this.state; const key = event.key; - const code = event.keyCode; - const escape = filter != null && code === ESCAPE_KEY; - const backspace = filter === '' && code === BACKSPACE_KEY; + const escape = filter != null && event.keyCode === ESCAPE_KEY; const singleChar = filter == null && key.length === 1; - if (escape || backspace) { + if (escape) { this.setState({ filter: null }); } else if (singleChar) { this.setState({ filter: key }); diff --git a/packages/frontend/src/components/Chain/Filter.tsx b/packages/frontend/src/components/Chain/Filter.tsx index 00cae4c..8243199 100644 --- a/packages/frontend/src/components/Chain/Filter.tsx +++ b/packages/frontend/src/components/Chain/Filter.tsx @@ -9,13 +9,19 @@ import './Filter.css'; export namespace Filter { export interface Props { value: Maybe; - onChange: (value: string) => void; + onChange: (value: Maybe) => void; } } +const ESCAPE_KEY = 27; + export class Filter extends React.Component { private filterInput: HTMLInputElement; + public componentDidMount() { + this.filterInput.focus(); + } + public shouldComponentUpdate(nextProps: Filter.Props): boolean { if (this.props.value === nextProps.value && this.props.onChange === nextProps.onChange) { return false; @@ -40,7 +46,7 @@ export class Filter extends React.Component { return (
- +
); } @@ -52,6 +58,20 @@ export class Filter extends React.Component { private onChange = () => { const { value } = this.filterInput; - this.props.onChange(value); + this.props.onChange(value === '' ? null : value); + } + + private onKeyUp = (event: React.KeyboardEvent) => { + event.stopPropagation(); + + if (event.keyCode === ESCAPE_KEY) { + this.props.onChange(null); + } + } + + private onBlur = (event: React.FocusEvent) => { + if (this.props.value == null) { + this.filterInput.focus(); + } } } diff --git a/packages/frontend/src/components/Setting.tsx b/packages/frontend/src/components/Setting.tsx index 927cd13..668c622 100644 --- a/packages/frontend/src/components/Setting.tsx +++ b/packages/frontend/src/components/Setting.tsx @@ -22,13 +22,13 @@ export class Setting extends React.Component { const className = checked ? "Setting Setting-on" : "Setting"; return ( -

+

{label} -

+
); }