Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Can't focus tree by using just keyboard. #328

Open
HannaHabr opened this issue Feb 1, 2024 · 4 comments
Open

Can't focus tree by using just keyboard. #328

HannaHabr opened this issue Feb 1, 2024 · 4 comments
Assignees

Comments

@HannaHabr
Copy link

Describe the bug
I can't focus tree by using just keyboard if items are removed from the tree. I am not sure if it is a defect.

To Reproduce

  1. Go to storybook https://rct.lukasbach.com/storybook/?path=/story/core-data-provider--injecting-data-from-outside
  2. Use keyboard to perform all actions
  3. Click 'Inject Item'
  4. Focus new item
  5. Press shift+tab to unfocus tree
  6. Click 'Remove item'
  7. Try to focus tree
  8. Can't focus tree

Expected behavior
Can focus tree.

Screenshots
N / A

Desktop :

  • OS: iOS
  • Browser Chrome
  • Version latest
@lukasbach
Copy link
Owner

Hello, thanks for the report. I'm not actually sure this is something I would like to handle inside of the library. The underlying issue is that RCT keeps track of which item is currently focused, and only makes the item focusable that is registered as focused. So removing an item from the outside that is currently focused, ends in the tree having the focused item state pointing to an item that is no longer rendered in.

Unfortunately, if the item is removed from the outside, there is no convenient way for RCT to know if the currently focused item was affected by that. I could make the tree search through the entire tree to find out if there is an focused item and reset that state if not, but I would rather not want to do that for performance reasons.

I think I would rather leave that up to the library consumer, to manually reset the focused item state when the tree content changes in a way that makes the focused item state enter an invalid value. The consumer could manually check if the tree mutation affected the focused item, or manually reset the focused item to the root item everytime the tree is changed from the outside, since that might affect the content in a way that invalidates the focused item anyways, if that makes sense in the respective use case.

@HannaHabr
Copy link
Author

Hello, thanks for the answer! I got your point. That is what I do on my side, if items change I reset focused item. The only issue here is that library throws undefined exception on first try to set focus, so I have a workaround. Is it possible at least to handle this undefined error to avoid try/catch?
image

@lukasbach
Copy link
Owner

Hm that is odd, I don't really understand what could be throwing there. Is there a stacktrace that points to where this is thrown? Can you also check what happens if you supply a third parameter false to the focusItem method to see if that throws as well?

I tried to expand the sample implementation in my storybook instance to achieve something similar, where it now also updates the focused item, though I can't reproduce the issue there: https://github.com/lukasbach/react-complex-tree/blob/main/packages/core/src/stories/CustomDataProvider.stories.tsx#L48

@lukasbach
Copy link
Owner

FYI I've added a new addition in v2.4.3 where it now also checks if an item exists before it focuses that item, and falls back to the first item in the tree, so theoretically this should also solve this situation by default when an focused item is programmatically removed from the tree.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants