Skip to content

fix: refactor useTreeData #8125

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

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
Open

fix: refactor useTreeData #8125

wants to merge 10 commits into from

Conversation

reidbarber
Copy link
Member

@reidbarber reidbarber commented Apr 21, 2025

Testing to see if this fixes some of the issues found in testing. We'll need to add test cases for the issues we were observing.

✅ Pull Request Checklist:

  • Included link to corresponding React Spectrum GitHub Issue.
  • Added/updated unit tests and storybook for this change (for new code or code which already has tests).
  • Filled out test instructions.
  • Updated documentation (if it already exists for this component).
  • Looked at the Accessibility Practices for this feature - Aria Practices

📝 Test Instructions:

🧢 Your Project:

@rspbot
Copy link

rspbot commented Apr 21, 2025

@rspbot
Copy link

rspbot commented Apr 21, 2025

@rspbot
Copy link

rspbot commented Apr 30, 2025

@rspbot
Copy link

rspbot commented Apr 30, 2025

## API Changes

@react-stately/data

/@react-stately/data:TreeData

 TreeData <T extends {}> {
   append: (Key | null, Array<{}>) => void
+  getDescendantKeys: (TreeNode<{}>) => Array<Key>
   getItem: (Key) => TreeNode<{}> | undefined
   insert: (Key | null, number, Array<{}>) => void
   insertAfter: (Key, Array<{}>) => void
   insertBefore: (Key, Array<{}>) => void
   move: (Key, Key | null, number) => void
   moveAfter: (Key, Iterable<Key>) => void
   moveBefore: (Key, Iterable<Key>) => void
   prepend: (Key | null, Array<{}>) => void
   remove: (Array<Key>) => void
   removeSelectedItems: () => void
   selectedKeys: Set<Key>
   setSelectedKeys: (Set<Key>) => void
   update: (Key, {}) => void
 }

Copy link
Member

@devongovett devongovett left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let's discuss how we want to handle errors

Comment on lines +771 to +772
expect(result.current.items[1].key).toEqual('Eli');
expect(result.current.items[2].key).toEqual('Suzie');
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm surprised that this has Eli before Suzie, shouldn't Suzie be right after John since it was the child of John?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah never mind, I see that moveBefore will extract the child item and move it onto the same level as its parent so it specifically matters in what order the user selects the items.

I wonder is that expected? Or would a user expect that the selection order shouldn't matter? Should the parent child hierarchy be preserved?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

heh, I came here to comment the same thing. I think this ordering is unexpected. The order of the keys passed in to moveBefore shouldn't not affect the end order of items. I think we can think of the moveBefore as accepting a key and a Set, in which order doesn't matter nor is it guaranteed. It's a little incidental that we happen to pass an array, I think that was a mistake, but we can't undo it because then it wouldn't match out other hook.

Copy link
Member

@snowystinger snowystinger left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I pulled down this branch's tests and ran it against the current useTreeData. Assuming the ordering issue is resolved as it was, then these are the only changes I found necessary
https://github.com/adobe/react-spectrum/compare/useTreeData-new-tests?expand=1

Sorry if I missed some conversation you had with the rest of the team. What is in this PR? are there more tests that are missing? I don't know what I'm supposed to be looking at while reviewing.

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

Successfully merging this pull request may close these issues.

5 participants