Added basic kb controls to tree
Reviewed By: lawrencelomax Differential Revision: D41838171 fbshipit-source-id: 1e89c689b2c371f870b1a3f1c7dd8c611426195a
This commit is contained in:
committed by
Facebook GitHub Bot
parent
a2ce6d5aac
commit
d61f36a0d2
@@ -37,7 +37,9 @@ export function Tree2({
|
|||||||
const expandedNodes = useValue(instance.uiState.expandedNodes);
|
const expandedNodes = useValue(instance.uiState.expandedNodes);
|
||||||
const searchTerm = useValue(instance.uiState.searchTerm);
|
const searchTerm = useValue(instance.uiState.searchTerm);
|
||||||
|
|
||||||
const items = toTreeList(nodes, rootId, expandedNodes);
|
const treeNodes = toTreeList(nodes, rootId, expandedNodes);
|
||||||
|
|
||||||
|
useKeyboardShortcuts(treeNodes, selectedNode, onSelectNode);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<HighlightProvider
|
<HighlightProvider
|
||||||
@@ -47,7 +49,7 @@ export function Tree2({
|
|||||||
onMouseLeave={() => {
|
onMouseLeave={() => {
|
||||||
instance.uiState.hoveredNodes.set([]);
|
instance.uiState.hoveredNodes.set([]);
|
||||||
}}>
|
}}>
|
||||||
{items.map((treeNode) => (
|
{treeNodes.map((treeNode) => (
|
||||||
<TreeItemContainer
|
<TreeItemContainer
|
||||||
key={treeNode.id}
|
key={treeNode.id}
|
||||||
treeNode={treeNode}
|
treeNode={treeNode}
|
||||||
@@ -217,3 +219,80 @@ function toTreeList(
|
|||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function useKeyboardShortcuts(
|
||||||
|
treeNodes: TreeNode[],
|
||||||
|
selectedNode: Id | undefined,
|
||||||
|
onSelectNode: (id?: Id) => void,
|
||||||
|
) {
|
||||||
|
const instance = usePlugin(plugin);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const listener = (event: KeyboardEvent) => {
|
||||||
|
switch (event.key) {
|
||||||
|
case 'ArrowRight': {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
instance.uiState.expandedNodes.update((draft) => {
|
||||||
|
if (selectedNode) {
|
||||||
|
draft.add(selectedNode);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'ArrowLeft': {
|
||||||
|
event.preventDefault();
|
||||||
|
instance.uiState.expandedNodes.update((draft) => {
|
||||||
|
if (selectedNode) {
|
||||||
|
draft.delete(selectedNode);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'ArrowDown': {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
const curIdx = treeNodes.findIndex(
|
||||||
|
(item) => item.id === head(instance.uiState.hoveredNodes.get()),
|
||||||
|
);
|
||||||
|
if (curIdx != -1) {
|
||||||
|
const nextIdx = curIdx + 1;
|
||||||
|
if (nextIdx < treeNodes.length) {
|
||||||
|
const nextNode = treeNodes[nextIdx];
|
||||||
|
instance.uiState.hoveredNodes.set([nextNode.id]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'ArrowUp': {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
const curIdx = treeNodes.findIndex(
|
||||||
|
(item) => item.id === head(instance.uiState.hoveredNodes.get()),
|
||||||
|
);
|
||||||
|
if (curIdx != -1) {
|
||||||
|
const prevIdx = curIdx - 1;
|
||||||
|
if (prevIdx >= 0) {
|
||||||
|
const prevNode = treeNodes[prevIdx];
|
||||||
|
instance.uiState.hoveredNodes.set([prevNode.id]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
window.addEventListener('keydown', listener);
|
||||||
|
return () => {
|
||||||
|
window.removeEventListener('keydown', listener);
|
||||||
|
};
|
||||||
|
}, [
|
||||||
|
instance.uiState.expandedNodes,
|
||||||
|
treeNodes,
|
||||||
|
onSelectNode,
|
||||||
|
selectedNode,
|
||||||
|
instance.uiState.hoveredNodes,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user