UNPKG

@blare/angular2gridster

Version:

[![npm version](https://badge.fury.io/js/angular2gridster.svg)](https://badge.fury.io/js/angular2gridster)

147 lines 18.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ /** @type {?} */ export const utils = { setCssElementPosition: function ($element, position) { $element.style.left = position.x + 'px'; $element.style.top = position.y + 'px'; }, resetCSSElementPosition: function ($element) { $element.style.left = ''; $element.style.top = ''; }, setTransform: function ($element, position) { /** @type {?} */ const left = position.x; /** @type {?} */ const top = position.y; // Replace unitless items with px /** @type {?} */ const translate = `translate(${left}px,${top}px)`; $element.style['transform'] = translate; $element.style['WebkitTransform'] = translate; $element.style['MozTransform'] = translate; $element.style['msTransform'] = translate; $element.style['OTransform'] = translate; }, resetTransform: function ($element) { $element.style['transform'] = ''; $element.style['WebkitTransform'] = ''; $element.style['MozTransform'] = ''; $element.style['msTransform'] = ''; $element.style['OTransform'] = ''; }, clearSelection: () => { if (document['selection']) { document['selection'].empty(); } else if (window.getSelection) { window.getSelection().removeAllRanges(); } }, isElementFitContainer: function (element, containerEl) { /** @type {?} */ const containerRect = containerEl.getBoundingClientRect(); /** @type {?} */ const elRect = element.getBoundingClientRect(); return elRect.left > containerRect.left && elRect.right < containerRect.right && elRect.top > containerRect.top && elRect.bottom < containerRect.bottom; }, isElementIntersectContainer: function (element, containerEl) { /** @type {?} */ const containerRect = containerEl.getBoundingClientRect(); /** @type {?} */ const elRect = element.getBoundingClientRect(); /** @type {?} */ const elWidth = elRect.right - elRect.left; /** @type {?} */ const elHeight = elRect.bottom - elRect.top; return (elRect.left + (elWidth / 2)) > containerRect.left && (elRect.right - (elWidth / 2)) < containerRect.right && (elRect.top + (elHeight / 2)) > containerRect.top && (elRect.bottom - (elHeight / 2)) < containerRect.bottom; }, isElementTouchContainer: function (element, containerEl) { /** @type {?} */ const containerRect = containerEl.getBoundingClientRect(); /** @type {?} */ const elRect = element.getBoundingClientRect(); return elRect.right > containerRect.left && elRect.bottom > containerRect.top && elRect.left < containerRect.right && elRect.top < containerRect.bottom; }, isCursorAboveElement: function (event, element) { /** @type {?} */ const elRect = element.getBoundingClientRect(); return event.pageX > elRect.left && event.pageX < elRect.right && event.pageY > elRect.top && event.pageY < elRect.bottom; }, getElementOuterHeight: function ($element) { /** @type {?} */ const styleObj = window.getComputedStyle($element); // NOTE: Manually calculating height because IE's `clientHeight` isn't always // reliable. return parseFloat(styleObj.getPropertyValue('height')) + parseFloat(styleObj.getPropertyValue('padding-top')) + parseFloat(styleObj.getPropertyValue('padding-bottom')); }, getRelativeCoordinates: (element, parentElement) => { /** @type {?} */ const parentElementRect = parentElement.getBoundingClientRect(); /** @type {?} */ const elementRect = element.getBoundingClientRect(); return { top: elementRect.top - parentElementRect.top, left: elementRect.left - parentElementRect.left }; }, /** * @param {?} node * @return {?} */ getScrollableContainer(node) { /** @type {?} */ const regex = /(auto|scroll)/; /** @type {?} */ const parents = (_node, ps) => { if (_node.parentNode === null) { return ps; } return parents(_node.parentNode, ps.concat([_node])); }; /** @type {?} */ const style = (_node, prop) => { return getComputedStyle(_node, null).getPropertyValue(prop); }; /** @type {?} */ const overflow = _node => { return (style(_node, 'overflow') + style(_node, 'overflow-y') + style(_node, 'overflow-x')); }; /** @type {?} */ const scroll = _node => regex.test(overflow(_node)); /* eslint-disable consistent-return */ /** @type {?} */ const scrollParent = _node => { if (!(_node instanceof HTMLElement || _node instanceof SVGElement)) { return; } /** @type {?} */ const ps = parents(_node.parentNode, []); for (let i = 0; i < ps.length; i += 1) { if (scroll(ps[i])) { return ps[i]; } } return document.scrollingElement || document.documentElement; }; return scrollParent(node); } }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYmxhcmUvYW5ndWxhcjJncmlkc3Rlci8iLCJzb3VyY2VzIjpbImxpYi91dGlscy91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUdBLE1BQU0sT0FBTyxLQUFLLEdBQUc7SUFDakIscUJBQXFCLEVBQUUsVUFBVSxRQUFxQixFQUFFLFFBQWdDO1FBQ3BGLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3hDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQzNDLENBQUM7SUFDRCx1QkFBdUIsRUFBRSxVQUFVLFFBQXFCO1FBQ3BELFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN6QixRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUNELFlBQVksRUFBRSxVQUFVLFFBQXFCLEVBQUUsUUFBZ0M7O2NBQ3JFLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQzs7Y0FDakIsR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDOzs7Y0FHaEIsU0FBUyxHQUFHLGFBQWEsSUFBSSxNQUFNLEdBQUcsS0FBSztRQUVqRCxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUN4QyxRQUFRLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQzlDLFFBQVEsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQzNDLFFBQVEsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQzFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBQzdDLENBQUM7SUFDRCxjQUFjLEVB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IjpbIlxuaW1wb3J0IHtEcmFnZ2FibGVFdmVudH0gZnJvbSAnLi9EcmFnZ2FibGVFdmVudCc7XG5cbmV4cG9ydCBjb25zdCB1dGlscyA9IHtcbiAgICBzZXRDc3NFbGVtZW50UG9zaXRpb246IGZ1bmN0aW9uICgkZWxlbWVudDogSFRNTEVsZW1lbnQsIHBvc2l0aW9uOiB7eDogbnVtYmVyLCB5OiBudW1iZXJ9KSB7XG4gICAgICAgICRlbGVtZW50LnN0eWxlLmxlZnQgPSBwb3NpdGlvbi54ICsgJ3B4JztcbiAgICAgICAgJGVsZW1lbnQuc3R5bGUudG9wID0gcG9zaXRpb24ueSArICdweCc7XG4gICAgfSxcbiAgICByZXNldENTU0VsZW1lbnRQb3NpdGlvbjogZnVuY3Rpb24gKCRlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgICAgICAkZWxlbWVudC5zdHlsZS5sZWZ0ID0gJyc7XG4gICAgICAgICRlbGVtZW50LnN0eWxlLnRvcCA9ICcnO1xuICAgIH0sXG4gICAgc2V0VHJhbnNmb3JtOiBmdW5jdGlvbiAoJGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwb3NpdGlvbjoge3g6IG51bWJlciwgeTogbnVtYmVyfSkge1xuICAgICAgICBjb25zdCBsZWZ0ID0gcG9zaXRpb24ueDtcbiAgICAgICAgY29uc3QgdG9wID0gcG9zaXRpb24ueTtcblxuICAgICAgICAvLyBSZXBsYWNlIHVuaXRsZXNzIGl0ZW1zIHdpdGggcHhcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlID0gYHRyYW5zbGF0ZSgke2xlZnR9cHgsJHt0b3B9cHgpYDtcblxuICAgICAgICAkZWxlbWVudC5zdHlsZVsndHJhbnNmb3JtJ10gPSB0cmFuc2xhdGU7XG4gICAgICAgICRlbGVtZW50LnN0eWxlWydXZWJraXRUcmFuc2Zvcm0nXSA9IHRyYW5zbGF0ZTtcbiAgICAgICAgJGVsZW1lbnQuc3R5bGVbJ01velRyYW5zZm9ybSddID0gdHJhbnNsYXRlO1xuICAgICAgICAkZWxlbWVudC5zdHlsZVsnbXNUcmFuc2Zvcm0nXSA9IHRyYW5zbGF0ZTtcbiAgICAgICAgJGVsZW1lbnQuc3R5bGVbJ09UcmFuc2Zvcm0nXSA9IHRyYW5zbGF0ZTtcbiAgICB9LFxuICAgIHJlc2V0VHJhbnNmb3JtOiBmdW5jdGlvbiAoJGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgICRlbGVtZW50LnN0eWxlWyd0cmFuc2Zvcm0nXSA9ICcnO1xuICAgICAgICAkZWxlbWVudC5zdHlsZVsnV2Via2l0VHJhbnNmb3JtJ10gPSAnJztcbiAgICAgICAgJGVsZW1lbnQuc3R5bGVbJ01velRyYW5zZm9ybSddID0gJyc7XG4gICAgICAgICRlbGVtZW50LnN0eWxlWydtc1RyYW5zZm9ybSddID0gJyc7XG4gICAgICAgICRlbGVtZW50LnN0eWxlWydPVHJhbnNmb3JtJ10gPSAnJztcbiAgICB9LFxuICAgIGNsZWFyU2VsZWN0aW9uOiAoKSA9PiB7XG4gICAgICAgIGlmIChkb2N1bWVudFsnc2VsZWN0aW9uJ10pIHtcbiAgICAgICAgICAgIGRvY3VtZW50WydzZWxlY3Rpb24nXS5lbXB0eSgpO1xuICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaXNFbGVtZW50Rml0Q29udGFpbmVyOiBmdW5jdGlvbiAoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGVsUmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgcmV0dXJuIGVsUmVjdC5sZWZ0ID4gY29udGFpbmVyUmVjdC5sZWZ0ICYmXG4gICAgICAgICAgICBlbFJlY3QucmlnaHQgPCBjb250YWluZXJSZWN0LnJpZ2h0ICYmXG4gICAgICAgICAgICBlbFJlY3QudG9wID4gY29udGFpbmVyUmVjdC50b3AgJiZcbiAgICAgICAgICAgIGVsUmVjdC5ib3R0b20gPCBjb250YWluZXJSZWN0LmJvdHRvbTtcbiAgICB9LFxuICAgIGlzRWxlbWVudEludGVyc2VjdENvbnRhaW5lcjogZnVuY3Rpb24gKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjb250YWluZXJFbDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBlbFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGNvbnN0IGVsV2lkdGggPSBlbFJlY3QucmlnaHQgLSBlbFJlY3QubGVmdDtcbiAgICAgICAgY29uc3QgZWxIZWlnaHQgPSBlbFJlY3QuYm90dG9tIC0gZWxSZWN0LnRvcDtcblxuICAgICAgICByZXR1cm4gKGVsUmVjdC5sZWZ0ICsgKGVsV2lkdGggLyAyKSkgPiBjb250YWluZXJSZWN0LmxlZnQgJiZcbiAgICAgICAgICAgIChlbFJlY3QucmlnaHQgLSAoZWxXaWR0aCAvIDIpKSA8IGNvbnRhaW5lclJlY3QucmlnaHQgJiZcbiAgICAgICAgICAgIChlbFJlY3QudG9wICsgKGVsSGVpZ2h0IC8gMikpID4gY29udGFpbmVyUmVjdC50b3AgJiZcbiAgICAgICAgICAgIChlbFJlY3QuYm90dG9tIC0gKGVsSGVpZ2h0IC8gMikpIDwgY29udGFpbmVyUmVjdC5ib3R0b207XG4gICAgfSxcbiAgICBpc0VsZW1lbnRUb3VjaENvbnRhaW5lcjogZnVuY3Rpb24gKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjb250YWluZXJFbDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBlbFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIHJldHVybiBlbFJlY3QucmlnaHQgPiBjb250YWluZXJSZWN0LmxlZnQgJiZcbiAgICAgICAgICAgIGVsUmVjdC5ib3R0b20gPiBjb250YWluZXJSZWN0LnRvcCAmJlxuICAgICAgICAgICAgZWxSZWN0LmxlZnQgPCBjb250YWluZXJSZWN0LnJpZ2h0ICYmXG4gICAgICAgICAgICBlbFJlY3QudG9wIDwgY29udGFpbmVyUmVjdC5ib3R0b207XG4gICAgfSxcbiAgICBpc0N1cnNvckFib3ZlRWxlbWVudDogZnVuY3Rpb24gKGV2ZW50OiBEcmFnZ2FibGVFdmVudCwgZWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBlbFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIHJldHVybiBldmVudC5wYWdlWCA+IGVsUmVjdC5sZWZ0ICYmXG4gICAgICAgICAgICBldmVudC5wYWdlWCA8IGVsUmVjdC5yaWdodCAmJlxuICAgICAgICAgICAgZXZlbnQucGFnZVkgPiBlbFJlY3QudG9wICYmXG4gICAgICAgICAgICBldmVudC5wYWdlWSA8IGVsUmVjdC5ib3R0b207XG4gICAgfSxcbiAgICBnZXRFbGVtZW50T3V0ZXJIZWlnaHQ6IGZ1bmN0aW9uICgkZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3Qgc3R5bGVPYmogPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSgkZWxlbWVudCk7XG4gICAgICAgIC8vIE5PVEU6IE1hbnVhbGx5IGNhbGN1bGF0aW5nIGhlaWdodCBiZWNhdXNlIElFJ3MgYGNsaWVudEhlaWdodGAgaXNuJ3QgYWx3YXlzXG4gICAgICAgIC8vIHJlbGlhYmxlLlxuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChzdHlsZU9iai5nZXRQcm9wZXJ0eVZhbHVlKCdoZWlnaHQnKSkgK1xuICAgICAgICAgICAgcGFyc2VGbG9hdChzdHlsZU9iai5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXRvcCcpKSArXG4gICAgICAgICAgICBwYXJzZUZsb2F0KHN0eWxlT2JqLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctYm90dG9tJykpO1xuICAgIH0sXG4gICAgZ2V0UmVsYXRpdmVDb29yZGluYXRlczogKGVsZW1lbnQsIHBhcmVudEVsZW1lbnQpOiB7dG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlcn0gPT4ge1xuICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50UmVjdCA9IHBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9wOiBlbGVtZW50UmVjdC50b3AgLSBwYXJlbnRFbGVtZW50UmVjdC50b3AsXG4gICAgICAgICAgICBsZWZ0OiBlbGVtZW50UmVjdC5sZWZ0IC0gcGFyZW50RWxlbWVudFJlY3QubGVmdFxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZ2V0U2Nyb2xsYWJsZUNvbnRhaW5lcihub2RlKSB7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gLyhhdXRvfHNjcm9sbCkvO1xuICAgICAgICBjb25zdCBwYXJlbnRzID0gKF9ub2RlLCBwcykgPT4ge1xuICAgICAgICAgICAgaWYgKF9ub2RlLnBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50cyhfbm9kZS5wYXJlbnROb2RlLCBwcy5jb25jYXQoW19ub2RlXSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHN0eWxlID0gKF9ub2RlLCBwcm9wKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShfbm9kZSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShwcm9wKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBfbm9kZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHN0eWxlKF9ub2RlLCAnb3ZlcmZsb3cnKSArIHN0eWxlKF9ub2RlLCAnb3ZlcmZsb3cteScpICsgc3R5bGUoX25vZGUsICdvdmVyZmxvdy14JylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHNjcm9sbCA9IF9ub2RlID0+IHJlZ2V4LnRlc3Qob3ZlcmZsb3coX25vZGUpKTtcblxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBjb25zaXN0ZW50LXJldHVybiAqL1xuICAgICAgICBjb25zdCBzY3JvbGxQYXJlbnQgPSBfbm9kZSA9PiB7XG4gICAgICAgICAgICBpZiAoIShfbm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IF9ub2RlIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBzID0gcGFyZW50cyhfbm9kZS5wYXJlbnROb2RlLCBbXSk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsKHBzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHNjcm9sbFBhcmVudChub2RlKTtcbiAgICB9XG59O1xuIl19