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

[tree view] Add drag & drop support #9686

Open
oliviertassinari opened this issue Jun 16, 2020 · 16 comments · May be fixed by #12213
Open

[tree view] Add drag & drop support #9686

oliviertassinari opened this issue Jun 16, 2020 · 16 comments · May be fixed by #12213
Assignees
Labels
component: tree view TreeView, TreeItem. This is the name of the generic UI component, not the React module! new feature New feature or request plan: Pro Impact at least one Pro user

Comments

@oliviertassinari
Copy link
Member

oliviertassinari commented Jun 16, 2020

An initial issue to keep track of our progress on the drag & drop feature. Note that we won't make it MIT.

Benchmarks

@oliviertassinari oliviertassinari added the component: tree view TreeView, TreeItem. This is the name of the generic UI component, not the React module! label Jun 16, 2020
@oliviertassinari oliviertassinari added the new feature New feature or request label Jun 16, 2020
@felipezacani
Copy link

Hey @oliviertassinari thanks for the link! However, even though I may use this in the future, what I wanted now was a very simple behavior, like the native html drag n drop. I just wanted to add the draggable=true attribute to a TreeItem.

@oliviertassinari
Copy link
Member Author

@felipezacani What stops you from achieving it?

@felipezacani
Copy link

@felipezacani What stops you from achieving it?

Not really sure if there is any other way of passing the attribute to the correct native item. I tried the same as I did successfuly with the Paper component, adding a "draggable={true}" to its tag, it doesn't work and its not passed down to any native component (checked on FirefoxDev inspector). I also noticed userSelect="none" has no effect on the TreeItems.

@felipezacani
Copy link

@oliviertassinari problem was on my side, I had another component (mounted) using react-dnd. I'm still not sure why exactly, but if a react-dnd component is mounted, all other native draggable attributes are disabled (unless you use react-dnd in everything, of course). Thanks anyway!

1 similar comment
@felipezacani

This comment has been minimized.

@joziahg

This comment was marked as duplicate.

@JPNZ4
Copy link

JPNZ4 commented Nov 11, 2021

Perhaps if we could use the prop for onFocus in TreeItem, we could trade off the keyboard navigation for dragging. My use case I need the drag and don't need the keyboard navigation.

https://github.com/mui-org/material-ui/blob/3f58dd9208c5aa8daed74c74d97cd63c2c35a785/packages/mui-lab/src/TreeItem/TreeItem.js#L393-L397

The TreeItem uses the below function for onFocus, which breaks the drag with the prevent scroll. I have tried to turn this off using the TreeView prop onNodeFocus but that ends up in a loop...

https://github.com/mui-org/material-ui/blob/3f58dd9208c5aa8daed74c74d97cd63c2c35a785/packages/mui-lab/src/TreeItem/TreeItem.js#L264-L274)

@joziahg
Copy link

joziahg commented Nov 12, 2021

Here is how I'm using react-dnd with TreeView: https://codesandbox.io/s/dawn-resonance-pgefk?file=/src/Demo.js

Could be useful to some

@JPNZ4
Copy link

JPNZ4 commented Nov 14, 2021

Here is how I'm using react-dnd with TreeView: https://codesandbox.io/s/dawn-resonance-pgefk?file=/src/Demo.js

Could be useful to some

This is not working in any chromium browsers for me (95.0.4638.69). Only Firefox. Is it working for you @joziahg ?

@joziahg
Copy link

joziahg commented Nov 15, 2021

Here is how I'm using react-dnd with TreeView: https://codesandbox.io/s/dawn-resonance-pgefk?file=/src/Demo.js
Could be useful to some

This is not working in any chromium browsers for me (95.0.4638.69). Only Firefox. Is it working for you @joziahg ?

This is a known issue, you can follow it here mui/material-ui#29518

@aludin
Copy link

aludin commented Feb 18, 2022

@oliviertassinari Currently evaluating mui pro for a client project. Being able to perform dnd with the TreeView is a big part of the workflow. Tried the following:

<TreeItem
   draggable
   label="APP"
  nodeId="1"
   onDragStart={() => {
        console.log("ondragStart");
   }}
  onDrag={() => {
       console.log("onDrag");
  }}
/>

The drag events are triggered with FireFox but not with Chrome/Edge. Is there a workaround to make this work?

@mattsrobot
Copy link

Just wondering but TreeView is advertised in the MUI-X product, but I can't personally see any noticeable difference between the standard MUI and MUIX versions? Is this correct?

@dd-ssc
Copy link

dd-ssc commented Jul 20, 2022

I would like to share a few learnings from the last couple of days of working on drag'n'drop and the MUI tree view:

I have created a sandbox based on this repo to illustrate my points.

The upper tree view in the sandbox uses a DraggableTreeItem that takes care of drag'n'drop (useDrag and what not) and wraps a MUI TreeItem. As far as I can tell, this would be a fairly standard way to implement dragging a tree item out of a tree view; if I'm wrong there, I'd appreciate if someone could correct me.

The bottom tree view uses a DraggableCustomItem that is identical to DraggableTreeItem, but wraps the CustomItem also used everywhere else in the app and is attached to the actual TreeItem as its label prop.

The two drop targets to the right are identical; a few sample CustomItems were already dropped in both.

The app in the sandbox suffers from issue mui/material-ui#29518: In Firefox, drag'n'drop works for both tree views; for Chrome or Safari, I am using the stopImmediatePropagation() workaround from that issue to make the upper tree view work; I could not get the bottom one to work outside of Firefox so far.

A few things to note about the upper tree view:

  1. When dnd'ing an expanded item, the item is shown while dragging including all its children. Depending on the use case, this might make sense; IMO, it looks somewhat unusual. (related SO question)
  2. What worse IMO is that the tree item is shown while dragging - in its full (tree view) width, possibly including an icon to the left and some border to the right. There might be some way to mitigate that (CSS or so), but I don't have the required skills.
  3. My original intention was to make the tree view items look like those boxes in the drop targets (as is now done in the lower tree view) for some visual coherence. I tried real hard for quite a while to use the ContentComponent prop because (judging from its prominence in the docs) that seemed the way to go at first, but then I realized that approach requires me to do all the node expansion / collapsing / selection handling myself; I eventually gave up when it became just hopeless; related SO question.

My personal impression so far is that it might not be the best approach to try and make the TreeItem itself dnd'able.

About the bottom tree:

  1. No matter if the item is expanded or collapsed or if it has any children, only the item itself is dnd'd.
  2. The item being dragged only has the size of itself, not full (tree view) width, no icons to the left, no border to the right.
  3. Using a custom component as tree item was a piece of cake - once I had realized I can use not only a string, but an entire component as TreeItem label prop. Technically, the API docs do state node as type (not string or so) for that prop, but label as a prop name IMO really leads a naive first time user (such as myself) to believe otherwise - and the description (The tree node label.) doesn't really help, either.

The drawback: As stated, the bottom tree currently only works in Firefox. Obviously unacceptable for a production app.

Also, I'm not much of a UI/UX guy, but IMHO, as a user, I would expect to drag only the item itself around, not an item of a tree view. Look at a tree view in macOS Finder or Windows Explorer: The "production" item object thingie I am working with when using an app that I - as a user - associate with for example a file or a folder doesn't have tree view icons to the left or some border to the right.

Finally, I have a few related questions that are probably too specific for StackOverflow, so asking here:

  1. What is the point of the ContentComponent prop in the first place when I can achieve the same result, to override the content component, much simpler using the label prop ? Is it just to override the expansion/collapsing/selection behavior as in the example ? (BTW: It took me quite a while actually understand what that example actually does...)
  2. Is there any way to get this stopImmediatePropagation() workaround to work for CustomItems ? I only have a fuzzy understanding of what it does and I have no clue why it works, but as it did the trick for Chrome with TreeItems, I tried to use it for CustomItems, but it seems I don't have the TypeScript skills to understand what's wrong and how to fix it, running into all sorts of typing issues and compiler errors. Is there at least a theoretical chance to make this work (e.g. by enabling the custom item to receive a ref of the corresponding type) ?

Could anyone kindly share some thoughts and possibly lend a hand in getting drag'n'drop to work ? It's not a major problem for my use case if the focus breaks or whatnot, but getting this to work in all major browsers would be mean huge progress for my current project.

Just my 2 cents. Thank you very much for your attention.

@radu-nicoara-bayer

This comment was marked as resolved.

@mattsrobot
Copy link

What about using arborist and using MUI for the themed elements?

@CHE1RON

This comment was marked as resolved.

@oliviertassinari oliviertassinari transferred this issue from mui/material-ui Jul 15, 2023
@joserodolfofreitas joserodolfofreitas added the plan: Pro Impact at least one Pro user label Jul 17, 2023
@joserodolfofreitas joserodolfofreitas moved this from Future to Next in queue in MUI X public roadmap Sep 12, 2023
@flaviendelangle flaviendelangle self-assigned this Mar 1, 2024
@joserodolfofreitas joserodolfofreitas moved this from Next in queue to In progress now in MUI X public roadmap Mar 19, 2024
@oliviertassinari oliviertassinari changed the title [TreeView] Add drag & drop support [tree view] Add drag & drop support May 4, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
component: tree view TreeView, TreeItem. This is the name of the generic UI component, not the React module! new feature New feature or request plan: Pro Impact at least one Pro user
Projects
MUI X public roadmap
In progress now
Development

Successfully merging a pull request may close this issue.

12 participants