UNPKG

@gravityforms/utils

Version:
79 lines (73 loc) 1.94 kB
import trigger from '../events/trigger'; /** * @module dragHorizontal * @description Make the passed element draggable if it overflows left to right. Fires `gform-utils/horizontal-drag-started` * on document when started, and `gform-utils/horizontal-drag-ended` when drag completes. * * @since 1.0.0 * * @requires trigger * * @param {HTMLElement} element The element to make draggable. * * @return {void} * * @example * import { dragHorizontal, getNodes } from "@gravityforms/utils"; * * const initializeDraggable = () => { * el.containers.forEach( ( exampleParent ) => { * const target = getNodes( * '.example', * false, * exampleParent, * true * )[ 0 ]; * dragHorizontal( target ); * } ); * }; * */ export default function dragHorizontal( element ) { const state = { isDown: false, moveEventTriggered: false, startX: 0, scrollLeft: 0, }; element.addEventListener( 'mousedown', ( e ) => { state.isDown = true; element.classList.add( 'drag-horizontal--active' ); state.startX = e.pageX - element.offsetLeft; state.scrollLeft = element.scrollLeft; } ); element.addEventListener( 'mouseleave', () => { state.isDown = false; element.classList.remove( 'drag-horizontal--active' ); } ); element.addEventListener( 'mouseup', () => { state.isDown = false; element.classList.remove( 'drag-horizontal--active' ); trigger( { event: 'gform-utils/horizontal-drag-ended', native: false, } ); state.moveEventTriggered = false; } ); element.addEventListener( 'mousemove', ( e ) => { if ( ! state.isDown ) { return; } e.preventDefault(); const x = e.pageX - element.offsetLeft; const walk = ( x - state.startX ) * 3; element.scrollLeft = state.scrollLeft - walk; if ( ! state.moveEventTriggered ) { trigger( { event: 'gform-utils/horizontal-drag-started', native: false, } ); state.moveEventTriggered = true; } } ); }