Interface TreeGridDrop
TreeGrid drag and drop
TreeGrids support drag and drop interactions to reorder or reparent nodes within the data tree, or to add new data to the tree. As with listGrid, drag and drop capabilities may be enabled via properties such as TreeGrid.canAcceptDroppedRecords, TreeGrid.canReorderRecords and TreeGrid.canDragRecordsOut. By default, drops are only accepted on folders; set TreeGrid.canDropOnLeaves to true to allow dropping on leaf nodes as well.
Note that the behaviors described below are triggered automatically by interactive drag and drop, and can also be triggered programmatically by calling TreeGrid.transferNodes().
Custom drop behavior: To implement custom drop behavior, developers may override TreeGrid.folderDrop(). Use event.cancel() to suppress the built-in persistence behavior, then perform the desired drop action such as calling updateData() or addData() as needed.
Drag within the same tree: Default behavior when dragging node(s) to a new folder within the same tree is to reparent the dropped node(s) by modifying their parentId field value. For databound treeGrids, an update operation will be issued unless the tree has been configured to save locally.
Dragging a node to a different position within its current parent reorders it locally.
See also TreeGrid.canReparentNodes.
Drops from another component: For drops from another widget default behavior is governed by dragDataAction on the source widget plus dragRecategorize on this treeGrid. dragDataAction (set on the source) controls whether dragged records are removed from the source data set on successful drop, or left in place. dragRecategorize (set on this treeGrid) controls how the dropped records are persisted.
Dropped data may either be recategorized or added as a new node.
Drag-Recategorize: TreeGrids support recategorizing records on drop when the source component is either bound to the same DataSource, or a DataSource with a foreignKey relationship with this treeGrid's DataSource.
When both the source and target components are bound to the same DataSource - for example when a ListGrid is used to display a flat list of nodes from the selected folder of a TreeGrid - dropping a record into the TreeGrid will update the parentIdField on the dropped records to match the idField of the target folder.
When the source and target components' DataSources are related by foreignKey - for example when a ListGrid displays related records from a master tree of categories - the foreignKey field on the dropped records is updated to point to the target folder.
Whether this automatic behavior is applied depends on dragRecategorize (set on the target):
"checked"(the default): recategorize only if the source widget'sdragDataActionis "move". This is the normal case: the user is moving data to a new location, so updating the foreignKey or parentId is appropriate."always": recategorize regardless ofdragDataAction. This allows you to update the foreignKey/parentId even when the source retains a copy of the record due todragDataAction:"copy"(e.g., dragging from a template palette)."never": never recategorize. Drops always go through the generic add path below.
Add data: The default TreeGrid drop behavior when drag-recategorize is not applicable or has been disabled via dragRecategorize:"never" is to add dropped records to the tree via DataSource.addData(), with the parentId set to the target folder. addDropValues and getDropValues are applied. If DataBoundComponent.preventDuplicates is set, a duplicate check is performed (which may require a server round-trip if the cache is incomplete).
In all databound cases, queuing is used to combine the DSRequests for a multi-record drop into a single HTTP request, allowing the server to persist all changes in a single transaction.
Visual feedback
The TreeGrid.showDropIcons and ListGrid.showDropLines properties enable customization of the grid appearance during drag interactions.
By default users may drop data after the last node in the grid. The TreeGrid.canDropSiblingAfterLastNode feature allows data to be added as either a sibling of the last node, or to the tree's root node. The TreeGrid.showDropEndSpace causes a spacer to be written out after the last node during drag, so there is space available to accept the drop even if the data fills the TreeGrid viewport. To entirely disable this behavior, set ListGrid.canDropInEmptyArea to false.
For details of how data transfer from a TreeGrid to another DataBoundComponent is handled, see TreeGrid.transferDragData() and ListGrid.getDragData().
- See Also:
-
TreeGrid.willAcceptDrop()FolderDropEventcom.smartgwt.client.widgets.tree.TreeGrid#folderDropTreeGrid.transferNodes(com.smartgwt.client.widgets.tree.TreeNode[], com.smartgwt.client.widgets.tree.TreeNode, java.lang.Integer, com.smartgwt.client.widgets.Canvas, com.smartgwt.client.widgets.tree.TransferNodesCallback)TreeGrid.getCanDragRecordsOut()TreeGrid.getCanAcceptDroppedRecords()TreeGrid.getCanReorderRecords()TreeGrid.getCanDropOnLeaves()TreeGrid.getCanReparentNodes()ListGrid.getDragDataAction()TreeGrid.getShowDropEndSpace()