From c5d6caef6360577841e425959aba682d1b6fc712 Mon Sep 17 00:00:00 2001 From: Jesse Chan Date: Tue, 27 Oct 2020 02:21:55 +0800 Subject: [PATCH] client: FilesystemBrowserTextbox, TagSelect: use more precise detection of out-of-view click --- .../filesystem/FilesystemBrowserTextbox.tsx | 11 ++++--- .../general/form-elements/TagSelect.tsx | 14 ++++++--- .../javascript/ui/components/FormRowGroup.tsx | 10 ++++-- .../javascript/ui/components/FormRowItem.tsx | 31 +++++++++---------- 4 files changed, 38 insertions(+), 28 deletions(-) diff --git a/client/src/javascript/components/general/filesystem/FilesystemBrowserTextbox.tsx b/client/src/javascript/components/general/filesystem/FilesystemBrowserTextbox.tsx index 4e8fc3a9..0fd3ebfa 100644 --- a/client/src/javascript/components/general/filesystem/FilesystemBrowserTextbox.tsx +++ b/client/src/javascript/components/general/filesystem/FilesystemBrowserTextbox.tsx @@ -26,9 +26,8 @@ interface FilesystemBrowserTextboxStates { class FilesystemBrowserTextbox extends React.Component { contextMenuInstanceRef: ContextMenu | null = null; - contextMenuNodeRef: HTMLDivElement | null = null; - + formRowRef = React.createRef(); textboxRef: HTMLInputElement | null = null; constructor(props: FilesystemBrowserTextboxProps) { @@ -114,8 +113,10 @@ class FilesystemBrowserTextbox extends React.Component { - this.closeDirectoryList(); + handleDocumentClick = (e: Event) => { + if (!this.formRowRef.current?.contains((e.target as unknown) as Node)) { + this.closeDirectoryList(); + } }; handleModalDismiss = () => { @@ -167,7 +168,7 @@ class FilesystemBrowserTextbox extends React.Component + { + formRowRef = React.createRef(); menuRef: HTMLDivElement | null = null; - textboxRef: HTMLInputElement | null = null; tagMenuItems = Object.keys(TorrentFilterStore.taxonomy.tagCounts).reduce((accumulator: React.ReactNodeArray, tag) => { @@ -66,13 +66,13 @@ export default class TagSelect extends Component { + if (!this.formRowRef.current?.contains((e.target as unknown) as Node)) { + this.toggleOpenState(); + } + }; + handleItemClick = (tag: string) => { let {selectedTags} = this.state; @@ -147,7 +153,7 @@ export default class TagSelect extends Component +
= ({children}: FormRowGroupProps) => { - return
{children}
; -}; +const FormRowGroup = React.forwardRef(({children}: FormRowGroupProps, ref) => { + return ( +
+ {children} +
+ ); +}); export default FormRowGroup; diff --git a/client/src/javascript/ui/components/FormRowItem.tsx b/client/src/javascript/ui/components/FormRowItem.tsx index ac9f645e..c2e5a2ed 100644 --- a/client/src/javascript/ui/components/FormRowItem.tsx +++ b/client/src/javascript/ui/components/FormRowItem.tsx @@ -20,23 +20,22 @@ export interface FormRowItemProps { | 'seven-eighths'; } -const FormRowItem: React.FC = ({ - children, - className, - type, - width, - grow, - shrink, -}: FormRowItemProps) => { - const classes = classnames('form__row__item', className, { - [`form__row__item--${width}`]: width, - 'form__row__item--grow': grow, - 'form__row__item--shrink': shrink, - 'form__row__item--error': type === 'error', - }); +const FormRowItem = React.forwardRef( + ({children, className, type, width, grow, shrink}: FormRowItemProps, ref) => { + const classes = classnames('form__row__item', className, { + [`form__row__item--${width}`]: width, + 'form__row__item--grow': grow, + 'form__row__item--shrink': shrink, + 'form__row__item--error': type === 'error', + }); - return
{children}
; -}; + return ( +
+ {children} +
+ ); + }, +); FormRowItem.defaultProps = { grow: true,