Skip to content

Commit dc9fbfc

Browse files
committed
fixup! fixup! adds f2 shortcut using a fakenode since it's outside the treeview struct
1 parent 57a8f76 commit dc9fbfc

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

src/frontend/apps/impress/src/features/docs/doc-tree/components/DocSubPageItem.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import {
2020
import { useLeftPanelStore } from '@/features/left-panel';
2121
import { useResponsiveStore } from '@/stores';
2222

23+
import { useKeyboardActivation } from '../hooks/useKeyboardActivation';
24+
2325
import SubPageIcon from './../assets/sub-page-logo.svg';
2426
import { DocTreeItemActions } from './DocTreeItemActions';
2527

@@ -44,6 +46,7 @@ export const DocSubPageItem = (props: TreeViewNodeProps<Doc>) => {
4446

4547
const [menuOpen, setMenuOpen] = useState(false);
4648
const isSelectedNow = treeContext?.treeData.selectedNode?.id === doc.id;
49+
const isActive = node.isFocused || menuOpen || isSelectedNow;
4750

4851
const router = useRouter();
4952
const { togglePanel } = useLeftPanelStore();
@@ -98,6 +101,15 @@ export const DocSubPageItem = (props: TreeViewNodeProps<Doc>) => {
98101
const actionsRef = useRef<HTMLDivElement>(null);
99102
const buttonOptionRef = useRef<HTMLDivElement | null>(null);
100103

104+
// Active le document avec Enter/Espace via un handler global sur la tree-view
105+
useKeyboardActivation(
106+
['Enter', ' '],
107+
isActive && !menuOpen,
108+
handleActivate,
109+
true,
110+
'.c__tree-view',
111+
);
112+
101113
const handleKeyDown = (e: React.KeyboardEvent) => {
102114
// F2: focus first action button
103115
const shouldOpenActions = !menuOpen && node.isFocused;
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { useEffect } from 'react';
2+
3+
export const useKeyboardActivation = (
4+
keys: string[],
5+
enabled: boolean,
6+
action: () => void,
7+
capture = false,
8+
selector: string,
9+
) => {
10+
useEffect(() => {
11+
if (!enabled) {
12+
return;
13+
}
14+
15+
const onKeyDown = (e: KeyboardEvent) => {
16+
const target = e.target as HTMLElement | null;
17+
if (!target) {
18+
return;
19+
}
20+
21+
// Limit activation to doc tree rows that actually contain a DocSubPageItem
22+
const row = target.closest('.c__tree-view--row');
23+
if (!row || !row.querySelector('.--docs-sub-page-item')) {
24+
return;
25+
}
26+
27+
// Do not hijack Enter/Space when focus is on emoji button or actions toolbar:
28+
// in these cases we want the native button / dropdown behavior.
29+
if (
30+
target.closest('.--docs--doc-icon') ||
31+
target.closest('.light-doc-item-actions')
32+
) {
33+
return;
34+
}
35+
36+
if (!keys.includes(e.key)) {
37+
return;
38+
}
39+
40+
e.preventDefault();
41+
action();
42+
};
43+
44+
const treeEl = document.querySelector<HTMLElement>(selector);
45+
if (!treeEl) {
46+
return;
47+
}
48+
49+
treeEl.addEventListener('keydown', onKeyDown, capture);
50+
51+
return () => {
52+
treeEl.removeEventListener('keydown', onKeyDown, capture);
53+
};
54+
}, [keys, enabled, action, capture, selector]);
55+
};

0 commit comments

Comments
 (0)