From bfbfd074f7e2cdbe1fc855b2f4ed3362e294b053 Mon Sep 17 00:00:00 2001 From: Alexander Onnikov Date: Thu, 20 Jul 2023 16:40:56 +0700 Subject: [PATCH] TSK-1600 Fix focus leaking from focus manager (#3516) Signed-off-by: Alexander Onnikov --- packages/ui/src/components/FocusHandler.svelte | 8 +++----- packages/ui/src/focus.ts | 10 +++++----- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/ui/src/components/FocusHandler.svelte b/packages/ui/src/components/FocusHandler.svelte index 12aa768ef2..e31bb1f286 100644 --- a/packages/ui/src/components/FocusHandler.svelte +++ b/packages/ui/src/components/FocusHandler.svelte @@ -6,11 +6,9 @@ function handleKey (evt: KeyboardEvent): void { if (evt.code === 'Tab' && isEnabled) { - const result = manager.next(evt.shiftKey ? -1 : 1) - if (result) { - evt.preventDefault() - evt.stopPropagation() - } + evt.preventDefault() + evt.stopPropagation() + manager.next(evt.shiftKey ? -1 : 1) } } diff --git a/packages/ui/src/focus.ts b/packages/ui/src/focus.ts index c8daf4d1cd..3aedb5fd24 100644 --- a/packages/ui/src/focus.ts +++ b/packages/ui/src/focus.ts @@ -4,7 +4,7 @@ import { getContext, onDestroy, setContext } from 'svelte' * @public */ export interface FocusManager { - next: (inc?: 1 | -1) => boolean + next: (inc?: 1 | -1) => void setFocus: (idx: number) => void setFocusPos: (order: number) => void updateFocus: (idx: number, order: number) => void @@ -43,15 +43,15 @@ class FocusManagerImpl implements FocusManager { }) } - next (inc?: 1 | -1): boolean { + next (inc?: 1 | -1): void { const current = this.elements[this.current] - if (!(current?.canBlur?.() ?? false)) { - return false + if (!(current?.canBlur?.() ?? true)) { + return } while (true) { this.current = this.current + (inc ?? 1) if (this.elements[Math.abs(this.current) % this.elements.length].focus()) { - return true + return } } }