UNPKG

fluid-dnd

Version:

An agnostic drag and drop library to sort all kind of lists. With current support for vue, react and svelte

170 lines (169 loc) 5.48 kB
import { NONE_TRANSLATE } from '.'; import { HORIZONTAL, VERTICAL } from '..'; import { getBefore, getBorderBeforeWidthValue, getPageValue, getRect, getScrollValue } from './GetStyles'; import { IsHTMLElement, IsMouseEvent, isTouchEvent } from './typesCheckers'; const onMouseEvents = ['onmouseup', 'onmousedown', 'onmousemove']; export const setSizeStyles = (element, translate) => { element.style.height = `${translate.height}px`; element.style.width = `${translate.width}px`; }; export const moveTranslate = (element, translation = NONE_TRANSLATE) => { if (!element || !IsHTMLElement(element)) { return; } if (translation.width == 0 && translation.height == 0) { element.style.transform = ''; } else { element.style.transform = `translate(${translation.width}px,${translation.height}px)`; } }; const assignDraggingTouchEvent = (element, onEvent, callback, touchCallback) => { element[onEvent] = (event) => { if (event.defaultPrevented) { return; } touchCallback && touchCallback(event); const dragMouseTouchEvent = convetEventToDragMouseTouchEvent(event); callback(dragMouseTouchEvent); }; }; export const assignDraggingEvent = (element, onEvent, callback, touchCallback) => { if (!callback) { return; } if (isOnMouseEvent(onEvent)) { element[onEvent] = callback; } else { assignDraggingTouchEvent(element, onEvent, callback, touchCallback); } }; const isOnMouseEvent = (x) => onMouseEvents.includes(x); const getDefaultEvent = (event) => { const { target } = event; return { clientX: 0, clientY: 0, pageX: 0, pageY: 0, screenX: 0, screenY: 0, target, offsetX: 0, offsetY: 0 }; }; const getOffsetFromEvent = (event, tempEvent) => { const getTouchEventOffset = (element, direction) => { return getOffset(tempEvent, window, direction, element); }; if (IsMouseEvent(event)) { const { offsetX, offsetY } = event; return [offsetX, offsetY]; } else { const element = event.target; return [ getTouchEventOffset(element, HORIZONTAL), getTouchEventOffset(element, VERTICAL) ]; } }; export const convetEventToDragMouseTouchEvent = (event) => { const tempEvent = getEvent(event); if (!tempEvent) { return getDefaultEvent(event); } const [offsetX, offsetY] = getOffsetFromEvent(event, tempEvent); const { clientX, clientY, pageX, pageY, screenX, screenY, target } = tempEvent; return { clientX, clientY, pageX, pageY, screenX, screenY, target, offsetX, offsetY }; }; const getEvent = (event) => { if (isTouchEvent(event)) { return event.touches[0] ?? event.changedTouches[0]; } if (IsMouseEvent(event)) { return event; } }; const getOffset = (event, window, direction, element) => { const boundingClientRect = getRect(element); return (getPageValue(direction, event) - getScrollValue(direction, window) - getBefore(direction, boundingClientRect) - getBorderBeforeWidthValue(direction, element)); }; export const setTranistion = (element, duration, timingFunction = 'ease-out', types = 'transform') => { if (IsHTMLElement(element)) { element.style.transitionDuration = `${duration}ms`; element.style.transitionTimingFunction = `${timingFunction}`; element.style.transitionProperty = `${types}`; } }; export const setEventWithInterval = (element, eventName, callback) => { if (!element || !IsHTMLElement(element)) { return; } element[eventName] = () => { callback(); }; }; const getStyles = (node) => { var style = node.querySelector('style'); if (!style) { var newStyle = document.createElement('style'); node.appendChild(newStyle); return newStyle; } return style; }; const containRule = (sheet, cssCode) => { const selectorTextRegex = /\.-?[_a-zA-Z0-9-*\s<>():]+/g; const [selectorText] = cssCode.match(selectorTextRegex) || []; for (const rule of sheet.cssRules) { const [ruleSelectorText] = rule.cssText.match(selectorTextRegex) || []; if (selectorText === ruleSelectorText) { return true; } } return false; }; export const AddCssStylesToElement = (node, cssCodes) => { cssCodes.forEach((cssCode) => { AddCssStyleToElement(node, cssCode); }); }; const AddCssStyleToElement = (node, cssCode) => { var style = getStyles(node); if (style.sheet && !containRule(style.sheet, cssCode)) { style.sheet?.insertRule(cssCode, style.sheet.cssRules.length); } }; export const setCustomFixedSize = (element, fixedProps = {}) => { for (const fixedProp of Object.keys(fixedProps)) { const fixedValue = fixedProps[fixedProp]; if (fixedValue != undefined) { setCustomProperty(element, `--${fixedProp}`, fixedValue); } } }; const setCustomProperty = (element, fixedProp, newFixedSize) => { return element && element.style.setProperty(fixedProp, newFixedSize); }; export const removeTranslateWhitoutTransition = (element) => { if (IsHTMLElement(element)) { element.style.transition = ''; element.style.transform = ''; } };