You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Currently, when dragging using the keyboard, the item remains active even when focusing out of it. It leads to several issues that can't be solved at the userland.
I tried implementing a custom sensor, but the current design doesn't allow for extension (note the ts-ignore):
/** * A custom keyboard sensor cancels the drag when moving the focus out of the draggable element. */classCustomKeyboardSensorextendsKeyboardSensor{privatereadonlysensorProps: SensorProps<SensorOptions>;constructor(props: KeyboardSensorProps){super(props);this.sensorProps=props;this.handleDragCancel=this.handleDragCancel.bind(this);this.attachSensor();}privateattachSensor(): void{this.sensorProps.event.target?.addEventListener('blur',this.handleDragCancel);}privatedetachSensor(): void{this.sensorProps.event.target?.removeEventListener('blur',this.handleDragCancel);}privatehandleDragCancel(): void{// There's no other way to notify the parent class to clean up the state.// @ts-ignorethis.detach();this.detachSensor();this.sensorProps.onCancel();}}
Even ignoring the error, other issues arise. For example, using the CustomKeyboardSensor, when pressing enter to finish dragging, DND kit announces the event as a cancel operation. Even worse, after calling the onCancel callback, in response to a click outside, the item steals the focus back, so you need to click twice to move the focus away from the item.
The text was updated successfully, but these errors were encountered:
marcospassos
changed the title
Cancel drag when losing focus on the draggable item
Cancel drag when the the draggable item loses focus
Aug 4, 2022
Would love assistance on this as well. If a non keyboard user accidentally gets into a keyboard drag state, the app will feel like it is broken since they cant cancel the drag by clicking elsewhere.
One thought would be to build a combination sensor that taps into both keyboard and click events?
For what it's worth, here's something hacky I did that seems to be working fine and not running into the issues mentioned above. Note also that in my application I am using handleEnd instead of handleCancel.
exportclassCustomKeyboardSensorextendsKeyboardSensor{constructor(props: KeyboardSensorProps){super(props);consthandleEnd=(thisasany).handleEnd.bind(this);constdetach=(thisasany).detach.bind(this);props.activeNode.activatorNode.current?.addEventListener("blur",handleEnd);// hack: override the detach method to also remove the blur event(thisasany).detach=()=>{detach();props.activeNode.activatorNode.current?.removeEventListener("blur",handleEnd);};}}
Currently, when dragging using the keyboard, the item remains active even when focusing out of it. It leads to several issues that can't be solved at the userland.
I tried implementing a custom sensor, but the current design doesn't allow for extension (note the
ts-ignore
):Even ignoring the error, other issues arise. For example, using the
CustomKeyboardSensor
, when pressing enter to finish dragging, DND kit announces the event as a cancel operation. Even worse, after calling theonCancel
callback, in response to a click outside, the item steals the focus back, so you need to click twice to move the focus away from the item.The text was updated successfully, but these errors were encountered: