UNPKG

react-sortable-hoc-rtl

Version:

Set of higher-order components to turn any list into a sortable, touch-friendly, animated list

181 lines (151 loc) 4.95 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.vendorPrefix = exports.events = undefined; exports.arrayMove = arrayMove; exports.omit = omit; exports.closest = closest; exports.limit = limit; exports.getElementMargin = getElementMargin; exports.provideDisplayName = provideDisplayName; exports.getPosition = getPosition; exports.isTouchEvent = isTouchEvent; exports.getEdgeOffset = getEdgeOffset; exports.getLockPixelOffset = getLockPixelOffset; var _invariant = require('invariant'); var _invariant2 = _interopRequireDefault(_invariant); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function arrayMove(arr, previousIndex, newIndex) { var array = arr.slice(0); if (newIndex >= array.length) { var k = newIndex - array.length; while (k-- + 1) { array.push(undefined); } } array.splice(newIndex, 0, array.splice(previousIndex, 1)[0]); return array; } function omit(obj) { for (var _len = arguments.length, keysToOmit = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { keysToOmit[_key - 1] = arguments[_key]; } return Object.keys(obj).reduce(function (acc, key) { if (keysToOmit.indexOf(key) === -1) acc[key] = obj[key]; return acc; }, {}); } var events = exports.events = { start: ['touchstart', 'mousedown'], move: ['touchmove', 'mousemove'], end: ['touchend', 'touchcancel', 'mouseup'] }; var vendorPrefix = exports.vendorPrefix = function () { if (typeof window === 'undefined' || typeof document === 'undefined') return ''; // server environment // fix for: // https://bugzilla.mozilla.org/show_bug.cgi?id=548397 // window.getComputedStyle() returns null inside an iframe with display: none // in this case return an array with a fake mozilla style in it. var styles = window.getComputedStyle(document.documentElement, '') || ['-moz-hidden-iframe']; var pre = (Array.prototype.slice.call(styles).join('').match(/-(moz|webkit|ms)-/) || styles.OLink === '' && ['', 'o'])[1]; switch (pre) { case 'ms': return 'ms'; default: return pre && pre.length ? pre[0].toUpperCase() + pre.substr(1) : ''; } }(); function closest(el, fn) { while (el) { if (fn(el)) return el; el = el.parentNode; } } function limit(min, max, value) { if (value < min) { return min; } if (value > max) { return max; } return value; } function getCSSPixelValue(stringValue) { if (stringValue.substr(-2) === 'px') { return parseFloat(stringValue); } return 0; } function getElementMargin(element) { var style = window.getComputedStyle(element); return { top: getCSSPixelValue(style.marginTop), right: getCSSPixelValue(style.marginRight), bottom: getCSSPixelValue(style.marginBottom), left: getCSSPixelValue(style.marginLeft) }; } function provideDisplayName(prefix, Component) { var componentName = Component.displayName || Component.name; return componentName ? prefix + '(' + componentName + ')' : prefix; } function getPosition(event) { if (event.touches && event.touches.length) { return { x: event.touches[0].pageX, y: event.touches[0].pageY }; } else if (event.changedTouches && event.changedTouches.length) { return { x: event.changedTouches[0].pageX, y: event.changedTouches[0].pageY }; } else { return { x: event.pageX, y: event.pageY }; } } function isTouchEvent(event) { return event.touches && event.touches.length || event.changedTouches && event.changedTouches.length; } function getEdgeOffset(node, parent) { var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : { top: 0, left: 0 }; // Get the actual offsetTop / offsetLeft value, no matter how deep the node is nested if (node) { var nodeOffset = { top: offset.top + node.offsetTop, left: offset.left + node.offsetLeft }; if (node.parentNode !== parent) { return getEdgeOffset(node.parentNode, parent, nodeOffset); } else { return nodeOffset; } } } function getLockPixelOffset(_ref) { var lockOffset = _ref.lockOffset, width = _ref.width, height = _ref.height; var offsetX = lockOffset; var offsetY = lockOffset; var unit = 'px'; if (typeof lockOffset === 'string') { var match = /^[+-]?\d*(?:\.\d*)?(px|%)$/.exec(lockOffset); (0, _invariant2.default)(match !== null, 'lockOffset value should be a number or a string of a ' + 'number followed by "px" or "%". Given %s', lockOffset); offsetX = offsetY = parseFloat(lockOffset); unit = match[1]; } (0, _invariant2.default)(isFinite(offsetX) && isFinite(offsetY), 'lockOffset value should be a finite. Given %s', lockOffset); if (unit === '%') { offsetX = offsetX * width / 100; offsetY = offsetY * height / 100; } return { x: offsetX, y: offsetY }; }