Skip to content

feat(drag-drop): New Optional Input [cdkDragStartPredicate] #30101

@endlacer

Description

@endlacer

Feature Request

Problem Statement

Currently, the CdkDrag directive doesn't provide a way to conditionally prevent drag operations from starting based on the initial mouse/touch event. This makes it impossible to implement complex drag start conditions, such as only allowing drags from specific elements or under certain event conditions.
Add a new input [cdkDragStartPredicate] to the CdkDrag directive that accepts a predicate function to determine whether a drag operation should start.

Proposed API

@Input('cdkDragStartPredicate')
dragStartPredicate: ((event: TouchEvent | MouseEvent) => boolean) | undefined;

Example Usage

HTML:

<div cdkDrag [cdkDragStartPredicate]="myDragStartPredicate">
  Draggable content
  <input #input>
</div>

component:

myDragStartPredicate(event: TouchEvent | MouseEvent): boolean {
  const element = event.target as HTMLElement;
  // Check if the target or any of its parents is an input element
  return !element.closest('input, textarea, [contenteditable="true"]');
}

See: https://stackblitz.com/edit/wc3rt4?file=src%2Fexample%2Fcdk-drag-drop-sorting-example.css

Details

Benefits

  • More granular control over drag initialization
  • Better integration with custom UI patterns
  • Improved accessibility by allowing precise control over drag triggers
  • Reduced need for workarounds using multiple directives

Implementation Notes

  • The predicate should be called before the drag sequence begins
  • Return true to allow the drag to start, false to prevent it
  • Should work with both mouse and touch events
  • Should integrate well with existing cdkDragHandle functionality

Related Issues

This would also resolve this issue: #14117

Use Case

  • Prevent drags from starting on specific child elements
  • Implement custom handle logic without using cdkDragHandle
  • Add conditional drag start behavior based on application state
  • Implement complex touch gesture requirements

Metadata

Metadata

Assignees

No one assigned

    Labels

    P4A relatively minor issue that is not relevant to core functionsarea: cdk/drag-dropfeatureThis issue represents a new feature or feature request rather than a bug or bug fix

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions