Skip to content

Commit 524647b

Browse files
fix(ui): jumpto interactions
- Autofocus on popover open - Autoselect number on popover open - Enter works to change page when input is focused - Esc works to close popover when input is focused
1 parent cf1af94 commit 524647b

File tree

1 file changed

+30
-10
lines changed
  • invokeai/frontend/web/src/features/gallery/components/ImageGrid

1 file changed

+30
-10
lines changed

invokeai/frontend/web/src/features/gallery/components/ImageGrid/JumpTo.tsx

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
useDisclosure,
1212
} from '@invoke-ai/ui-library';
1313
import { useGalleryPagination } from 'features/gallery/hooks/useGalleryPagination';
14-
import { useCallback, useEffect, useState } from 'react';
14+
import { useCallback, useEffect, useRef, useState } from 'react';
1515
import { useHotkeys } from 'react-hotkeys-hook';
1616
import { useTranslation } from 'react-i18next';
1717

@@ -20,6 +20,16 @@ export const JumpTo = () => {
2020
const { goToPage, currentPage, pages } = useGalleryPagination();
2121
const [newPage, setNewPage] = useState(currentPage);
2222
const { isOpen, onToggle, onClose } = useDisclosure();
23+
const ref = useRef<HTMLInputElement>(null);
24+
25+
const onOpen = useCallback(() => {
26+
setNewPage(currentPage);
27+
setTimeout(() => {
28+
const input = ref.current?.querySelector('input');
29+
input?.focus();
30+
input?.select();
31+
}, 0);
32+
}, [currentPage]);
2333

2434
const onChangeJumpTo = useCallback((v: number) => {
2535
setNewPage(v - 1);
@@ -33,30 +43,40 @@ export const JumpTo = () => {
3343
useHotkeys(
3444
'enter',
3545
() => {
36-
if (isOpen) {
37-
onClickGo();
38-
}
46+
onClickGo();
3947
},
48+
{ enabled: isOpen, enableOnFormTags: ['input'] },
4049
[isOpen, onClickGo]
4150
);
4251

52+
useHotkeys(
53+
'esc',
54+
() => {
55+
setNewPage(currentPage);
56+
onClose();
57+
},
58+
{ enabled: isOpen, enableOnFormTags: ['input'] },
59+
[isOpen, onClose]
60+
);
61+
4362
useEffect(() => {
4463
setNewPage(currentPage);
4564
}, [currentPage]);
4665

4766
return (
48-
<Popover isOpen={isOpen} onClose={onClose}>
67+
<Popover isOpen={isOpen} onClose={onClose} onOpen={onOpen}>
4968
<PopoverTrigger>
50-
<Button aria-label={t('gallery.jump')} size="xs" onClick={onToggle}>
69+
<Button aria-label={t('gallery.jump')} size="sm" onClick={onToggle} variant="outline">
5170
{t('gallery.jump')}
5271
</Button>
5372
</PopoverTrigger>
5473
<PopoverContent>
5574
<PopoverArrow />
5675
<PopoverBody>
57-
<Flex gap={2}>
76+
<Flex gap={2} alignItems="center">
5877
<FormControl>
5978
<CompositeNumberInput
79+
ref={ref}
6080
size="sm"
6181
maxW="60px"
6282
value={newPage + 1}
@@ -65,10 +85,10 @@ export const JumpTo = () => {
6585
step={1}
6686
onChange={onChangeJumpTo}
6787
/>
68-
<Button size="sm" onClick={onClickGo}>
69-
{t('gallery.go')}
70-
</Button>
7188
</FormControl>
89+
<Button h="full" size="sm" onClick={onClickGo}>
90+
{t('gallery.go')}
91+
</Button>
7292
</Flex>
7393
</PopoverBody>
7494
</PopoverContent>

0 commit comments

Comments
 (0)