From fb0c75655c6cb93cb08fefdab89a6f6ec467525c Mon Sep 17 00:00:00 2001 From: Vivek Kumar Bansal Date: Tue, 25 Oct 2016 16:15:20 +0530 Subject: [PATCH 001/258] Source rewrite for v2 --- src/ContextMenu.js | 119 +++++++++++++++++++++++++++++ src/ContextMenuTrigger.js | 84 +++++++++++++++++++++ src/MenuItem.js | 54 ++++++++++++++ src/SubMenu.js | 145 ++++++++++++++++++++++++++++++++++++ src/actions.js | 31 ++++++++ src/connect.js | 29 -------- src/context-menu/index.js | 31 -------- src/context-menu/wrapper.js | 98 ------------------------ src/contextmenu-layer.js | 118 ----------------------------- src/globalEventListener.js | 42 +++++++++++ src/helpers.js | 24 ++++++ src/index.js | 10 +-- src/menu-item.js | 62 --------------- src/monitor.js | 22 ------ src/redux/reducers.js | 14 ---- src/redux/store.js | 4 - src/submenu/index.js | 78 ------------------- src/submenu/wrapper.js | 79 -------------------- 18 files changed, 503 insertions(+), 541 deletions(-) create mode 100644 src/ContextMenu.js create mode 100644 src/ContextMenuTrigger.js create mode 100644 src/MenuItem.js create mode 100644 src/SubMenu.js create mode 100644 src/actions.js delete mode 100644 src/connect.js delete mode 100644 src/context-menu/index.js delete mode 100644 src/context-menu/wrapper.js delete mode 100644 src/contextmenu-layer.js create mode 100644 src/globalEventListener.js create mode 100644 src/helpers.js delete mode 100644 src/menu-item.js delete mode 100644 src/monitor.js delete mode 100644 src/redux/reducers.js delete mode 100644 src/redux/store.js delete mode 100644 src/submenu/index.js delete mode 100644 src/submenu/wrapper.js diff --git a/src/ContextMenu.js b/src/ContextMenu.js new file mode 100644 index 00000000..c28b6af0 --- /dev/null +++ b/src/ContextMenu.js @@ -0,0 +1,119 @@ +import React, { Component } from 'react'; + +import listener from './globalEventListener'; +import { hideMenu } from './actions'; +import { cssClasses, callIfExists } from './helpers'; + +export default class ContextMenu extends Component { + constructor(props) { + super(props); + + this.state = { + x: 0, + y: 0, + isVisible: false + }; + } + + componentDidMount() { + this.listenId = listener.register(this.handleShow, this.handleHide); + } + + componentDidUpdate() { + if (this.state.isVisible) { + const wrapper = window.requestAnimationFrame || setTimeout; + + wrapper(() => { + const {x, y} = this.state; + + const {top, left} = this.getMenuPosition(x, y); + + wrapper(() => { + this.menu.style.top = `${top}px`; + this.menu.style.left = `${left}px`; + this.menu.classList.add(cssClasses.menuVisible); + }); + }); + } else { + this.menu.classList.remove(cssClasses.menuVisible); + } + } + + componentWillUnmount() { + if (this.listenId) { + listener.unregister(this.listenId); + } + } + + handleShow = (e) => { + if (e.detail.id !== this.props.id) return; + + const { x, y } = e.detail.position; + + this.setState({isVisible: true, x, y}); + document.addEventListener('click', this.handleOutsideClick); + document.addEventListener('scroll', this.handleHide); + document.addEventListener('contextmenu', this.handleHide); + window.addEventListener('resize', this.handleHide); + callIfExists(this.props.onShow, e); + } + + handleHide = (e) => { + document.removeEventListener('click', this.handleOutsideClick); + document.removeEventListener('scroll', this.handleHide); + document.removeEventListener('contextmenu', this.handleHide); + window.removeEventListener('resize', this.handleHide); + + this.setState({isVisible: false}); + callIfExists(this.props.onHide, e); + } + + handleOutsideClick = (e) => { + if (!this.menu.contains(e.target)) hideMenu(); + } + + getMenuPosition = (x, y) => { + const {scrollTop: scrollX, scrollLeft: scrollY} = document.documentElement; + const { innerWidth, innerHeight } = window; + const rect = this.menu.getBoundingClientRect(); + const menuStyles = { + top: y + scrollY, + left: x + scrollX + }; + + if (y + rect.height > innerHeight) { + menuStyles.top -= rect.height; + } + + if (x + rect.width > innerWidth) { + menuStyles.left -= rect.width; + } + + if (menuStyles.top < 0) { + menuStyles.top = (rect.height < innerHeight) ? (innerHeight - rect.height) / 2 : 0; + } + + if (menuStyles.left < 0) { + menuStyles.left = (rect.width < innerWidth) ? (innerWidth - rect.width) / 2 : 0; + } + + return menuStyles; + } + + menuRef = (c) => { + this.menu = c; + } + + render() { + const { children } = this.props; + const { top, left } = this.state; + const style = {position: 'fixed', top, left}; + + return ( + + ); + } +} diff --git a/src/ContextMenuTrigger.js b/src/ContextMenuTrigger.js new file mode 100644 index 00000000..af0b0da8 --- /dev/null +++ b/src/ContextMenuTrigger.js @@ -0,0 +1,84 @@ +import React, { Component } from 'react'; +import cx from 'classnames'; + +import { showMenu, hideMenu } from './actions'; +import { callIfExists, cssClasses } from './helpers'; + +export default class ContextMenuTrigger extends Component { + static defaultProps = { + renderTag: 'div', + attributes: {} + }; + + mouseDown = false; + + handleMouseDown = (event) => { + if (this.props.holdToDisplay >= 0 && event.button === 0) { + event.persist(); + + this.mouseDown = true; + setTimeout(() => { + if (this.mouseDown) this.handleContextClick(event); + }, this.props.holdToDisplay); + } + } + + handleMouseUp = (event) => { + if (event.button === 0) { + this.mouseDown = false; + } + } + + handleTouchstart = (event) => { + if (this.props.holdToDisplay >= 0) { + event.persist(); + + this.mouseDown = true; + setTimeout(() => { + if (this.mouseDown) this.handleContextClick(event); + }, this.props.holdToDisplay); + } + } + + handleTouchEnd = (event) => { + event.preventDefault(); + this.mouseDown = false; + } + + handleContextClick = (event) => { + event.preventDefault(); + event.stopPropagation(); + + const x = event.clientX || (event.touches && event.touches[0].pageX); + const y = event.clientY || (event.touches && event.touches[0].pageY); + + hideMenu(); + + showMenu({ + position: {x, y}, + target: this.elem, + id: this.props.id, + data: callIfExists(this.props.collect, this.props) + }); + } + + elemRef = (c) => { + this.elem = c; + } + + render() { + const { renderTag, attributes, children } = this.props; + const newAttrs = Object.assign({}, attributes, { + className: cx(cssClasses.menuWrapper, attributes.className), + onContextMenu: this.handleContextClick, + onMouseDown: this.handleMouseDown, + onMouseUp: this.handleMouseUp, + onTouchStart: this.handleTouchstart, + onTouchEnd: this.handleTouchEnd, + onMouseOut: this.handleMouseUp, + ref: this.elemRef + }); + + return React.createElement(renderTag, newAttrs, children); + } +} diff --git a/src/MenuItem.js b/src/MenuItem.js new file mode 100644 index 00000000..65c7c848 --- /dev/null +++ b/src/MenuItem.js @@ -0,0 +1,54 @@ +import React, { PropTypes, Component} from 'react'; +import cx from 'classnames'; + +import { hideMenu } from './actions'; +import { callIfExists, cssClasses, store } from './helpers'; + +export default class MenuItem extends Component { + static propTypes = { + onClick: PropTypes.func.isRequired, + data: PropTypes.object, + disabled: PropTypes.bool, + preventClose: PropTypes.bool + }; + + static defaultProps = { + disabled: false, + data: {}, + attributes: {} + }; + + handleClick = (event) => { + event.preventDefault(); + + if (this.props.disabled) return; + + callIfExists( + this.props.onClick, + event, + Object.assign({}, this.props.data, store.data), + store.target + ); + + if (this.props.preventClose) return; + + hideMenu(); + } + + render() { + const { disabled, children, attributes } = this.props; + const menuItemClassNames = cx(cssClasses.menuItem, attributes && attributes.className); + + const linkClasses = cx(cssClasses.menuLink, { + [cssClasses.menuLinkDisabled]: disabled + }); + + return ( +
+ + {children} + +
+ ); + } +} diff --git a/src/SubMenu.js b/src/SubMenu.js new file mode 100644 index 00000000..e58a4714 --- /dev/null +++ b/src/SubMenu.js @@ -0,0 +1,145 @@ +import React, { Component } from 'react'; +import cx from 'classnames'; + +import { cssClasses, hasOwnProp } from './helpers'; + +export default class SubMenu extends Component { + static defaultProps = { + hoverDelay: 500 + }; + + constructor(props) { + super(props); + + this.state = { + visible: false + }; + } + + shouldComponentUpdate(nextProps, nextState) { + return this.state.isVisible !== nextState.visible; + } + + componentDidUpdate() { + if (this.state.visible) { + const wrapper = window.requestAnimationFrame || setTimeout; + + wrapper(() => { + const styles = this.getMenuPosition(); + + this.subMenu.style.removeProperty('top'); + this.subMenu.style.removeProperty('bottom'); + this.subMenu.style.removeProperty('left'); + this.subMenu.style.removeProperty('right'); + + if (hasOwnProp(styles, 'top')) this.subMenu.style.top = styles.top; + if (hasOwnProp(styles, 'left')) this.subMenu.style.left = styles.left; + if (hasOwnProp(styles, 'bottom')) this.subMenu.style.bottom = styles.bottom; + if (hasOwnProp(styles, 'right')) this.subMenu.style.right = styles.right; + this.subMenu.classList.add(cssClasses.menuVisible); + }); + } else { + this.subMenu.classList.remove(cssClasses.menuVisible); + this.subMenu.style.removeProperty('bottom'); + this.subMenu.style.removeProperty('right'); + this.subMenu.style.top = 0; + this.subMenu.style.left = '100%'; + } + } + + componentWillUnmount() { + if (this.opentimer) clearTimeout(this.opentimer); + + if (this.closetimer) clearTimeout(this.closetimer); + } + + handleClick = (e) => { + e.preventDefault(); + } + + handleMouseEnter = () => { + if (this.closetimer) clearTimeout(this.closetimer); + + if (this.props.disabled || this.state.visible) return; + + this.opentimer = setTimeout(() => this.setState({visible: true}), this.props.hoverDelay); + } + + handleMouseLeave = () => { + if (this.opentimer) clearTimeout(this.opentimer); + + if (!this.state.visible) return; + + this.closetimer = setTimeout(() => this.setState({visible: false}), this.props.hoverDelay); + } + + getMenuPosition = () => { + const { innerWidth, innerHeight } = window; + const rect = this.subMenu.getBoundingClientRect(); + const position = {}; + + if (rect.bottom > innerHeight) { + position.bottom = 0; + } else { + position.top = 0; + } + + if (rect.right < innerWidth) { + position.left = '100%'; + } else { + position.right = '100%'; + } + + return position; + } + + menuRef = (c) => { + this.menu = c; + } + + subMenuRef = (c) => { + this.subMenu = c; + } + + render() { + const { children, disabled, title } = this.props; + const { visible } = this.state; + const menuItemProps = { + ref: this.menuRef, + onMouseEnter: this.handleMouseEnter, + onMouseLeave: this.handleMouseLeave, + className: cx(cssClasses.menuItem, cssClasses.subMenu), + style: { + position: 'relative' + } + }; + const menuLinkProps = { + href: '#', + className: cx(cssClasses.menuLink, { + [cssClasses.menuLinkDisabled]: disabled, + [cssClasses.menuLinkActive]: visible + }), + onClick: this.handleClick + }; + const subMenuProps = { + ref: this.subMenuRef, + style: { + position: 'absolute', + top: 0, + left: '100%' + }, + className: cssClasses.menu + }; + + return ( + + ); + } +} diff --git a/src/actions.js b/src/actions.js new file mode 100644 index 00000000..9bbceaa9 --- /dev/null +++ b/src/actions.js @@ -0,0 +1,31 @@ +import { store } from './helpers'; + +export const MENU_SHOW = 'REACT_CONTEXTMENU_SHOW'; +export const MENU_HIDE = 'REACT_CONTEXTMENU_HIDE'; + + +export function dispatchGlobalEvent(eventName, opts, target = window) { + // Compatibale with IE + // @see http://stackoverflow.com/questions/26596123/internet-explorer-9-10-11-event-constructor-doesnt-work + let event; + + if (typeof window.CustomEvent === 'function') { + event = new window.CustomEvent(eventName, { detail: opts }); + } else { + event = document.createEvent('Event'); + event.initEvent(eventName, false, true, opts); + } + + if (target) { + target.dispatchEvent(event); + Object.assign(store, opts); + } +} + +export function showMenu(opts = {}, target) { + dispatchGlobalEvent(MENU_SHOW, Object.assign({}, opts, {type: MENU_SHOW}), target); +} + +export function hideMenu(opts = {}, target) { + dispatchGlobalEvent(MENU_HIDE, Object.assign({}, opts, {type: MENU_HIDE}), target); +} diff --git a/src/connect.js b/src/connect.js deleted file mode 100644 index 72441e1e..00000000 --- a/src/connect.js +++ /dev/null @@ -1,29 +0,0 @@ -import React from "react"; -import store from "./redux/store"; - -export default function(Component) { - const displayName = Component.displayName - || Component.name - || "Component"; - - return React.createClass({ - displayName: `ContextMenuConnector(${displayName})`, - getInitialState() { - return { - item: store.getState().currentItem - }; - }, - componentDidMount() { - this.unsubscribe = store.subscribe(this.handleUpdate); - }, - componentWillUnmount() { - this.unsubscribe(); - }, - handleUpdate() { - this.setState(this.getInitialState()); - }, - render() { - return ; - } - }); -} diff --git a/src/context-menu/index.js b/src/context-menu/index.js deleted file mode 100644 index 09a852b7..00000000 --- a/src/context-menu/index.js +++ /dev/null @@ -1,31 +0,0 @@ -import React from "react"; -import store from "../redux/store"; -import ContextWrapper from "./wrapper"; - -let { PropTypes } = React; - -const ContextMenu = React.createClass({ - displayName: "ContextMenu", - propTypes: { - identifier: PropTypes.string.isRequired - }, - getInitialState() { - return store.getState(); - }, - componentDidMount() { - this.unsubscribe = store.subscribe(this.handleUpdate); - }, - componentWillUnmount() { - if (this.unsubscribe) this.unsubscribe(); - }, - handleUpdate() { - this.setState(this.getInitialState()); - }, - render() { - return ( - - ); - } -}); - -export default ContextMenu; diff --git a/src/context-menu/wrapper.js b/src/context-menu/wrapper.js deleted file mode 100644 index dd1ac653..00000000 --- a/src/context-menu/wrapper.js +++ /dev/null @@ -1,98 +0,0 @@ -import React from "react"; -import monitor from "../monitor"; - -import Modal from "react-overlays/lib/Modal"; - -const modalStyle = { - position: "fixed", - zIndex: 1040, - top: 0, - bottom: 0, - left: 0, - right: 0 - }, - backdropStyle = { - ...modalStyle, - zIndex: "auto", - backgroundColor: "transparent" - }, - menuStyles = { - position: "fixed", - zIndex: "auto" - }; - -let ContextMenuWrapper = React.createClass({ - displayName: "ContextMenuWrapper", - getInitialState() { - return { - left: 0, - top: 0 - }; - }, - componentWillReceiveProps(nextProps) { - if (nextProps.isVisible === nextProps.identifier) { - const wrapper = window.requestAnimationFrame || setTimeout; - - wrapper(() => { - this.setState(this.getMenuPosition(nextProps.x, nextProps.y)); - this.menu.parentNode.addEventListener("contextmenu", this.hideMenu); - }); - } - }, - shouldComponentUpdate(nextProps) { - return this.props.isVisible !== nextProps.visible; - }, - hideMenu(e) { - e.preventDefault(); - this.menu.parentNode.removeEventListener("contextmenu", this.hideMenu); - monitor.hideMenu(); - }, - getMenuPosition(x, y) { - let scrollX = document.documentElement.scrollTop, - scrollY = document.documentElement.scrollLeft, - { innerWidth, innerHeight } = window, - rect = this.menu.getBoundingClientRect(), - menuStyles = { - top: y + scrollY, - left: x + scrollX - }; - - if (y + rect.height > innerHeight) { - menuStyles.top -= rect.height; - } - - if (x + rect.width > innerWidth) { - menuStyles.left -= rect.width; - } - - if (menuStyles.top < 0) { - menuStyles.top = (rect.height < innerHeight) ? (innerHeight - rect.height) / 2 : 0; - } - - if (menuStyles.left < 0) { - menuStyles.left = (rect.width < innerWidth) ? (innerWidth - rect.width) / 2 : 0; - } - - return menuStyles; - }, - render() { - let { isVisible, identifier, children } = this.props; - - const style = { - ...menuStyles, - ...this.state - }; - - return ( - monitor.hideMenu()}> - - - ); - } -}); - -export default ContextMenuWrapper; diff --git a/src/contextmenu-layer.js b/src/contextmenu-layer.js deleted file mode 100644 index b708361d..00000000 --- a/src/contextmenu-layer.js +++ /dev/null @@ -1,118 +0,0 @@ -import React from "react"; -import invariant from "invariant"; -import _isObject from "lodash.isobject"; - -import store from "./redux/store"; - -export default function(identifier, configure) { - return function(Component) { - const displayName = Component.displayName - || Component.name - || "Component"; - - invariant( - identifier && (typeof identifier === "string" - || typeof identifier === "symbol" - || typeof identifier === "function"), - "Expected identifier to be string, symbol or function. See %s", - displayName - ); - - if (configure) { - invariant( - typeof configure === "function", - "Expected configure to be a function. See %s", - displayName - ); - } - - - return React.createClass({ - displayName: `${displayName}ContextMenuLayer`, - getDefaultProps() { - return { - renderTag: "div", - attributes: {} - }; - }, - mouseDown: false, - handleMouseDown(event) { - if (this.props.holdToDisplay >= 0 && event.button === 0) { - event.persist(); - - this.mouseDown = true; - setTimeout(() => { - if (this.mouseDown) this.handleContextClick(event); - }, this.props.holdToDisplay); - } - }, - handleTouchstart(event) { - if (this.props.holdToDisplay >= 0) { - event.persist(); - - this.mouseDown = true; - setTimeout(() => { - if (this.mouseDown) this.handleContextClick(event); - }, this.props.holdToDisplay); - } - }, - handleTouchEnd(event) { - event.preventDefault(); - this.mouseDown = false; - }, - handleMouseUp(event) { - if (event.button === 0) { - this.mouseDown = false; - } - }, - handleContextClick(event) { - let currentItem = typeof configure === "function" - ? configure(this.props) - : {}; - - invariant( - _isObject(currentItem), - "Expected configure to return an object. See %s", - displayName - ); - - event.preventDefault(); - - if (this.props.stopPropagation) { - event.stopPropagation(); - } - - const xPos = event.clientX || (event.touches && event.touches[0].pageX), - yPos = event.clientY || (event.touches && event.touches[0].pageY); - - store.dispatch({ - type: "SET_PARAMS", - data: { - x: xPos, - y: yPos, - currentItem, - isVisible: typeof identifier === "function" ? identifier(this.props) : identifier - } - }); - }, - render() { - let { attributes: {className = "", ...attributes}, renderTag, ...props } = this.props; - - attributes.className = `react-context-menu-wrapper ${className}`; - attributes.onContextMenu = this.handleContextClick; - attributes.onMouseDown = this.handleMouseDown; - attributes.onMouseUp = this.handleMouseUp; - attributes.onTouchStart = this.handleTouchstart; - attributes.onTouchEnd = this.handleTouchEnd; - attributes.onMouseOut = this.handleMouseUp; - attributes.ref = (c) => (this.target = c); - - return React.createElement( - renderTag, - attributes, - React.createElement(Component, props) - ); - } - }); - }; -} diff --git a/src/globalEventListener.js b/src/globalEventListener.js new file mode 100644 index 00000000..fbdb67e3 --- /dev/null +++ b/src/globalEventListener.js @@ -0,0 +1,42 @@ +import { MENU_SHOW, MENU_HIDE } from './actions'; +import { uniqueId, hasOwnProp } from './helpers'; + +class GlobalEventListener { + constructor() { + this.callbacks = {}; + + window.addEventListener(MENU_SHOW, this.handleShowEvent); + window.addEventListener(MENU_HIDE, this.handleHideEvent); + } + + handleShowEvent = (event) => { + for (const id in this.callbacks) { + if (hasOwnProp(this.callbacks, id)) this.callbacks[id].show(event); + } + } + + handleHideEvent = (event) => { + for (const id in this.callbacks) { + if (hasOwnProp(this.callbacks, id)) this.callbacks[id].hide(event); + } + } + + register = (showCallback, hideCallback) => { + const id = uniqueId(); + + this.callbacks[id] = { + show: showCallback, + hide: hideCallback + }; + + return id; + } + + unregister = (id) => { + if (id && this.callbacks[id]) { + delete this.callbacks[id]; + } + } +} + +export default new GlobalEventListener(); diff --git a/src/helpers.js b/src/helpers.js new file mode 100644 index 00000000..35cdf6cc --- /dev/null +++ b/src/helpers.js @@ -0,0 +1,24 @@ +export function callIfExists(func, ...args) { + return (typeof func === 'function') && func(...args); +} + +export function hasOwnProp(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +export function uniqueId() { + return Math.random().toString(36).substring(7); +} + +export const cssClasses = { + menu: 'react-contextmenu', + menuVisible: 'react-contextmenu--visible', + menuWrapper: 'react-contextmenu-wrapper', + menuItem: 'react-contextmenu-item', + menuLink: 'react-contextmenu-link', + menuLinkActive: 'react-contextmenu-link--active', + menuLinkDisabled: 'react-contextmenu-link--disabled', + subMenu: 'react-contextmenu-submenu' +}; + +export const store = {}; diff --git a/src/index.js b/src/index.js index 0231371c..9870af02 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,4 @@ -export { default as ContextMenu } from "./context-menu"; -export { default as ContextMenuLayer } from "./contextmenu-layer"; -export { default as MenuItem } from "./menu-item"; -export { default as monitor } from "./monitor"; -export { default as SubMenu } from "./submenu"; -export { default as connect } from "./connect"; +export { default as ContextMenu } from './ContextMenu'; +export { default as ContextMenuTrigger } from './ContextMenuTrigger'; +export { default as MenuItem } from './MenuItem'; +export { default as SubMenu } from './SubMenu'; diff --git a/src/menu-item.js b/src/menu-item.js deleted file mode 100644 index 7ca6dd08..00000000 --- a/src/menu-item.js +++ /dev/null @@ -1,62 +0,0 @@ -import React from "react"; -import classnames from "classnames"; -import assign from "object-assign"; -import monitor from "./monitor"; - -let { PropTypes } = React; - -const MenuItem = React.createClass({ - displayName: "MenuItem", - propTypes: { - onClick: PropTypes.func.isRequired, - data: PropTypes.object, - disabled: PropTypes.bool, - preventClose: PropTypes.bool - }, - getDefaultProps() { - return { - disabled: false, - data: {}, - attributes: {} - }; - }, - handleClick(event) { - let { disabled, onClick, data, preventClose } = this.props; - - event.preventDefault(); - - if (disabled) return; - - - var newData = {} - assign(newData, data, monitor.getItem()); - - if (typeof onClick === "function") { - onClick(event, newData); - } - - if (preventClose) return; - - monitor.hideMenu(); - }, - render() { - let { disabled, children, attributes: { className = "", ...props } } = this.props, - menuItemClassNames = `react-context-menu-item ${className}`; - - const classes = classnames({ - "react-context-menu-link": true, - disabled - }); - - - return ( -
- - {children} - -
- ); - } -}); - -export default MenuItem; diff --git a/src/monitor.js b/src/monitor.js deleted file mode 100644 index 9f67a68d..00000000 --- a/src/monitor.js +++ /dev/null @@ -1,22 +0,0 @@ -/* eslint-disable object-property-newline */ -import store from "./redux/store"; - -export default { - getItem() { - return store.getState().currentItem; - }, - getPosition() { - let { x, y } = store.getState(); - - return {x, y}; - }, - hideMenu() { - store.dispatch({ - type: "SET_PARAMS", - data: { - isVisible: false, - currentItem: {} - } - }); - } -}; diff --git a/src/redux/reducers.js b/src/redux/reducers.js deleted file mode 100644 index 332e62c0..00000000 --- a/src/redux/reducers.js +++ /dev/null @@ -1,14 +0,0 @@ -import assign from "object-assign"; - -const defaultState = { - x: 0, - y: 0, - isVisible: false, - currentItem: {} -}; - -export default function(state = defaultState, action) { - return action.type === "SET_PARAMS" - ? assign({}, state, action.data) - : state; -} diff --git a/src/redux/store.js b/src/redux/store.js deleted file mode 100644 index f02d47ab..00000000 --- a/src/redux/store.js +++ /dev/null @@ -1,4 +0,0 @@ -import { createStore } from "redux"; -import rootReducer from "./reducers"; - -export default createStore(rootReducer); diff --git a/src/submenu/index.js b/src/submenu/index.js deleted file mode 100644 index 6668af97..00000000 --- a/src/submenu/index.js +++ /dev/null @@ -1,78 +0,0 @@ -import React from "react"; -import classnames from "classnames"; - -import MenuWrapper from "./wrapper"; - -const menuStyles = { - position: "relative", - zIndex: "auto" -}; - -let SubMenu = React.createClass({ - displayName: "SubMenu", - propTypes: { - title: React.PropTypes.string.isRequired, - disabled: React.PropTypes.bool, - hoverDelay: React.PropTypes.number - }, - getDefaultProps() { - return { - hoverDelay: 500 - }; - }, - getInitialState() { - return { - visible: false - }; - }, - shouldComponentUpdate(nextProps, nextState) { - return this.state.isVisible !== nextState.visible; - }, - componentWillUnmount() { - if (this.opentimer) clearTimeout(this.opentimer); - - if (this.closetimer) clearTimeout(this.closetimer); - }, - handleClick(e) { - e.preventDefault(); - }, - handleMouseEnter() { - if (this.closetimer) clearTimeout(this.closetimer); - - if (this.props.disabled || this.state.visible) return; - - this.opentimer = setTimeout(() => this.setState({visible: true}), this.props.hoverDelay); - }, - handleMouseLeave() { - if (this.opentimer) clearTimeout(this.opentimer); - - if (!this.state.visible) return; - - this.closetimer = setTimeout(() => this.setState({visible: false}), this.props.hoverDelay); - }, - render() { - let { disabled, children, title } = this.props, - { visible } = this.state; - - const classes = classnames({ - "react-context-menu-link": true, - disabled, - active: visible - }), - menuClasses = "react-context-menu-item submenu"; - - return ( -
(this.item = c)} className={menuClasses} style={menuStyles} - onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> - - {title} - - - {children} - -
- ); - } -}); - -export default SubMenu; diff --git a/src/submenu/wrapper.js b/src/submenu/wrapper.js deleted file mode 100644 index 187ef7b6..00000000 --- a/src/submenu/wrapper.js +++ /dev/null @@ -1,79 +0,0 @@ -import React from "react"; - -const SubMenuWrapper = React.createClass({ - displayName: "SubMenuWrapper", - propTypes: { - visible: React.PropTypes.bool - }, - getInitialState() { - return { - position: { - top: true, - right: true - } - }; - }, - componentWillReceiveProps(nextProps) { - if (nextProps.visible) { - const wrapper = window.requestAnimationFrame || setTimeout; - - wrapper(() => { - this.setState(this.getMenuPosition()); - this.forceUpdate(); - }); - } else { - this.setState(this.getInitialState()); - } - }, - shouldComponentUpdate(nextProps) { - return this.props.visible !== nextProps.visible; - }, - getMenuPosition() { - let { innerWidth, innerHeight } = window, - rect = this.menu.getBoundingClientRect(), - position = {}; - - - if (rect.bottom > innerHeight) { - position.bottom = true; - } else { - position.top = true; - } - - if (rect.right > innerWidth) { - position.left = true; - } else { - position.right = true; - } - - return { position }; - }, - getPositionStyles() { - let style = {}, - { position } = this.state; - - if (position.top) style.top = 0; - if (position.bottom) style.bottom = 0; - if (position.right) style.left = "100%"; - if (position.left) style.right = "100%"; - - return style; - }, - render() { - let { children, visible } = this.props; - - const style = { - display: visible ? "block" : "none", - position: "absolute", - ...this.getPositionStyles() - }; - - return ( - - ); - } -}); - -export default SubMenuWrapper; From fe323da58a591601ca29d99c9c9366591aaf7112 Mon Sep 17 00:00:00 2001 From: Vivek Kumar Bansal Date: Tue, 25 Oct 2016 16:16:12 +0530 Subject: [PATCH 002/258] update Examples for v2 --- examples/.eslintrc.yml | 4 + examples/Customization.js | 66 +++++++++++++ examples/MultipleMenus.js | 54 +++++++++++ examples/MultipleTargets.js | 89 ++++++++++++++++++ examples/SimpleMenu.js | 40 ++++++++ examples/SubMenus.js | 53 +++++++++++ examples/customization/constants.js | 3 - examples/customization/container.js | 36 -------- examples/customization/index.js | 32 ------- examples/customization/menu.js | 38 -------- examples/customization/target.js | 18 ---- examples/index.html | 2 +- examples/index.js | 92 +++++++++---------- examples/multiple-menus/constants.js | 4 - examples/multiple-menus/container.js | 24 ----- examples/multiple-menus/index.js | 34 ------- examples/multiple-menus/menu.js | 22 ----- examples/multiple-menus/menu2.js | 22 ----- examples/multiple-menus/target.js | 22 ----- examples/multiple-targets/constants.js | 3 - examples/multiple-targets/container.js | 35 ------- examples/multiple-targets/index.js | 32 ------- examples/multiple-targets/menu.js | 28 ------ examples/multiple-targets/target.js | 20 ---- ...context-menu.css => react-contextmenu.css} | 25 +++-- examples/simple-menu/constants.js | 3 - examples/simple-menu/container.js | 16 ---- examples/simple-menu/index.js | 33 ------- examples/simple-menu/menu.js | 22 ----- examples/submenus/constants.js | 3 - examples/submenus/container.js | 16 ---- examples/submenus/index.js | 32 ------- examples/submenus/menu.js | 34 ------- 33 files changed, 368 insertions(+), 589 deletions(-) create mode 100644 examples/.eslintrc.yml create mode 100644 examples/Customization.js create mode 100644 examples/MultipleMenus.js create mode 100644 examples/MultipleTargets.js create mode 100644 examples/SimpleMenu.js create mode 100644 examples/SubMenus.js delete mode 100644 examples/customization/constants.js delete mode 100644 examples/customization/container.js delete mode 100644 examples/customization/index.js delete mode 100644 examples/customization/menu.js delete mode 100644 examples/customization/target.js delete mode 100644 examples/multiple-menus/constants.js delete mode 100644 examples/multiple-menus/container.js delete mode 100644 examples/multiple-menus/index.js delete mode 100644 examples/multiple-menus/menu.js delete mode 100644 examples/multiple-menus/menu2.js delete mode 100644 examples/multiple-menus/target.js delete mode 100644 examples/multiple-targets/constants.js delete mode 100644 examples/multiple-targets/container.js delete mode 100644 examples/multiple-targets/index.js delete mode 100644 examples/multiple-targets/menu.js delete mode 100644 examples/multiple-targets/target.js rename examples/{react-context-menu.css => react-contextmenu.css} (63%) delete mode 100644 examples/simple-menu/constants.js delete mode 100644 examples/simple-menu/container.js delete mode 100644 examples/simple-menu/index.js delete mode 100644 examples/simple-menu/menu.js delete mode 100644 examples/submenus/constants.js delete mode 100644 examples/submenus/container.js delete mode 100644 examples/submenus/index.js delete mode 100644 examples/submenus/menu.js diff --git a/examples/.eslintrc.yml b/examples/.eslintrc.yml new file mode 100644 index 00000000..bd02eac3 --- /dev/null +++ b/examples/.eslintrc.yml @@ -0,0 +1,4 @@ +settings: + import/resolver: + webpack: + config: examples.config.js diff --git a/examples/Customization.js b/examples/Customization.js new file mode 100644 index 00000000..03bfdd44 --- /dev/null +++ b/examples/Customization.js @@ -0,0 +1,66 @@ +import React, { Component } from 'react'; + +import ContextMenuLayer from 'src/ContextMenuTrigger'; +import ContextMenu from 'src/ContextMenu'; +import MenuItem from 'src/MenuItem'; + +const MENU_TYPE = 'SIMPLE'; + +const targets = [{ + name: 'Banana' +}, { + name: 'Apple' +}, { + name: 'Papaya' +}, { + name: 'Mango' +}, { + name: 'Orange' +}, { + name: 'Pineapple' +}]; + +function collect(props) { + return { name: props.name }; +} + +export default class Customization extends Component { + constructor(props) { + super(props); + + this.state = { logs: [] }; + } + + handleClick = (e, data) => { + this.setState(({logs}) => ({ + logs: [`Clicked on ${data.name} menu ${data.item}`, ...logs] + })); + } + + render() { + return ( +
+

Custom Wrappers

+

This demo shows usage of customization. Instead of using divs by default, we are using trs

+ + + {targets.map((item, i) => ( + + + + ))} + +
{item.name}
+
+ {this.state.logs.map((log, i) => (

{log}

))} +
+ + Menu Item 1 + Menu Item 2 + +
+ ); + } +} diff --git a/examples/MultipleMenus.js b/examples/MultipleMenus.js new file mode 100644 index 00000000..01ce1465 --- /dev/null +++ b/examples/MultipleMenus.js @@ -0,0 +1,54 @@ +import React, { Component } from 'react'; + +import ContextMenuLayer from 'src/ContextMenuTrigger'; +import ContextMenu from 'src/ContextMenu'; +import MenuItem from 'src/MenuItem'; + +const MENU_1 = 'MENU_1'; +const MENU_2 = 'MENU_2'; + +export default class MultipleMenus extends Component { + constructor(props) { + super(props); + + this.state = { logs: [] }; + } + + handleClick = (e, data) => { + this.setState(({logs}) => ({ + logs: [`Clicked on menu ${data.menu} item ${data.item}`, ...logs] + })); + } + + render() { + return ( +
+

Multiple Menus

+

This demo shows usage of multiple menus on multiple targets.

+
+
+ +
right click to see the menu
+
+
+
+ +
right click to see the menu
+
+
+
+
+ {this.state.logs.map((log, i) => (

{log}

))} +
+ + Menu 1 Item 1 + Menu 1 Item 2 + + + Menu 2 Item 1 + Menu 2 Item 2 + +
+ ); + } +} diff --git a/examples/MultipleTargets.js b/examples/MultipleTargets.js new file mode 100644 index 00000000..cb941aa3 --- /dev/null +++ b/examples/MultipleTargets.js @@ -0,0 +1,89 @@ +import React, { Component } from 'react'; + +import ContextMenuLayer from 'src/ContextMenuTrigger'; +import ContextMenu from 'src/ContextMenu'; +import MenuItem from 'src/MenuItem'; + +const MENU_TYPE = 'MULTI'; + +const targets = [{ + name: 'Banana' +}, { + name: 'Apple' +}, { + name: 'Papaya' +}, { + name: 'Mango' +}, { + name: 'Orange' +}, { + name: 'Pineapple' +}]; + +function collect(props) { + return { name: props.name }; +} + +export default class MultipleTargets extends Component { + constructor(props) { + super(props); + + this.state = { logs: [] }; + } + + handleClick = (e, data, target) => { + const count = parseInt(target.getAttribute('data-count'), 10); + + if (data.action === 'Added') { + target.setAttribute('data-count', count + 1); + + return this.setState(({logs}) => ({ + logs: [`${data.action} 1 ${data.name}`, ...logs] + })); + } + + if (data.action === 'Removed' && count > 0) { + target.setAttribute('data-count', count - 1); + + return this.setState(({logs}) => ({ + logs: [`${data.action} 1 ${data.name}`, ...logs] + })); + } + + this.setState(({logs}) => ({ + logs: [` ${data.name} cannot be ${data.action.toLowerCase()}`, ...logs] + })); + } + + render() { + const attributes = { + 'data-count': 0, + className: 'example-multiple-targets well' + }; + + return ( +
+

Multiple Menus

+

This demo shows usage of multiple menus on multiple targets.

+
+ {targets.map((item, i) => ( +
+ + {item.name} + +
+ ))} +
+
+ {this.state.logs.map((log, i) => (

{log}

))} +
+ + Add 1 count + Remove 1 count + +
+ ); + } +} diff --git a/examples/SimpleMenu.js b/examples/SimpleMenu.js new file mode 100644 index 00000000..f5a81b3f --- /dev/null +++ b/examples/SimpleMenu.js @@ -0,0 +1,40 @@ +import React, { Component } from 'react'; + +import ContextMenuLayer from 'src/ContextMenuTrigger'; +import ContextMenu from 'src/ContextMenu'; +import MenuItem from 'src/MenuItem'; + +const MENU_TYPE = 'SIMPLE'; + +export default class SimpleMenu extends Component { + constructor(props) { + super(props); + + this.state = { logs: [] }; + } + + handleClick = (e, data) => { + this.setState(({logs}) => ({ + logs: [`Clicked on menu ${data.item}`, ...logs] + })); + } + + render() { + return ( +
+

Simple Menu

+

This demo simple usage of a context menu.

+ +
right click to see the menu
+
+
+ {this.state.logs.map((log, i) => (

{log}

))} +
+ + Menu Item 1 + Menu Item 2 + +
+ ); + } +} diff --git a/examples/SubMenus.js b/examples/SubMenus.js new file mode 100644 index 00000000..0809e8ce --- /dev/null +++ b/examples/SubMenus.js @@ -0,0 +1,53 @@ +import React, { Component } from 'react'; + +import ContextMenuLayer from 'src/ContextMenuTrigger'; +import ContextMenu from 'src/ContextMenu'; +import MenuItem from 'src/MenuItem'; +import SubMenu from 'src/SubMenu'; + +const MENU_TYPE = 'SIMPLE'; + +export default class SimpleMenu extends Component { + constructor(props) { + super(props); + + this.state = { logs: [] }; + } + + handleClick = (e, data) => { + this.setState(({logs}) => ({ + logs: [`Clicked on menu ${data.item}`, ...logs] + })); + } + + render() { + return ( +
+

Simple Menu

+

This demo simple usage of a context menu.

+ +
right click to see the menu
+
+
+ {this.state.logs.map((log, i) => (

{log}

))} +
+ + Menu Item 1 + Menu Item 2 + + SubItem 1 + + SubSubItem 1 + SubSubItem 2 + + + SubSubItem 3 + SubSubItem 4 + + SubItem 2 + + +
+ ); + } +} diff --git a/examples/customization/constants.js b/examples/customization/constants.js deleted file mode 100644 index 0f9d4a3f..00000000 --- a/examples/customization/constants.js +++ /dev/null @@ -1,3 +0,0 @@ -export default { - multi: "multi" -}; diff --git a/examples/customization/container.js b/examples/customization/container.js deleted file mode 100644 index 2fa5c518..00000000 --- a/examples/customization/container.js +++ /dev/null @@ -1,36 +0,0 @@ -"use strict"; - -import React from "react"; -import Target from "./target"; - -const targets = [{ - name: "Banana" -}, { - name: "Apple" -}, { - name: "Papaya" -}, { - name: "Mango" -}, { - name: "Orange" -}, { - name: "Pineapple" -}]; - -const Container = React.createClass({ - displayName: "Container", - render() { - return ( - - - {targets.map((item, i) => ( - - ))} - -
- ); - } -}); - -export default Container; diff --git a/examples/customization/index.js b/examples/customization/index.js deleted file mode 100644 index f8e39fd8..00000000 --- a/examples/customization/index.js +++ /dev/null @@ -1,32 +0,0 @@ -"use strict"; - -import React from "react"; -import Container from "./container"; -import Menu from "./menu"; - -const Customization = React.createClass({ - displayName: "Customization", - getInitialState() { - return { logs: [] }; - }, - addLog(log) { - this.setState({ - logs: this.state.logs.concat(log) - }); - }, - render() { - return ( -
-

Custom Wrappers

-

This demo shows usage of customization. Instead of using divs by default, we are using trs

- -
- {this.state.logs.map((log, i) => (

{log}

))} -
- -
- ); - } -}); - -export default Customization; diff --git a/examples/customization/menu.js b/examples/customization/menu.js deleted file mode 100644 index 31320259..00000000 --- a/examples/customization/menu.js +++ /dev/null @@ -1,38 +0,0 @@ -"use strict"; - -import React from "react"; -import { ContextMenu, MenuItem, connect } from "../../src"; -import MenuTypes from "./constants"; - -const Menu = React.createClass({ - displayName: "Menu", - handleClick(e, data) { - this.props.addLog(`Clicked on menu ${data.item} on ${data.name}`); - }, - handleEat(e, data) { - this.props.addLog(`Must Eat ${data.name}`); - }, - render() { - let { name } = this.props.item; - - const attributes = { - className: "my-custom-menu-item-class" - }; - - return ( - - - Menu Item 1 - - - Menu Item 2 - - Eat {name} - - ); - } -}); - -export default connect(Menu); diff --git a/examples/customization/target.js b/examples/customization/target.js deleted file mode 100644 index 42bcf78b..00000000 --- a/examples/customization/target.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; - -import React from "react"; -import { ContextMenuLayer } from "../../src"; -import MenuTypes from "./constants"; - -const MenuTarget = React.createClass({ - displayName: "MenuTarget", - render() { - return ( - {this.props.name} - ); - } -}); - -export default ContextMenuLayer(MenuTypes.multi, (props) => ({ - name: props.name -}))(MenuTarget); diff --git a/examples/index.html b/examples/index.html index 18a4b7bf..f8522ed1 100644 --- a/examples/index.html +++ b/examples/index.html @@ -4,7 +4,7 @@ React ContextMenu - + -
+
+

react-contextmenu

+

ContextMenu in React with accessibility support.

+ Fork me on GitHub + +
+

Download / Usage: View on GitHub

+
+

Examples:

+
+
diff --git a/examples/index.js b/examples/index.js index f7bce472..83f43af1 100644 --- a/examples/index.js +++ b/examples/index.js @@ -1,6 +1,6 @@ import React from 'react'; import ReactDOM from 'react-dom'; -import { Router, Route, Link, IndexRoute, hashHistory } from 'react-router'; +import { HashRouter as Router, Route, NavLink as Link, Switch } from 'react-router-dom'; import SimpleMenu from './SimpleMenu'; import MultipleTargets from './MultipleTargets'; @@ -10,54 +10,69 @@ import DynamicMenu from './DynamicMenu'; import Customization from './Customization'; import RTLSubMenu from './RTLSubMenu'; -function App({ children }) { +const commonProps = { + className: 'pure-menu-link', + activeClassName: 'link-active' +}; + +function App() { return ( -
-

React ContextMenu Context menus using react

-
-
    -
  • - Simple Menu +
    +
    +
      +
    • + + Simple Menu +
    • -
    • - Multiple Targets +
    • + + Multiple Targets +
    • -
    • - Multiple Menus +
    • + + Multiple Menus +
    • -
    • - Sub Menus +
    • + + Sub Menus +
    • -
    • - Dynamic Menu +
    • + + Dynamic Menu +
    • -
    • - Customization +
    • + + Customization +
    • -
    • - Right-to-Left +
    • + + Right-to-Left +
    -
    - {children} -
    + + + + + + + + +
    ); } const Routes = ( - - - - - - - - - - - + + ); diff --git a/package.json b/package.json index 8704b8ea..0635c903 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "babel-eslint": "^7.2.1", "babel-jest": "^19.0.0", "babel-loader": "^6.4.1", + "babel-preset-babili": "0.0.12", "babel-preset-env": "^1.2.2", "babel-preset-es2015": "^6.24.0", "babel-preset-react": "^6.22.0", @@ -74,7 +75,7 @@ "react": "^15.4.2", "react-addons-test-utils": "^15.4.2", "react-dom": "^15.4.2", - "react-router": "^3.0.0", + "react-router-dom": "^4.0.0", "rimraf": "^2.6.1", "webpack": "^2.3.2" }, From 22c9427171024d71ac51f1a7b0176eb03cbd8cab Mon Sep 17 00:00:00 2001 From: Vivek Kumar Bansal Date: Sun, 26 Mar 2017 18:58:23 +0530 Subject: [PATCH 101/258] fix default prop --- src/ContextMenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ContextMenu.js b/src/ContextMenu.js index 6667c4aa..0d95c7f1 100644 --- a/src/ContextMenu.js +++ b/src/ContextMenu.js @@ -21,7 +21,7 @@ export default class ContextMenu extends Component { static defaultProps = { className: '', data: {}, - hideOnLeave() { return null; }, + hideOnLeave: false, onHide() { return null; }, onMouseLeave() { return null; }, onShow() { return null; } From 5c1399ccd1ccaa4449b4302b6c392f9889fe4eb8 Mon Sep 17 00:00:00 2001 From: Vivek Kumar Bansal Date: Sun, 26 Mar 2017 19:03:59 +0530 Subject: [PATCH 102/258] update snapshots --- tests/__snapshots__/ContextMenu.test.js.snap | 24 ++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/__snapshots__/ContextMenu.test.js.snap b/tests/__snapshots__/ContextMenu.test.js.snap index be42f65a..aa9dfc5a 100644 --- a/tests/__snapshots__/ContextMenu.test.js.snap +++ b/tests/__snapshots__/ContextMenu.test.js.snap @@ -2,7 +2,13 @@ exports[`ContextMenu tests does not shows when event with incorrect "id" is triggered 1`] = `
diff --git a/src/SubMenu.js b/src/SubMenu.js index d05218ce..6a5d3608 100644 --- a/src/SubMenu.js +++ b/src/SubMenu.js @@ -1,42 +1,58 @@ -import React, { Component } from 'react'; +import React from 'react'; import PropTypes from 'prop-types'; import cx from 'classnames'; +import AbstractMenu from './AbstractMenu'; import { cssClasses, hasOwnProp } from './helpers'; -export default class SubMenu extends Component { +export default class SubMenu extends AbstractMenu { static propTypes = { children: PropTypes.node.isRequired, title: PropTypes.node.isRequired, className: PropTypes.string, disabled: PropTypes.bool, hoverDelay: PropTypes.number, - rtl: PropTypes.bool + rtl: PropTypes.bool, + selected: PropTypes.bool, + onMouseMove: PropTypes.func.isRequired, + onMouseOut: PropTypes.func.isRequired, + forceOpen: PropTypes.bool.isRequired, + forceClose: PropTypes.func.isRequired, + parentKeyNavigationHandler: PropTypes.func.isRequired }; static defaultProps = { disabled: false, hoverDelay: 500, className: '', - rtl: false + rtl: false, + selected: false }; constructor(props) { super(props); - this.state = { + this.state = Object.assign({}, this.state, { visible: false - }; + }); + } + + getSubMenuType() { // eslint-disable-line class-methods-use-this + return SubMenu; } shouldComponentUpdate(nextProps, nextState) { - return this.state.isVisible !== nextState.visible; + this.isVisibilityChange = (this.state.visible !== nextState.visible || + this.props.forceOpen !== nextProps.forceOpen) && + !(this.state.visible && nextProps.forceOpen) && + !(this.props.forceOpen && nextState.visible); + return true; } componentDidUpdate() { - if (this.state.visible) { + if (!this.isVisibilityChange) return; + if (this.props.forceOpen || this.state.visible) { const wrapper = window.requestAnimationFrame || setTimeout; - wrapper(() => { const styles = this.props.rtl ? this.getRTLMenuPosition() @@ -52,6 +68,9 @@ export default class SubMenu extends Component { if (hasOwnProp(styles, 'bottom')) this.subMenu.style.bottom = styles.bottom; if (hasOwnProp(styles, 'right')) this.subMenu.style.right = styles.right; this.subMenu.classList.add(cssClasses.menuVisible); + + this.registerHandlers(); + this.setState({ selectedItem: null }); }); } else { this.subMenu.classList.remove(cssClasses.menuVisible); @@ -59,6 +78,7 @@ export default class SubMenu extends Component { this.subMenu.style.removeProperty('right'); this.subMenu.style.top = 0; this.subMenu.style.left = '100%'; + this.unregisterHandlers(); } } @@ -66,6 +86,8 @@ export default class SubMenu extends Component { if (this.opentimer) clearTimeout(this.opentimer); if (this.closetimer) clearTimeout(this.closetimer); + + this.unregisterHandlers(); } getMenuPosition = () => { @@ -108,6 +130,13 @@ export default class SubMenu extends Component { return position; } + hideMenu = () => { + if (this.props.forceOpen) { + this.props.forceClose(); + } + this.setState({ visible: false, selectedItem: null }); + } + handleClick = (e) => { e.preventDefault(); } @@ -117,7 +146,10 @@ export default class SubMenu extends Component { if (this.props.disabled || this.state.visible) return; - this.opentimer = setTimeout(() => this.setState({ visible: true }), this.props.hoverDelay); + this.opentimer = setTimeout(() => this.setState({ + visible: true, + selectedItem: null + }), this.props.hoverDelay); } handleMouseLeave = () => { @@ -125,7 +157,10 @@ export default class SubMenu extends Component { if (!this.state.visible) return; - this.closetimer = setTimeout(() => this.setState({ visible: false }), this.props.hoverDelay); + this.closetimer = setTimeout(() => this.setState({ + visible: false, + selectedItem: null + }), this.props.hoverDelay); } menuRef = (c) => { @@ -136,8 +171,18 @@ export default class SubMenu extends Component { this.subMenu = c; } + registerHandlers = () => { + document.removeEventListener('keydown', this.props.parentKeyNavigationHandler); + document.addEventListener('keydown', this.handleKeyNavigation); + } + + unregisterHandlers = () => { + document.removeEventListener('keydown', this.handleKeyNavigation); + document.addEventListener('keydown', this.props.parentKeyNavigationHandler); + } + render() { - const { children, disabled, title } = this.props; + const { children, disabled, title, selected } = this.props; const { visible } = this.state; const menuProps = { ref: this.menuRef, @@ -151,8 +196,11 @@ export default class SubMenu extends Component { const menuItemProps = { className: cx(cssClasses.menuItem, { [cssClasses.menuItemDisabled]: disabled, - [cssClasses.menuItemActive]: visible + [cssClasses.menuItemActive]: visible, + [cssClasses.menuItemSelected]: selected }), + onMouseMove: this.props.onMouseMove, + onMouseOut: this.props.onMouseOut, onClick: this.handleClick }; const subMenuProps = { @@ -171,7 +219,7 @@ export default class SubMenu extends Component { {title}
); diff --git a/src/helpers.js b/src/helpers.js index 357d4e51..eb492696 100644 --- a/src/helpers.js +++ b/src/helpers.js @@ -18,6 +18,7 @@ export const cssClasses = { menuItemActive: 'react-contextmenu-item--active', menuItemDisabled: 'react-contextmenu-item--disabled', menuItemDivider: 'react-contextmenu-item--divider', + menuItemSelected: 'react-contextmenu-item--selected', subMenu: 'react-contextmenu-submenu' }; diff --git a/tests/ContextMenu.test.js b/tests/ContextMenu.test.js index 5c67b01d..b2e0b73c 100644 --- a/tests/ContextMenu.test.js +++ b/tests/ContextMenu.test.js @@ -14,9 +14,9 @@ describe('ContextMenu tests', () => { ); expect(component).toMatchSnapshot(); - expect(component.state()).toEqual({isVisible: false, x: 0, y: 0}); + expect(component.state()).toEqual({isVisible: false, x: 0, y: 0, forceSubMenuOpen: false, selectedItem: null}); showMenu({position: {x, y}, id: ID}); - expect(component.state()).toEqual({isVisible: true, x, y}); + expect(component.state()).toEqual({isVisible: true, x, y, forceSubMenuOpen: false, selectedItem: null}); expect(component).toMatchSnapshot(); component.unmount(); }); @@ -30,9 +30,9 @@ describe('ContextMenu tests', () => { ); expect(component).toMatchSnapshot(); - expect(component.state()).toEqual({isVisible: false, x: 0, y: 0}); + expect(component.state()).toEqual({isVisible: false, x: 0, y: 0, forceSubMenuOpen: false, selectedItem: null}); showMenu({position: {x, y}, id: 'ID'}); - expect(component.state()).toEqual({isVisible: false, x: 0, y: 0}); + expect(component.state()).toEqual({isVisible: false, x: 0, y: 0, forceSubMenuOpen: false, selectedItem: null}); expect(component).toMatchSnapshot(); component.unmount(); }); @@ -47,13 +47,13 @@ describe('ContextMenu tests', () => { hideMenu(); showMenu(data); - expect(component.state()).toEqual(Object.assign({isVisible: true}, data.position)); + expect(component.state()).toEqual(Object.assign({isVisible: true, forceSubMenuOpen: false, selectedItem: null}, data.position)); expect(onShow).toHaveBeenCalled(); showMenu(data); expect(onShow).toHaveBeenCalledTimes(1); expect(onHide).not.toHaveBeenCalled(); hideMenu(); - expect(component.state()).toEqual(Object.assign({isVisible: false}, data.position)); + expect(component.state()).toEqual(Object.assign({isVisible: false, forceSubMenuOpen: false, selectedItem: null}, data.position)); expect(onShow).toHaveBeenCalledTimes(1); expect(onHide).toHaveBeenCalledTimes(1); component.unmount(); @@ -65,12 +65,12 @@ describe('ContextMenu tests', () => { const component = mount( ); - const escape = new window.KeyboardEvent('keyup', {keyCode: 27}); + const escape = new window.KeyboardEvent('keydown', {keyCode: 27}); showMenu(data); - expect(component.state()).toEqual(Object.assign({isVisible: true}, data.position)); + expect(component.state()).toEqual(Object.assign({isVisible: true, forceSubMenuOpen: false, selectedItem: null}, data.position)); document.dispatchEvent(escape); - expect(component.state()).toEqual(Object.assign({isVisible: false}, data.position)); + expect(component.state()).toEqual(Object.assign({isVisible: false, forceSubMenuOpen: false, selectedItem: null}, data.position)); expect(onHide).toHaveBeenCalled(); component.unmount(); }); @@ -84,11 +84,11 @@ describe('ContextMenu tests', () => { const outsideClick = new window.MouseEvent('mousedown', {target: document}); showMenu(data); - expect(component.state()).toEqual(Object.assign({isVisible: true}, data.position)); + expect(component.state()).toEqual(Object.assign({isVisible: true, forceSubMenuOpen: false, selectedItem: null}, data.position)); component.simulate('mousedown'); - expect(component.state()).toEqual(Object.assign({isVisible: true}, data.position)); + expect(component.state()).toEqual(Object.assign({isVisible: true, forceSubMenuOpen: false, selectedItem: null}, data.position)); document.dispatchEvent(outsideClick); - expect(component.state()).toEqual(Object.assign({isVisible: false}, data.position)); + expect(component.state()).toEqual(Object.assign({isVisible: false, forceSubMenuOpen: false, selectedItem: null}, data.position)); expect(onHide).toHaveBeenCalled(); component.unmount(); }); @@ -101,9 +101,9 @@ describe('ContextMenu tests', () => { ); showMenu(data); - expect(component.state()).toEqual(Object.assign({isVisible: true}, data.position)); + expect(component.state()).toEqual(Object.assign({isVisible: true, forceSubMenuOpen: false, selectedItem: null}, data.position)); component.simulate('mouseleave'); - expect(component.state()).toEqual(Object.assign({isVisible: false}, data.position)); + expect(component.state()).toEqual(Object.assign({isVisible: false, forceSubMenuOpen: false, selectedItem: null}, data.position)); expect(onMouseLeave).toHaveBeenCalled(); component.unmount(); }); From 6e09cf2843051c8a66ab27f18d9a8c1ee20814ad Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 17 May 2017 12:33:07 +0200 Subject: [PATCH 128/258] Add typescript typedefs for the main components, fixes #10 --- package.json | 1 + src/index.d.ts | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 src/index.d.ts diff --git a/package.json b/package.json index 2b296be7..78b27c97 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "Context Menu implemented in React", "main": "modules/index.js", "module": "es6/index.js", + "typings": "src/index.d.ts", "keywords": [ "react", "reactjs", diff --git a/src/index.d.ts b/src/index.d.ts new file mode 100644 index 00000000..e8032269 --- /dev/null +++ b/src/index.d.ts @@ -0,0 +1,57 @@ +declare module "react-contextmenu" { + import * as React from "react"; + + interface ContextMenuProps { + id: string, + data?: any, + className?: string, + hideOnLeave?: boolean, + onHide?: {(event: any): void}, + onMouseLeave?: {(event: React.MouseEvent, data: Object, target: HTMLElement): void} | Function, + onShow?: {(event: any): void}, + } + + interface ContextMenuTriggerProps { + id: string, + attributes?: React.HTMLAttributes, + collect?: {(data: any): any}, + disable?: boolean, + holdToDisplay?: number, + renderTag?: React.ReactType, + } + + interface MenuItemProps { + attributes?: React.HTMLAttributes, + data?: Object, + disabled?: boolean, + divider?: boolean, + preventClose?: boolean, + onClick?: {(event: React.TouchEvent | React.MouseEvent, data: Object, target: HTMLElement): void} | Function, + } + + interface SubMenuProps { + title: React.ReactElement, + className?: string, + disabled?: boolean, + hoverDelay?: number, + rtl?: boolean, + } + + module ReactContextmenu { + export const ContextMenu: React.ComponentClass; + export const ContextMenuTrigger: React.ComponentClass; + export const MenuItem: React.ComponentClass; + export const SubMenu: React.ComponentClass; + } + + export = ReactContextmenu; +} + +declare module "react-contextmenu/modules/actions" { + module ReactContextmenuActions { + export function showMenu(opts?: any, target?: HTMLElement): void; + export function hideMenu(opts?: any, target?: HTMLElement): void; + } + + export = ReactContextmenuActions; +} From ae387e755eae3cff98aa675793f095c7f404ae74 Mon Sep 17 00:00:00 2001 From: Vivek Kumar Bansal Date: Thu, 18 May 2017 13:15:56 +0530 Subject: [PATCH 129/258] 2.6.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 78b27c97..f9bde3eb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-contextmenu", - "version": "2.5.2", + "version": "2.6.0", "description": "Context Menu implemented in React", "main": "modules/index.js", "module": "es6/index.js", From 9a0eb8926d1cc7515b648f1308f83c2a4cba9d8d Mon Sep 17 00:00:00 2001 From: Lange Paul Date: Sat, 20 May 2017 08:41:37 +0200 Subject: [PATCH 130/258] Key control fixes * Removed isRequired from the new props * Added some documentation for the new internal props --- docs/api.md | 23 ++++++++++++++++------- src/MenuItem.js | 8 +++++--- src/SubMenu.js | 17 +++++++++++------ 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/docs/api.md b/docs/api.md index 110a84d0..bad77188 100644 --- a/docs/api.md +++ b/docs/api.md @@ -47,8 +47,11 @@ A Simple Component for menu items. | onClick | Function | ✓ | | The function to be called on click of item. The function will receive three parameters. The first is `event` object. The second is the merged data passed using `props.data` and collect from `ContextMenuTrigger`. The third is the element on which right-click occured. | | data | Object | | `{}` | The extra data (if required) to be passed to `onClick` event. | | disabled | Boolean | | `false` | If `true`, disables the click event and adds `.disabled` class. | -| preventClose | Boolean | | false | By default, the context menu is closed as soon as an item is clicked. Set this prop to control this behavior. | +| preventClose | Boolean | | `false` | By default, the context menu is closed as soon as an item is clicked. Set this prop to control this behavior. | | attributes | Object | | | The attributes will be passed directly passed to the root element of `MenuItem`. Use this to customize it like adding custom classes, etc. | +| selected | boolean | | `false` | **Internal Prop**: will be set from the surrounded context `ContextMenu` or `SubMenu`. If set to `true` the css class `react-contextmenu-item--selected` will be added to associated element. | +| onMouseMove | Function | | | **Internal Prop**: will be directly passed to associated element, so the surrounded context `ContextMenu` or `SubMenu` can handle the interactions to pass the correct `selected` state. Also the surrounded context can store the current selected `MenuItem`. | +| onMouseLeave | Function | | | **Internal Prop**: will be directly passed to associated element, so the surrounded context `ContextMenu` or `SubMenu` can handle the interactions to pass the correct `selected` state. Also the surrounded context can store the current selected `MenuItem`. | ### `` @@ -56,9 +59,15 @@ A component for using submenus within the contextmenu. #### PropTypes -| Property | Type | Required? | Default | Description | -|------------|---------|-----------|---------|-----------------------------------------------------------------------------| -| title | String | ✓ | | The content to be displayed in parent menu. | -| disabled | Boolean | | `false` | If `true`, disables the menu from opening and adds `.disabled` class. | -| hoverDelay | Number | | `500` | The time (in ms) after which the menu is to be displayed when hovered upon. | -| classNames | String | | | Custom `className` applied to root element of the context-menu. | +| Property | Type | Required? | Default | Description | +|-------------|----------|-----------|---------|-----------------------------------------------------------------------------| +| title | String | ✓ | | The content to be displayed in parent menu. | +| disabled | Boolean | | `false` | If `true`, disables the menu from opening and adds `.disabled` class. | +| hoverDelay | Number | | `500` | The time (in ms) after which the menu is to be displayed when hovered upon. | +| classNames | String | | | Custom `className` applied to root element of the context-menu. | +| selected | boolean | | `false` | **Internal Prop**: will be set from the surrounded context `ContextMenu` or `SubMenu`. If set to `true` the css class `react-contextmenu-item--selected` will be added to associated element. | +| onMouseMove | Function | | | **Internal Prop**: will be directly passed to associated element, so the surrounded context `ContextMenu` or `SubMenu` can handle the interactions to pass the correct `selected` state. Also the surrounded context can store the current selected `SubMenu` entry. | +| onMouseOut | Function | | | **Internal Prop**: will be directly passed to associated element, so the surrounded context `ContextMenu` or `SubMenu` can handle the interactions to pass the correct `selected` state. Also the surrounded context can store the current selected `SubMenu` entry. | +| forceOpen | boolean | | `false` | **Internal Prop**: if the user hits enter or the right arrow key on a selected `SubMenu` entry, the surrounded context will pass `true` to this flag. The `SubMenu` stays open until this flag is `false`. | +| forceClose | Function | | | **Internal Prop**: if the user hits the escape key during an open `SubMenu`, this function will be called to indicate the surrounding context to reset the `forceOpen` flag. | +| parentKeyNavigationHandler | Function | | | **Internal Prop**: the `keydown` handler from the surrounding context will be passed to every open `SubMenu`. Then the `Submenu` will unregister the referenced handler and use it's own for key control. When the `SubMenu` hides again the original handler will be restored. | diff --git a/src/MenuItem.js b/src/MenuItem.js index 54f8739c..d63caba2 100644 --- a/src/MenuItem.js +++ b/src/MenuItem.js @@ -16,8 +16,8 @@ export default class MenuItem extends Component { preventClose: PropTypes.bool, onClick: PropTypes.func, selected: PropTypes.bool, - onMouseMove: PropTypes.func.isRequired, - onMouseLeave: PropTypes.func.isRequired + onMouseMove: PropTypes.func, + onMouseLeave: PropTypes.func }; static defaultProps = { @@ -28,7 +28,9 @@ export default class MenuItem extends Component { preventClose: false, onClick() { return null; }, children: null, - selected: false + selected: false, + onMouseMove: () => null, + onMouseLeave: () => null }; handleClick = (event) => { diff --git a/src/SubMenu.js b/src/SubMenu.js index 6a5d3608..e0878fd1 100644 --- a/src/SubMenu.js +++ b/src/SubMenu.js @@ -14,11 +14,11 @@ export default class SubMenu extends AbstractMenu { hoverDelay: PropTypes.number, rtl: PropTypes.bool, selected: PropTypes.bool, - onMouseMove: PropTypes.func.isRequired, - onMouseOut: PropTypes.func.isRequired, - forceOpen: PropTypes.bool.isRequired, - forceClose: PropTypes.func.isRequired, - parentKeyNavigationHandler: PropTypes.func.isRequired + onMouseMove: PropTypes.func, + onMouseOut: PropTypes.func, + forceOpen: PropTypes.bool, + forceClose: PropTypes.func, + parentKeyNavigationHandler: PropTypes.func }; static defaultProps = { @@ -26,7 +26,12 @@ export default class SubMenu extends AbstractMenu { hoverDelay: 500, className: '', rtl: false, - selected: false + selected: false, + onMouseMove: () => null, + onMouseOut: () => null, + forceOpen: false, + forceClose: () => null, + parentKeyNavigationHandler: () => null }; constructor(props) { From edc80bde727b75c85144a76d02ae971dfc7312f8 Mon Sep 17 00:00:00 2001 From: Lange Paul Date: Sat, 20 May 2017 16:36:53 +0200 Subject: [PATCH 131/258] Divider MenuItem should be not clickable --- src/MenuItem.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MenuItem.js b/src/MenuItem.js index d63caba2..91f549ab 100644 --- a/src/MenuItem.js +++ b/src/MenuItem.js @@ -36,7 +36,7 @@ export default class MenuItem extends Component { handleClick = (event) => { event.preventDefault(); - if (this.props.disabled) return; + if (this.props.disabled || this.props.divider) return; callIfExists( this.props.onClick, From bd6e9e8666717c09c70ebcc67a71f733196f9c3a Mon Sep 17 00:00:00 2001 From: Lange Paul Date: Sat, 20 May 2017 16:37:29 +0200 Subject: [PATCH 132/258] Don't show system contextmenu in production #112 --- src/ContextMenu.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/ContextMenu.js b/src/ContextMenu.js index e0037e98..ad5537f1 100644 --- a/src/ContextMenu.js +++ b/src/ContextMenu.js @@ -131,6 +131,13 @@ export default class ContextMenu extends AbstractMenu { if (this.props.hideOnLeave) hideMenu(); } + handleContextMenu = (e) => { + if (process.env.NODE_ENV === 'production') { + e.preventDefault(); + } + this.hideMenu(e); + } + hideMenu = (e) => { if (e.keyCode === 27) { // enter hideMenu(); @@ -179,7 +186,7 @@ export default class ContextMenu extends AbstractMenu { return ( ); From b7fef31f22542106000da082bbf7fa8b2f315dbe Mon Sep 17 00:00:00 2001 From: Lange Paul Date: Sat, 20 May 2017 17:29:17 +0200 Subject: [PATCH 133/258] Used wrong method call --- src/ContextMenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ContextMenu.js b/src/ContextMenu.js index ad5537f1..b80ad56e 100644 --- a/src/ContextMenu.js +++ b/src/ContextMenu.js @@ -135,7 +135,7 @@ export default class ContextMenu extends AbstractMenu { if (process.env.NODE_ENV === 'production') { e.preventDefault(); } - this.hideMenu(e); + this.handleHide(e); } hideMenu = (e) => { From 1a21fba69c9dab71b63292abebc23113e55b464c Mon Sep 17 00:00:00 2001 From: Lange Paul Date: Sun, 21 May 2017 12:08:41 +0200 Subject: [PATCH 134/258] Wrapping MenuItem or SubMenu wasn't possible any more --- src/AbstractMenu.js | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/AbstractMenu.js b/src/AbstractMenu.js index b33a1c83..86960db1 100644 --- a/src/AbstractMenu.js +++ b/src/AbstractMenu.js @@ -62,11 +62,15 @@ export default class AbstractMenu extends Component { selectChildren = (forward) => { const { selectedItem } = this.state; const children = []; - React.Children.forEach(this.props.children, (child) => { - if ([MenuItem, this.getSubMenuType()].indexOf(child.type) > -1 && !child.props.divider) { + const childCollector = (child) => { + if ([MenuItem, this.getSubMenuType()].indexOf(child.type) < 0) { + // Maybe the MenuItem or SubMenu is capsuled in a wrapper div or something else + childCollector(child.props.children); + } else if (!child.props.divider) { children.push(child); } - }); + }; + React.Children.forEach(this.props.children, childCollector); const currentIndex = children.indexOf(selectedItem); if (currentIndex < 0) { this.setState({ @@ -99,21 +103,26 @@ export default class AbstractMenu extends Component { renderChildren = children => React.Children.map(children, (child) => { const props = {}; if (!React.isValidElement(child)) return null; + if ([MenuItem, this.getSubMenuType()].indexOf(child.type) < 0) { + // Maybe the MenuItem or SubMenu is capsuled in a wrapper div or something else + props.children = this.renderChildren(child.props.children); + return React.cloneElement(child, props); + } + props.onMouseLeave = this.onChildMouseLeave.bind(this); if (child.type === this.getSubMenuType()) { + // special props for SubMenu only props.forceOpen = this.state.forceSubMenuOpen && (this.state.selectedItem === child); props.forceClose = this.handleForceClose; props.parentKeyNavigationHandler = this.handleKeyNavigation; } - if ([MenuItem, this.getSubMenuType()].indexOf(child.type) > -1 && !child.props.divider) { - if (this.state.selectedItem === child) { - props.selected = true; - props.onMouseLeave = this.onChildMouseLeave.bind(this); - props.ref = (ref) => { this.seletedItemRef = ref; }; - return React.cloneElement(child, props); - } + if (!child.props.divider && this.state.selectedItem === child) { + // special props for selected item only + props.selected = true; + props.ref = (ref) => { this.seletedItemRef = ref; }; + return React.cloneElement(child, props); } + // onMouseMove is only needed for non selected items props.onMouseMove = () => this.onChildMouseMove(child); - props.onMouseLeave = this.onChildMouseLeave.bind(this); return React.cloneElement(child, props); }); } From 175ba9245f962ad59907bd7ba5c5702405cde4da Mon Sep 17 00:00:00 2001 From: Lange Paul Date: Sun, 21 May 2017 12:17:31 +0200 Subject: [PATCH 135/258] Forget to call Reat.Children.forEach --- src/AbstractMenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AbstractMenu.js b/src/AbstractMenu.js index 86960db1..72e7e86d 100644 --- a/src/AbstractMenu.js +++ b/src/AbstractMenu.js @@ -65,7 +65,7 @@ export default class AbstractMenu extends Component { const childCollector = (child) => { if ([MenuItem, this.getSubMenuType()].indexOf(child.type) < 0) { // Maybe the MenuItem or SubMenu is capsuled in a wrapper div or something else - childCollector(child.props.children); + React.Children.forEach(child.props.children, childCollector); } else if (!child.props.divider) { children.push(child); } From 592ef5431547f96ae97c221665e28d4e347243c1 Mon Sep 17 00:00:00 2001 From: Vivek Kumar Bansal Date: Tue, 23 May 2017 19:23:35 +0530 Subject: [PATCH 136/258] Add who's using? --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index afc6e15c..3825442c 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,10 @@ see [usage docs](./docs/usage.md) / [examples](./examples) for more details. [ALL FAQs](./docs/faq.md) +## Who's using react-contextmenu? +- [react-data-grid](https://github.com/adazzle/react-data-grid) +- [teamup.com](https://teamup.com) + ## Contributors [All Contributors](https://github.com/vkbansal/react-contextmenu/graphs/contributors) From dbd83f7f675d718a9b0d6343ac6f67b97b3ad3c4 Mon Sep 17 00:00:00 2001 From: Vivek Kumar Bansal Date: Fri, 26 May 2017 12:41:42 +0530 Subject: [PATCH 137/258] 2.6.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f9bde3eb..05ddddae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-contextmenu", - "version": "2.6.0", + "version": "2.6.1", "description": "Context Menu implemented in React", "main": "modules/index.js", "module": "es6/index.js", From b0a6a79399ea65f81019ccd016ae978a106f763b Mon Sep 17 00:00:00 2001 From: Lange Paul Date: Sat, 27 May 2017 13:54:17 +0200 Subject: [PATCH 138/258] SubMenu opacity transition no longer flicker * If you used the SubMenu with an css transition of opacity, the SubMenu had possible rearranged during fade out. * Now every SubMenu have a default transition of 1ms, so that the transitionend will always trigger * You can override the transition-duration with css --- examples/react-contextmenu.css | 1 + src/SubMenu.js | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/examples/react-contextmenu.css b/examples/react-contextmenu.css index dc75bf8b..7ced9d17 100644 --- a/examples/react-contextmenu.css +++ b/examples/react-contextmenu.css @@ -12,6 +12,7 @@ outline: none; opacity: 0; pointer-events: none; + transition: opacity 250ms ease !important; } .react-contextmenu.react-contextmenu--visible { diff --git a/src/SubMenu.js b/src/SubMenu.js index e0878fd1..acdf6a06 100644 --- a/src/SubMenu.js +++ b/src/SubMenu.js @@ -78,12 +78,14 @@ export default class SubMenu extends AbstractMenu { this.setState({ selectedItem: null }); }); } else { + this.subMenu.addEventListener('transitionend', () => { + this.subMenu.style.removeProperty('bottom'); + this.subMenu.style.removeProperty('right'); + this.subMenu.style.top = 0; + this.subMenu.style.left = '100%'; + this.unregisterHandlers(); + }, { once: true }); this.subMenu.classList.remove(cssClasses.menuVisible); - this.subMenu.style.removeProperty('bottom'); - this.subMenu.style.removeProperty('right'); - this.subMenu.style.top = 0; - this.subMenu.style.left = '100%'; - this.unregisterHandlers(); } } @@ -212,6 +214,7 @@ export default class SubMenu extends AbstractMenu { ref: this.subMenuRef, style: { position: 'absolute', + transition: 'opacity 1ms', // trigger transitionend event top: 0, left: '100%' }, From 4a0438c26de93ade693f552e6d9c212b827e3811 Mon Sep 17 00:00:00 2001 From: Lange Paul Date: Sat, 27 May 2017 15:07:23 +0200 Subject: [PATCH 139/258] Use traditional removeEventListener instead of once: true --- src/SubMenu.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/SubMenu.js b/src/SubMenu.js index acdf6a06..31fa9b85 100644 --- a/src/SubMenu.js +++ b/src/SubMenu.js @@ -78,13 +78,15 @@ export default class SubMenu extends AbstractMenu { this.setState({ selectedItem: null }); }); } else { - this.subMenu.addEventListener('transitionend', () => { + const cleanup = () => { + this.subMenu.removeEventListener('transitionend', cleanup); this.subMenu.style.removeProperty('bottom'); this.subMenu.style.removeProperty('right'); this.subMenu.style.top = 0; this.subMenu.style.left = '100%'; this.unregisterHandlers(); - }, { once: true }); + }; + this.subMenu.addEventListener('transitionend', cleanup); this.subMenu.classList.remove(cssClasses.menuVisible); } } From 1f0d4927152f9505cafb81ef2c1a7cb74ff997e2 Mon Sep 17 00:00:00 2001 From: Lange Paul Date: Sat, 3 Jun 2017 09:26:06 +0200 Subject: [PATCH 140/258] Don't nullify non ReactElementSymbol childs #118 --- src/AbstractMenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AbstractMenu.js b/src/AbstractMenu.js index 72e7e86d..3cc82b61 100644 --- a/src/AbstractMenu.js +++ b/src/AbstractMenu.js @@ -102,7 +102,7 @@ export default class AbstractMenu extends Component { renderChildren = children => React.Children.map(children, (child) => { const props = {}; - if (!React.isValidElement(child)) return null; + if (!React.isValidElement(child)) return child; if ([MenuItem, this.getSubMenuType()].indexOf(child.type) < 0) { // Maybe the MenuItem or SubMenu is capsuled in a wrapper div or something else props.children = this.renderChildren(child.props.children); From 37b071bc0b3ec95df13ce10e6a9779b60eeadc01 Mon Sep 17 00:00:00 2001 From: Chen Bin Date: Tue, 6 Jun 2017 18:37:18 +1000 Subject: [PATCH 141/258] if `props.collect` returns Promise, resolve it before `showMenu` --- src/ContextMenuTrigger.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/ContextMenuTrigger.js b/src/ContextMenuTrigger.js index 56a5c3c7..bf897c38 100644 --- a/src/ContextMenuTrigger.js +++ b/src/ContextMenuTrigger.js @@ -97,12 +97,22 @@ export default class ContextMenuTrigger extends Component { hideMenu(); - showMenu({ + let data = callIfExists(this.props.collect, this.props); + let showMenuConfig = { position: { x, y }, target: this.elem, id: this.props.id, - data: callIfExists(this.props.collect, this.props) - }); + data + }; + if (data && (typeof data.then === 'function')) { + // it's promise + data.then((resp) => { + showMenuConfig.data = resp; + showMenu(showMenuConfig); + }); + } else { + showMenu(showMenuConfig); + } } elemRef = (c) => { From 63379f9ae182aaf3e8e2676087602cb874dd44c8 Mon Sep 17 00:00:00 2001 From: Vivek Kumar Bansal Date: Wed, 7 Jun 2017 17:15:37 +0530 Subject: [PATCH 142/258] 2.6.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 05ddddae..31cba4e6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-contextmenu", - "version": "2.6.1", + "version": "2.6.2", "description": "Context Menu implemented in React", "main": "modules/index.js", "module": "es6/index.js", From 9efb94e08d6c551b172402a726c599ae0e25ae5c Mon Sep 17 00:00:00 2001 From: Vivek Kumar Bansal Date: Sun, 18 Jun 2017 17:39:22 +0530 Subject: [PATCH 143/258] fix devDeps --- package.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 31cba4e6..0718caa1 100644 --- a/package.json +++ b/package.json @@ -57,11 +57,11 @@ "babel-preset-babili": "0.0.12", "babel-preset-env": "~1.4.0", "babel-preset-es2015": "~6.24.0", - "babel-preset-react": "^6.24.1", - "babel-preset-stage-2": "^6.24.1", + "babel-preset-react": "~6.24.1", + "babel-preset-stage-2": "~6.24.1", "babel-register": "~6.24.0", - "coveralls": "^2.13.1", - "cross-env": "~4.0.0", + "coveralls": "~2.13.1", + "cross-env": "~5.0.1", "enzyme": "~2.8.0", "enzyme-to-json": "~1.5.0", "eslint": "~3.19.0", @@ -70,8 +70,9 @@ "eslint-plugin-import": "~2.2.0", "eslint-plugin-react": "~7.0.0", "history": "~4.6.1", + "http-server": "~0.10.0", "jest": "~20.0.0", - "jsdom": "~10.1.0", + "jsdom": "~11.0.0", "prop-types": "~15.5.8", "react": "~15.5.4", "react-dom": "~15.5.4", From 098d0dc34278468198b512dd270bdce8b0814b95 Mon Sep 17 00:00:00 2001 From: Vivek Kumar Bansal Date: Sun, 18 Jun 2017 17:39:33 +0530 Subject: [PATCH 144/258] add lock file --- package-lock.json | 5357 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 5357 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..b74a1fd0 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5357 @@ +{ + "name": "react-contextmenu", + "version": "2.6.2", + "lockfileVersion": 1, + "dependencies": { + "@types/node": { + "version": "6.0.78", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.78.tgz", + "integrity": "sha512-+vD6E8ixntRzzZukoF3uP1iV+ZjVN3koTcaeK+BEoc/kSfGbLDIGC7RmCaUgVpUfN6cWvfczFRERCyKM9mkvXg==", + "dev": true + }, + "abab": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.3.tgz", + "integrity": "sha1-uB3l9ydOxOdW15fNg08wNkJyTl0=", + "dev": true + }, + "acorn": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.0.3.tgz", + "integrity": "sha1-xGDfCEkUY/AozLguqzcwvwEIez0=", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "dev": true, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "anymatch": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", + "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", + "dev": true + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true + }, + "arr-flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz", + "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-find": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz", + "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.5.tgz", + "integrity": "sha1-UidltQw1EEkOUtfc/ghe+bqWlY8=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "asn1.js": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", + "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", + "dev": true + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.4.1.tgz", + "integrity": "sha1-YqVrJ5yYoR0JhwlqAcw+6463u9c=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "babel-cli": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.24.1.tgz", + "integrity": "sha1-IHzXBbumFImy6kG1MSNBz2rKIoM=", + "dev": true + }, + "babel-code-frame": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", + "dev": true + }, + "babel-core": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.24.1.tgz", + "integrity": "sha1-jEKFZNzh4fQfszfsNPTDsCK1rYM=", + "dev": true + }, + "babel-eslint": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", + "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", + "dev": true + }, + "babel-generator": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", + "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", + "dev": true + }, + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "dev": true + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true + }, + "babel-helper-builder-react-jsx": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.24.1.tgz", + "integrity": "sha1-CteRfjPI11HmRtrKTnfMGTd9LLw=", + "dev": true + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true + }, + "babel-helper-define-map": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz", + "integrity": "sha1-epdH8ljYlH0y1RX2qhx70CIEoIA=", + "dev": true + }, + "babel-helper-evaluate-path": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.0.3.tgz", + "integrity": "sha1-HRA6ydSlnl1DGEIhLxUXhfesVHs=", + "dev": true + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "dev": true + }, + "babel-helper-flip-expressions": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.0.2.tgz", + "integrity": "sha1-e6ss9hFivJJwPpspjvUSvPd9Z4c=", + "dev": true + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true + }, + "babel-helper-is-nodes-equiv": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz", + "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=", + "dev": true + }, + "babel-helper-is-void-0": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.0.1.tgz", + "integrity": "sha1-7XRVO4g+aCJq5F+YmpmwLBkPEFo=", + "dev": true + }, + "babel-helper-mark-eval-scopes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.1.1.tgz", + "integrity": "sha1-RVQ0Xt+fJUlCe9IJjlMCU/ivKZI=", + "dev": true + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true + }, + "babel-helper-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", + "integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=", + "dev": true + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true + }, + "babel-helper-remove-or-void": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.1.1.tgz", + "integrity": "sha1-nX4YVtxvr8tBsoOkFnMNwYRPZtc=", + "dev": true + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true + }, + "babel-helper-to-multiple-sequence-expressions": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.0.4.tgz", + "integrity": "sha1-2UQUs4a2KG+6rXfwc96ps0MksBw=", + "dev": true + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true + }, + "babel-jest": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz", + "integrity": "sha1-5KA7E9wQOJ4UD8ZF0J/8TO0wFnE=", + "dev": true + }, + "babel-loader": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.0.0.tgz", + "integrity": "sha1-LkOma+4f/0RwUz0EAsikUy+vuvc=", + "dev": true + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true + }, + "babel-plugin-istanbul": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.4.tgz", + "integrity": "sha1-GN3oS/POMp/d8/QQP66SFFbY5Yc=", + "dev": true + }, + "babel-plugin-jest-hoist": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz", + "integrity": "sha1-r+3IU70/jcNUjqZx++adA8wsF2c=", + "dev": true + }, + "babel-plugin-minify-builtins": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.0.2.tgz", + "integrity": "sha1-875hIXY8DFGNXvggZ870thXJSYw=", + "dev": true + }, + "babel-plugin-minify-constant-folding": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.0.4.tgz", + "integrity": "sha1-tuIxAmpgNeiM6t0gYSjX2ytcFeY=", + "dev": true, + "dependencies": { + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "dev": true + } + } + }, + "babel-plugin-minify-dead-code-elimination": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.1.7.tgz", + "integrity": "sha1-d09TbzR7mDk6J7qnF4cpaIE8NCw=", + "dev": true + }, + "babel-plugin-minify-flip-comparisons": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.0.2.tgz", + "integrity": "sha1-fQlTqlh27eYRiWa9qe3sxjvzRqs=", + "dev": true + }, + "babel-plugin-minify-guarded-expressions": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.0.4.tgz", + "integrity": "sha1-lXEEp2Dmp//ZZwBaehFiG7Qv0Rw=", + "dev": true + }, + "babel-plugin-minify-infinity": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.0.3.tgz", + "integrity": "sha1-TMmbYdErQ0zoCtZ1EDM1xYnLqaE=", + "dev": true + }, + "babel-plugin-minify-mangle-names": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.0.8.tgz", + "integrity": "sha1-Hi/qhW3XQtVpeqJrQn5BJYqMW3k=", + "dev": true, + "dependencies": { + "babel-helper-mark-eval-scopes": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.0.3.tgz", + "integrity": "sha1-kC91rrU3M27cNeufUrbwnbd4Uyg=", + "dev": true + } + } + }, + "babel-plugin-minify-numeric-literals": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.0.1.tgz", + "integrity": "sha1-lZfmwxFU19rzdE0L1BfBRLJ1vVM=", + "dev": true + }, + "babel-plugin-minify-replace": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.0.1.tgz", + "integrity": "sha1-XVrqfLmJkkUkjR7pznov5Vao+sw=", + "dev": true + }, + "babel-plugin-minify-simplify": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.0.8.tgz", + "integrity": "sha1-WXsjMnu6Q3P+0cUUYaaJvOn/SXk=", + "dev": true + }, + "babel-plugin-minify-type-constructors": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.0.4.tgz", + "integrity": "sha1-Uti2I3dRB1IyJ3Ga3i0LdFh1i18=", + "dev": true + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", + "dev": true + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "dev": true + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", + "dev": true + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "dev": true + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "dev": true + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz", + "integrity": "sha1-dsKV3DpHQbFmWt/TFnIV3P8ypXY=", + "dev": true + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", + "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=", + "dev": true + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true + }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "dev": true + }, + "babel-plugin-transform-inline-consecutive-adds": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.0.2.tgz", + "integrity": "sha1-pY/Oz8CcCPv5NzpaPnB0bAPQH8E=", + "dev": true + }, + "babel-plugin-transform-member-expression-literals": { + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.8.4.tgz", + "integrity": "sha1-BWebxAWWuRKTQBlZqhYgqxsr5Dc=", + "dev": true + }, + "babel-plugin-transform-merge-sibling-variables": { + "version": "6.8.5", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.8.5.tgz", + "integrity": "sha1-A6vfEHxhJBkT6yaN3t5tW8VBhiw=", + "dev": true + }, + "babel-plugin-transform-minify-booleans": { + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.8.2.tgz", + "integrity": "sha1-hFFXn3BucCweGrJ1beXI6jac8Hw=", + "dev": true + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz", + "integrity": "sha1-h11ryb52HFiirj/u5dxIldjH+SE=", + "dev": true + }, + "babel-plugin-transform-property-literals": { + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.8.4.tgz", + "integrity": "sha1-atMREQuAoZKlbvtd30/jym96Ydo=", + "dev": true + }, + "babel-plugin-transform-react-display-name": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", + "dev": true + }, + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "dev": true + }, + "babel-plugin-transform-react-jsx-self": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", + "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", + "dev": true + }, + "babel-plugin-transform-react-jsx-source": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", + "dev": true + }, + "babel-plugin-transform-regenerator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", + "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=", + "dev": true + }, + "babel-plugin-transform-regexp-constructors": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.0.6.tgz", + "integrity": "sha1-DZJgfw0mJoKWmAy3wd6l8t0+HiA=", + "dev": true + }, + "babel-plugin-transform-remove-console": { + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.8.4.tgz", + "integrity": "sha1-Qf3awZpymkw91+8pZOrAewlvmo8=", + "dev": true + }, + "babel-plugin-transform-remove-debugger": { + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.8.4.tgz", + "integrity": "sha1-+FcEoIrapxtV13AFtblOm53yH24=", + "dev": true + }, + "babel-plugin-transform-remove-undefined": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.0.5.tgz", + "integrity": "sha1-Eu8RgF4G6GHdLrDHzAQdIYS49BA=", + "dev": true + }, + "babel-plugin-transform-simplify-comparison-operators": { + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.8.4.tgz", + "integrity": "sha1-KqJKJi1mTIyz4SWjBseY16LeCNU=", + "dev": true + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true + }, + "babel-plugin-transform-undefined-to-void": { + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.8.2.tgz", + "integrity": "sha1-/isdKU6wXodSTrk3JN6m4sPWb6E=", + "dev": true + }, + "babel-polyfill": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", + "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", + "dev": true + }, + "babel-preset-babili": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/babel-preset-babili/-/babel-preset-babili-0.0.12.tgz", + "integrity": "sha1-dNeSBdVP6uZHC8hCMdoLmsn8fek=", + "dev": true + }, + "babel-preset-env": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.4.0.tgz", + "integrity": "sha1-yOAqO8x3kvI83taOA1W51MKPD3o=", + "dev": true + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "dev": true + }, + "babel-preset-flow": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", + "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", + "dev": true + }, + "babel-preset-jest": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz", + "integrity": "sha1-y6yq3stdaJyh4d4TYOv8ZoYsF4o=", + "dev": true + }, + "babel-preset-react": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", + "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", + "dev": true + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "dev": true + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true + }, + "babel-register": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", + "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=", + "dev": true + }, + "babel-runtime": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true + }, + "babel-template": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", + "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", + "dev": true + }, + "babel-traverse": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", + "dev": true + }, + "babel-types": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", + "dev": true + }, + "babylon": { + "version": "6.17.3", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.3.tgz", + "integrity": "sha512-mq0x3HCAGGmQyZXviOVe5TRsw37Ijy3D43jCqt/9WVf+onx2dUgW3PosnqCbScAFhRO9DGs8nxoMzU0iiosMqQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz", + "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true + }, + "big.js": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", + "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=", + "dev": true + }, + "binary-extensions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz", + "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=", + "dev": true + }, + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-resolve": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "dev": true, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browserify-aes": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", + "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", + "dev": true + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "dev": true + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "dev": true + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "dev": true + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true + }, + "bser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "dev": true + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "caniuse-db": { + "version": "1.0.30000690", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000690.tgz", + "integrity": "sha1-7k4HUAcPaq5vQOdkd5hESb1stIo=", + "dev": true + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true + }, + "cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "dev": true + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true + }, + "ci-info": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.0.0.tgz", + "integrity": "sha1-3FKF8rTiUYIWg2gcOBwziPRuxTQ=", + "dev": true + }, + "cipher-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz", + "integrity": "sha1-7qvxlEGc6QDaMBjCB9IS8qbfCgc=", + "dev": true + }, + "circular-json": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz", + "integrity": "sha1-vos2rvzN6LPKeqLWr8B6NyQsDS0=", + "dev": true + }, + "classnames": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=" + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true + }, + "cli-width": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", + "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "dev": true + }, + "color-name": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.2.tgz", + "integrity": "sha1-XIq3K2S9IhXWF66VWeuxSEdc+Y0=", + "dev": true + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-type-parser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.1.tgz", + "integrity": "sha1-w+VpiMU8ZRJ/tG1AMqOpACRv3JQ=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "dev": true + }, + "core-js": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=", + "dev": true + }, + "coveralls": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.1.tgz", + "integrity": "sha1-1wu5rMGDXsTwY/+drFQjwXsR8Xg=", + "dev": true, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "dev": true + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "dev": true + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "dev": true + }, + "cross-env": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.0.1.tgz", + "integrity": "sha1-/05y6kO0faJIa0On8gQ7JgnkSRM=", + "dev": true + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true + }, + "crypto-browserify": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.0.tgz", + "integrity": "sha1-NlKgkGq5sqfgw85mpAjpV6JIVSI=", + "dev": true + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true + }, + "cssom": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", + "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", + "dev": true + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "dev": true + }, + "doctrine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "dev": true + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "dev": true + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", + "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "dev": true + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true + }, + "ecstatic": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ecstatic/-/ecstatic-2.2.1.tgz", + "integrity": "sha512-ztE4WqheoWLh3wv+HQwy7dACnvNY620coWpa+XqY6R2cVWgaAT2lUISU1Uf7JpdLLJCURktJOaA9av2AOzsyYQ==", + "dev": true, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "electron-to-chromium": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.14.tgz", + "integrity": "sha1-ZK8Pnv08PGrNV9cfg7Scp+6cS0M=", + "dev": true + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true + }, + "enhanced-resolve": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", + "dev": true + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "enzyme": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-2.8.2.tgz", + "integrity": "sha1-bIvLBQEqvEqkvDIT+yN4C5tbFxQ=", + "dev": true, + "dependencies": { + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true + } + } + }, + "enzyme-to-json": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-1.5.1.tgz", + "integrity": "sha1-409NEmuz9Gls44ALUfntg99wh5k=", + "dev": true + }, + "errno": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "dev": true + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true + }, + "es-abstract": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.7.0.tgz", + "integrity": "sha1-363ndOAb/Nl/lhgCmMRJyGI/uUw=", + "dev": true + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true + }, + "es5-ext": { + "version": "0.10.23", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.23.tgz", + "integrity": "sha1-dXi1G+l0IHpUh4IbVlOMIk5Oezg=", + "dev": true + }, + "es6-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "dev": true + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "dependencies": { + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true + } + } + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true + }, + "eslint": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "dev": true, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true + } + } + }, + "eslint-config-vkbansal": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-vkbansal/-/eslint-config-vkbansal-5.2.1.tgz", + "integrity": "sha1-AoJLf+SR7aE2A6Rid2iAimmeHKI=", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", + "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", + "dev": true + }, + "eslint-import-resolver-webpack": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.8.1.tgz", + "integrity": "sha1-x/i01b08W0iUV+VyjF2xxP+6yao=", + "dev": true + }, + "eslint-module-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.0.0.tgz", + "integrity": "sha1-pvjCHZATWHWc3DXbrBmCrh7li84=", + "dev": true, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", + "integrity": "sha1-crowb60wXWfEgWNIpGmaQimsi04=", + "dev": true, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true + } + } + }, + "eslint-plugin-react": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.0.1.tgz", + "integrity": "sha1-54EH4eVZxuKxd4a7Z8LioBCtDS8=", + "dev": true + }, + "espree": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.4.3.tgz", + "integrity": "sha1-KRC1zNSc6JPC//+qtP2LOjG4I3Q=", + "dev": true + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true + }, + "esrecurse": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.1.0.tgz", + "integrity": "sha1-RxO2U2rffyrE8yfVWed1a/9kgiA=", + "dev": true, + "dependencies": { + "estraverse": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz", + "integrity": "sha1-9srKcokzqFDvkGYdDheYK6RxEaI=", + "dev": true + } + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", + "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=", + "dev": true + }, + "exec-sh": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.0.tgz", + "integrity": "sha1-FPdd4/INKG75MwmbLOUKkDWc7xA=", + "dev": true + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true + }, + "fbjs": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.12.tgz", + "integrity": "sha1-ELXZL3bUVXX9Y6IX1OoCvqL47QQ=", + "dev": true, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", + "dev": true + } + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true + }, + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true + }, + "find-root": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-0.1.2.tgz", + "integrity": "sha1-mNImfP8ZFsyvJ0OzoO6oHXnX3NE=", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true + }, + "flat-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", + "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true + }, + "fs-readdir-recursive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz", + "integrity": "sha1-jNF0XItPiinIyuw5JHaSG6GV9WA=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", + "dev": true, + "optional": true, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "optional": true + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.36", + "bundled": true, + "dev": true, + "optional": true + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "optional": true + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", + "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", + "dev": true + }, + "function.prototype.name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.0.0.tgz", + "integrity": "sha1-X1I8pk5JGl+Vq6gMweORCAoUSC4=", + "dev": true + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handlebars": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", + "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", + "dev": true, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true + } + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "dev": true + }, + "hash.js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz", + "integrity": "sha1-EzL/ABVsCg/92CNgE9B7d6BFFXM=", + "dev": true + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "history": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/history/-/history-4.6.2.tgz", + "integrity": "sha1-cW6GPh2g6XoCju1tpkQGHdHh7R0=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "hoist-non-react-statics": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", + "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=", + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true + }, + "hosted-git-info": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz", + "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz", + "integrity": "sha1-eb96eF6klf5mFl5zQVPzY/9UN9o=", + "dev": true + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true + }, + "http-proxy": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "dev": true + }, + "http-server": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-0.10.0.tgz", + "integrity": "sha1-sqRGsWqduH7TxiK6m+sbCFsSNKc=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true + }, + "https-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", + "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==", + "dev": true + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "dev": true + }, + "ignore": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", + "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true + }, + "interpret": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", + "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-absolute": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", + "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", + "dev": true, + "dependencies": { + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", + "dev": true + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-ci": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", + "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true + }, + "is-my-json-valid": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", + "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true + }, + "is-relative": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", + "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", + "dev": true + }, + "is-resolvable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", + "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz", + "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-api": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.1.9.tgz", + "integrity": "sha512-zV14oa+hjBNP3gJTM/BzNdJpInHKbZ9cLIEwVasuaTUA1ebF9TBOIfcC5SDAE3C11rXxOw3KSimKGMiFz6PpWQ==", + "dev": true, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "js-yaml": { + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.4.tgz", + "integrity": "sha1-UgtFZPhlc7qWZir4Woyvp7S1pvY=", + "dev": true + } + } + }, + "istanbul-lib-coverage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", + "integrity": "sha512-3U2HB9y1ZV9UmFlE12Fx+nPtFqIymzrqCksrXujm3NVbAZIJg/RfYgO1XiIa0mbmxTjWpVEVlkIZJ25xVIAfkQ==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.2.tgz", + "integrity": "sha512-lPgUY+Pa5dlq2/l0qs1PJZ54QPSfo+s4+UZdkb2d0hbOyrEIAbUJphBLFjEyXBdeCONgGRADFzs3ojfFtmuwFA==", + "dev": true + }, + "istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha512-tvF+YmCmH4thnez6JFX06ujIA19WPa9YUiwjc1uALF2cv5dmE3It8b5I8Ob7FHJ70H9Y5yF+TDkVa/mcADuw1Q==", + "dev": true, + "dependencies": { + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", + "integrity": "sha512-mukVvSXCn9JQvdJl8wP/iPhqig0MRtuWuD4ZNKo6vB2Ik//AmhAKe3QnPN02dmkRe3lTudFk3rzoHhwU4hb94w==", + "dev": true + }, + "istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-P8G873A0kW24XRlxHVGhMJBhQ8gWAec+dae7ZxOBzxT4w+a9ATSPvRVK3LB1RAJ9S8bg2tOyWHAGW40Zd2dKfw==", + "dev": true + }, + "jest": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-20.0.4.tgz", + "integrity": "sha1-PdJgwpidba1nix6cxNkZRPbWAqw=", + "dev": true, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "jest-cli": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-20.0.4.tgz", + "integrity": "sha1-5TKxnYiuW8bEF+iwWTpv6VSx3JM=", + "dev": true + } + } + }, + "jest-changed-files": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-20.0.3.tgz", + "integrity": "sha1-k5TVzGXEOEBhSb7xv01Sto4D4/g=", + "dev": true + }, + "jest-config": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.4.tgz", + "integrity": "sha1-43kwqyIXyRNgXv8T5712PsSPruo=", + "dev": true + }, + "jest-diff": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", + "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=", + "dev": true + }, + "jest-docblock": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-20.0.3.tgz", + "integrity": "sha1-F76phDQswz2DxQ++FUXqDvqkRxI=", + "dev": true + }, + "jest-environment-jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz", + "integrity": "sha1-BIqKwS7iJfcZBBdxODS7mZeH3pk=", + "dev": true, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + }, + "jsdom": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", + "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", + "dev": true + } + } + }, + "jest-environment-node": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-20.0.3.tgz", + "integrity": "sha1-1Ii8RhKvLCRumG6K52caCZFj1AM=", + "dev": true + }, + "jest-haste-map": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-20.0.4.tgz", + "integrity": "sha1-ZT61XIic48Ah97lGk/IKQVm63wM=", + "dev": true + }, + "jest-jasmine2": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz", + "integrity": "sha1-/MWxQReA2RHQQpAu8YWehS5g1eE=", + "dev": true + }, + "jest-matcher-utils": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", + "integrity": "sha1-s6a443yld4A7CDKpixZPRLeBVhI=", + "dev": true + }, + "jest-matchers": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-20.0.3.tgz", + "integrity": "sha1-ymnbHDLbWm9wf6XgQBq7VXAN/WA=", + "dev": true + }, + "jest-message-util": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", + "integrity": "sha1-auwoRDBvyw5udNV5bBAG2W/dgxw=", + "dev": true + }, + "jest-mock": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-20.0.3.tgz", + "integrity": "sha1-i8Bw6QQUqhVcEajWTIaaDVxx2lk=", + "dev": true + }, + "jest-regex-util": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz", + "integrity": "sha1-hburXRM+RGJbGfr4xqpRItCF12I=", + "dev": true + }, + "jest-resolve": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.4.tgz", + "integrity": "sha1-lEiz6La6/BVHlETGSZBFt//ll6U=", + "dev": true + }, + "jest-resolve-dependencies": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz", + "integrity": "sha1-bhSntxevDyyzZnxUneQK8Bexcjo=", + "dev": true + }, + "jest-runtime": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-20.0.4.tgz", + "integrity": "sha1-osgCIZxCA/dU3xQE5JAYYWnRJNg=", + "dev": true, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "jest-snapshot": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz", + "integrity": "sha1-W4R+GtsaTZCFKn+fElCG4YfHZWY=", + "dev": true + }, + "jest-util": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", + "integrity": "sha1-DAf32A2C9OWmfG+LnD/n9lz9Mq0=", + "dev": true + }, + "jest-validate": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz", + "integrity": "sha1-0M/R3k9XnymEhJJcKA+PHZTsPKs=", + "dev": true + }, + "js-tokens": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", + "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=", + "dev": true + }, + "js-yaml": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsdom": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.0.0.tgz", + "integrity": "sha1-HuUHyywLFsh1ACR2sahVfZUTU+U=", + "dev": true, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + }, + "parse5": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.2.tgz", + "integrity": "sha1-Be/1fw70V3+xRKefi5qWemzERRA=", + "dev": true + } + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-loader": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.4.tgz", + "integrity": "sha1-i6oTZaYy9Yo8RtIBdfxgAsluN94=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsprim": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "dev": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "jsx-ast-utils": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", + "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true + }, + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "lodash._baseget": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/lodash._baseget/-/lodash._baseget-3.7.2.tgz", + "integrity": "sha1-G2rh1frPPCVTI1ChPBGXy4u2dPQ=", + "dev": true + }, + "lodash._topath": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/lodash._topath/-/lodash._topath-3.8.1.tgz", + "integrity": "sha1-PsXiYGAU9MuX91X+aRTt2L/ADqw=", + "dev": true + }, + "lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", + "dev": true + }, + "lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=", + "dev": true + }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=", + "dev": true + }, + "lodash.get": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-3.7.0.tgz", + "integrity": "sha1-POaK4skWg7KBzFOUEoMDy/deaR8=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", + "integrity": "sha1-aYhLoUSsM/5plzemCG3v+t0PicU=", + "dev": true + }, + "lodash.omitby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.omitby/-/lodash.omitby-4.6.0.tgz", + "integrity": "sha1-XBX/R1StVVAWtTwEExHo8HkgR5E=", + "dev": true + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", + "dev": true + }, + "lodash.range": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.range/-/lodash.range-3.2.0.tgz", + "integrity": "sha1-9GHliPZmg/fq3q3lE+OKaaVloV0=", + "dev": true + }, + "lodash.reduce": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", + "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=", + "dev": true + }, + "lodash.reject": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", + "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=", + "dev": true + }, + "lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", + "dev": true + }, + "log-driver": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", + "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true + }, + "memory-fs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", + "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=", + "dev": true + }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true + }, + "miller-rabin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", + "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", + "dev": true + }, + "mime": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", + "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=", + "dev": true + }, + "mime-db": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + }, + "nan": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", + "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=", + "dev": true, + "optional": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node-fetch": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz", + "integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-libs-browser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-1.1.1.tgz", + "integrity": "sha1-KjgkOr7dff/NB6l8mspWaJdab+o=", + "dev": true, + "dependencies": { + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "node-notifier": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.1.2.tgz", + "integrity": "sha1-L6nhJgX6EACdRFSdb82KY93g5P8=", + "dev": true + }, + "normalize-package-data": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz", + "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=", + "dev": true + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwmatcher": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.0.tgz", + "integrity": "sha1-tDiTYhcOfvl5jDx3FtgOvAEG/M8=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object-values/-/object-values-1.0.0.tgz", + "integrity": "sha1-cq+DljARnluYw7AruMJ+MjcVgQU=", + "dev": true + }, + "object.assign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", + "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", + "dev": true + }, + "object.entries": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", + "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true + }, + "object.values": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", + "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "opener": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz", + "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=", + "dev": true + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true + }, + "os-browserify": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", + "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "output-file-sync": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", + "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", + "dev": true + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true + }, + "p-map": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.1.1.tgz", + "integrity": "sha1-BfXkrpegaDcbwqXMhr+9vBnErno=", + "dev": true + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true + }, + "parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz", + "integrity": "sha1-vjZ4XFBn6kjYBv+SMojF91C2uKI=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true + } + } + }, + "pkg-up": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", + "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", + "dev": true, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true + } + } + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "pn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.0.0.tgz", + "integrity": "sha1-HPWjCw2AbNGPiPxBprXUrWFbO6k=", + "dev": true + }, + "portfinder": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", + "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", + "dev": true, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-format": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", + "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", + "dev": true, + "dependencies": { + "ansi-styles": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz", + "integrity": "sha1-CcIC1ckX7CMYjKpcnLkXnNlUd1A=", + "dev": true + } + } + }, + "private": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", + "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "promise": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.0.tgz", + "integrity": "sha512-bzAZ0u9Kxa0FYyfISjr9/PK7sCclAzc5rP4UgynMWA2Qv/gpZLKynJmTEXYq2i/giYdjBfRONDhfbsMlGIgvjA==", + "dev": true + }, + "prop-types": { + "version": "15.5.10", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", + "integrity": "sha1-J5ffwxJhguOpXj37suiT3ddFYVQ=", + "dev": true + }, + "prr": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true + } + } + }, + "randombytes": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", + "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "dev": true, + "dependencies": { + "safe-buffer": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.0.tgz", + "integrity": "sha512-aSLEDudu6OoRr/2rU609gRmnYboRLxgDG1z9o2Q0os7236FwvcqIOO8r8U5JUEwivZOhDaKlFO4SbPTJYyBEyQ==", + "dev": true + } + } + }, + "react": { + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/react/-/react-15.5.4.tgz", + "integrity": "sha1-+oPrAVBqsjfNwcjDsc6o3gEr8Ec=", + "dev": true + }, + "react-dom": { + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.5.4.tgz", + "integrity": "sha1-ugwoeG/VLtfk8hNf4CiNRirvk9o=", + "dev": true + }, + "react-router": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.1.1.tgz", + "integrity": "sha1-1Ejzt8G0Kab7sDOVCZlJxgax/pU=", + "dev": true + }, + "react-router-dom": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.1.1.tgz", + "integrity": "sha1-MCGt4fLBYK+Xz5TiVZTF8pRYMCU=", + "dev": true + }, + "react-test-renderer": { + "version": "15.5.4", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-15.5.4.tgz", + "integrity": "sha1-1OuyP2E9aF6o9TkBCcLSD798g7w=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.11.tgz", + "integrity": "sha512-h+8+r3MKEhkiVrwdKL8aWs1oc1VvBu33ueshOvS26RsZQ3Amhx/oO3TKe4lApSV9ueY6as8EAh7mtuFjdlhg9Q==", + "dev": true + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true + }, + "regenerate": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", + "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", + "dev": true + }, + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "dev": true + }, + "regenerator-transform": { + "version": "0.9.11", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz", + "integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=", + "dev": true + }, + "regex-cache": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", + "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", + "dev": true + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", + "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true + }, + "request-promise-core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", + "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "dev": true + }, + "request-promise-native": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.4.tgz", + "integrity": "sha1-hpiOyO7kCORVefzoO/0Fs635oVU=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", + "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", + "dev": true + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "resolve-pathname": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.1.0.tgz", + "integrity": "sha1-6DWIAbhrg7F1YNTjw4LXrvIQCUQ=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "dev": true + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "safe-buffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", + "dev": true + }, + "sane": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-1.6.0.tgz", + "integrity": "sha1-lhDEUjB6E10pwf3+JUcDQYDEZ3U=", + "dev": true, + "dependencies": { + "bser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", + "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=", + "dev": true + }, + "fb-watchman": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", + "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "sax": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.2.tgz", + "integrity": "sha1-/YYxojvHgmvvXYcb24c3jJVkeCg=", + "dev": true + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", + "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true + }, + "shellwords": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.0.tgz", + "integrity": "sha1-Zq/Ue2oSky2Qccv9mKUueFzQuhQ=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true + }, + "source-list-map": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-1.1.2.tgz", + "integrity": "sha1-mIkBnRAkzOVc3AaUmDN+9hhqEaE=", + "dev": true + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "source-map-support": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", + "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", + "dev": true + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true + }, + "stream-http": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "dev": true + }, + "string_decoder": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.2.tgz", + "integrity": "sha1-sp4fThEl+pehA4K4pTNze3SR4Xk=", + "dev": true + }, + "string-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", + "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", + "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", + "dev": true + } + } + }, + "tapable": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", + "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=", + "dev": true + }, + "test-exclude": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz", + "integrity": "sha512-35+Asrsk3XHJDBgf/VRFexPgh3UyETv8IAn/LRTiZjVy6rjPVqdEk8dJcJYBzl1w0XCJM48lvTy8SfEsCWS4nA==", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "throat": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", + "integrity": "sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "dev": true + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "dev": true + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.12", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.12.tgz", + "integrity": "sha1-BMgamb3V3FImPqKdJMa/jUgYpLs=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "dependencies": { + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "union": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/union/-/union-0.4.6.tgz", + "integrity": "sha1-GY+9rrolTniLDvy2MLwR8kopWeA=", + "dev": true, + "dependencies": { + "qs": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", + "integrity": "sha1-6eha2+ddoLvkyOBHaghikPhjtAQ=", + "dev": true + } + } + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-join": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.2.tgz", + "integrity": "sha1-wHJ1aWetJLi1nldBVRyqx49QuLc=", + "dev": true + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true + }, + "value-equal": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.2.1.tgz", + "integrity": "sha1-wiCjBDYfzmmU277ao8fhobiVhx0=", + "dev": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "dev": true + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true + }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "dev": true + }, + "watch": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", + "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=", + "dev": true + }, + "watchpack": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.3.1.tgz", + "integrity": "sha1-fYaTkHsozmAT5/NhCqKhrPB9rYc=", + "dev": true + }, + "webidl-conversions": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.1.tgz", + "integrity": "sha1-gBWherg+fhsxFjhIas6B2mziBqA=", + "dev": true + }, + "webpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-2.5.1.tgz", + "integrity": "sha1-YXQvDPivVVuHRgqc2Lui8ePuL84=", + "dev": true, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true + }, + "enhanced-resolve": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.1.0.tgz", + "integrity": "sha1-n0tib1dyRe3PSyrYPYbhf09CHew=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true + }, + "node-libs-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", + "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true + }, + "tapable": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.6.tgz", + "integrity": "sha1-IGvo4YiGC1FEJTdebxrom/sB/Y0=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.2.tgz", + "integrity": "sha1-q0iDz1l9zVCvIRNJoA+8pWrIa4Y=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true + } + } + }, + "webpack-sources": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.2.3.tgz", + "integrity": "sha1-F8Yr+vE8cH+dAsR54Nzd6DgGl/s=", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz", + "integrity": "sha1-PGxFGhmO567FWx7GHQkgxngBpfQ=", + "dev": true, + "dependencies": { + "iconv-lite": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", + "dev": true + } + } + }, + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=", + "dev": true + }, + "whatwg-url": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", + "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", + "dev": true, + "dependencies": { + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + } + } + }, + "which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "dev": true + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "worker-farm": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.3.1.tgz", + "integrity": "sha1-QzMRK7SbF6oFC4eJXKayys9A5f8=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true + }, + "xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + } + } +} From 9ae47c9e7ac67c7277579abcd20802d7ddcdf14b Mon Sep 17 00:00:00 2001 From: Vivek Kumar Bansal Date: Sun, 18 Jun 2017 17:45:07 +0530 Subject: [PATCH 145/258] add some checks --- src/ContextMenu.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ContextMenu.js b/src/ContextMenu.js index b80ad56e..5a3d24e5 100644 --- a/src/ContextMenu.js +++ b/src/ContextMenu.js @@ -58,6 +58,7 @@ export default class ContextMenu extends AbstractMenu { const { top, left } = this.getMenuPosition(x, y); wrapper(() => { + if (!this.menu) return; this.menu.style.top = `${top}px`; this.menu.style.left = `${left}px`; this.menu.style.opacity = 1; @@ -65,6 +66,7 @@ export default class ContextMenu extends AbstractMenu { }); }); } else { + if (!this.menu) return; this.menu.style.opacity = 0; this.menu.style.pointerEvents = 'none'; } @@ -145,13 +147,16 @@ export default class ContextMenu extends AbstractMenu { } getMenuPosition = (x = 0, y = 0) => { - const { innerWidth, innerHeight } = window; - const rect = this.menu.getBoundingClientRect(); - const menuStyles = { + let menuStyles = { top: y, left: x }; + if (!this.menu) return menuStyles; + + const { innerWidth, innerHeight } = window; + const rect = this.menu.getBoundingClientRect(); + if (y + rect.height > innerHeight) { menuStyles.top -= rect.height; } From 57be960f7c2e8086f6b139f60e297c3d779f0940 Mon Sep 17 00:00:00 2001 From: Vivek Kumar Bansal Date: Sun, 18 Jun 2017 17:46:00 +0530 Subject: [PATCH 146/258] 2.6.3 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index b74a1fd0..b1234fc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "react-contextmenu", - "version": "2.6.2", + "version": "2.6.3", "lockfileVersion": 1, "dependencies": { "@types/node": { diff --git a/package.json b/package.json index 0718caa1..336cc03c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-contextmenu", - "version": "2.6.2", + "version": "2.6.3", "description": "Context Menu implemented in React", "main": "modules/index.js", "module": "es6/index.js", From 6c85ee08bb5090ee1b169d8abcac0ba01bc0377c Mon Sep 17 00:00:00 2001 From: faiwer Date: Sun, 25 Jun 2017 19:44:49 +0600 Subject: [PATCH 147/258] Fix css-link --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index 1e522aaa..9f2c094e 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -58,4 +58,4 @@ The styling can be apllied to using following classes. - `react-contextmenu-wrapper` : applied to wrapper around elements in `ContextMenuTrigger`. - `react-contextmenu-submenu` : applied to items that are submenus. -> Note: This package does note include any styling by default. You can use [react-contextmenu.css](./examples/react-contextmenu.css) from examples for quick setup. +> Note: This package does note include any styling by default. You can use [react-contextmenu.css](https://github.com/vkbansal/react-contextmenu/blob/master/examples/react-contextmenu.css) from examples for quick setup. From 21310e7bef0900a8d7f62c862ae20f8f5b997c9b Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 29 Jun 2017 12:35:41 +0200 Subject: [PATCH 148/258] Fix keyboard handling issues (#127) * Fix keyboard handling issues * Fix up conditional * Remove trailing spaces --- src/AbstractMenu.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/AbstractMenu.js b/src/AbstractMenu.js index 3cc82b61..7e4fe645 100644 --- a/src/AbstractMenu.js +++ b/src/AbstractMenu.js @@ -19,6 +19,10 @@ export default class AbstractMenu extends Component { } handleKeyNavigation = (e) => { + if (!this.state.isVisible) { + return; + } + switch (e.keyCode) { case 37: // left arrow case 27: // escape @@ -63,6 +67,12 @@ export default class AbstractMenu extends Component { const { selectedItem } = this.state; const children = []; const childCollector = (child) => { + // child can be empty in case you do conditional rendering of components, in which + // case it should not be accounted for as a real child + if (!child) { + return; + } + if ([MenuItem, this.getSubMenuType()].indexOf(child.type) < 0) { // Maybe the MenuItem or SubMenu is capsuled in a wrapper div or something else React.Children.forEach(child.props.children, childCollector); From 05579d8b54ecdb7b7836c4448e4b49397bd31cfc Mon Sep 17 00:00:00 2001 From: Vivek Kumar Bansal Date: Mon, 17 Jul 2017 17:25:32 +0530 Subject: [PATCH 149/258] 2.6.4 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index b1234fc1..a030d217 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "react-contextmenu", - "version": "2.6.3", + "version": "2.6.4", "lockfileVersion": 1, "dependencies": { "@types/node": { diff --git a/package.json b/package.json index 336cc03c..4eec9670 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-contextmenu", - "version": "2.6.3", + "version": "2.6.4", "description": "Context Menu implemented in React", "main": "modules/index.js", "module": "es6/index.js", From 3cedfa6b19a853c253cb809c5883de8afed8d3ae Mon Sep 17 00:00:00 2001 From: Vivek Kumar Bansal Date: Tue, 18 Jul 2017 08:33:34 +0530 Subject: [PATCH 150/258] Add nested example --- examples/Nested.js | 56 ++++++++++++++++++++++++++++++++++++++++++++++ examples/index.js | 7 ++++++ 2 files changed, 63 insertions(+) create mode 100644 examples/Nested.js diff --git a/examples/Nested.js b/examples/Nested.js new file mode 100644 index 00000000..3ba0e61b --- /dev/null +++ b/examples/Nested.js @@ -0,0 +1,56 @@ +import React, { Component } from 'react'; + +import ContextMenuTrigger from 'src/ContextMenuTrigger'; +import ContextMenu from 'src/ContextMenu'; +import MenuItem from 'src/MenuItem'; + +const MENU_TYPE = 'SIMPLE22'; +const MENU_TYPE2 = 'SIMPLE222'; + +export default class SimpleMenu extends Component { + constructor(props) { + super(props); + + this.state = { logs: [] }; + } + + handleClick = (e, data) => { + this.setState(({ logs }) => ({ + logs: [`Clicked on menu ${data.item}`, ...logs] + })); + } + + render() { + return ( +
+

Test Menu

+

This demo simple usage of a context menu.

+ +
+ right click to see the menu + +
+ right click to see the nested menu +
+
+
+
+
+ {this.state.logs.map((log, i) =>

{log}

)} +
+ + Menu Item 1 + Menu Item 2 + + Menu Item 3 + + + Nested Menu Item 1 + Nested Menu Item 2 + + Nested Menu Item 3 + +
+ ); + } +} diff --git a/examples/index.js b/examples/index.js index 83f43af1..5464c1e3 100644 --- a/examples/index.js +++ b/examples/index.js @@ -9,6 +9,7 @@ import SubMenus from './SubMenus'; import DynamicMenu from './DynamicMenu'; import Customization from './Customization'; import RTLSubMenu from './RTLSubMenu'; +import Nested from './Nested'; const commonProps = { className: 'pure-menu-link', @@ -55,6 +56,11 @@ function App() { Right-to-Left +
  • + + Nested + +
  • @@ -65,6 +71,7 @@ function App() { + ); From 9ea8dc04c89e398ac41e74e4104786efd13f943e Mon Sep 17 00:00:00 2001 From: Vivek Kumar Bansal Date: Tue, 18 Jul 2017 08:35:37 +0530 Subject: [PATCH 151/258] update dev deps --- package.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 4eec9670..1def26f1 100644 --- a/package.json +++ b/package.json @@ -50,19 +50,19 @@ }, "devDependencies": { "babel-cli": "~6.24.0", - "babel-core": "~6.24.0", + "babel-core": "^6.25.0", "babel-eslint": "~7.2.1", "babel-jest": "~20.0.0", - "babel-loader": "~7.0.0", + "babel-loader": "^7.1.1", "babel-preset-babili": "0.0.12", - "babel-preset-env": "~1.4.0", + "babel-preset-env": "^1.6.0", "babel-preset-es2015": "~6.24.0", "babel-preset-react": "~6.24.1", "babel-preset-stage-2": "~6.24.1", "babel-register": "~6.24.0", "coveralls": "~2.13.1", "cross-env": "~5.0.1", - "enzyme": "~2.8.0", + "enzyme": "^2.9.1", "enzyme-to-json": "~1.5.0", "eslint": "~3.19.0", "eslint-config-vkbansal": "~5.2.1", @@ -72,12 +72,12 @@ "history": "~4.6.1", "http-server": "~0.10.0", "jest": "~20.0.0", - "jsdom": "~11.0.0", + "jsdom": "^11.1.0", "prop-types": "~15.5.8", - "react": "~15.5.4", - "react-dom": "~15.5.4", + "react": "^15.6.1", + "react-dom": "^15.6.1", "react-router-dom": "~4.1.1", - "react-test-renderer": "~15.5.4", + "react-test-renderer": "^15.6.1", "rimraf": "~2.6.1", "webpack": "~2.5.1" }, From 12fa984e7b670a6092a7f3ced7090d7ae2c99a93 Mon Sep 17 00:00:00 2001 From: Vivek Kumar Bansal Date: Tue, 18 Jul 2017 08:37:42 +0530 Subject: [PATCH 152/258] change ^ to ~ --- package.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 1def26f1..833d3cd0 100644 --- a/package.json +++ b/package.json @@ -50,19 +50,19 @@ }, "devDependencies": { "babel-cli": "~6.24.0", - "babel-core": "^6.25.0", + "babel-core": "~6.25.0", "babel-eslint": "~7.2.1", "babel-jest": "~20.0.0", - "babel-loader": "^7.1.1", + "babel-loader": "~7.1.1", "babel-preset-babili": "0.0.12", - "babel-preset-env": "^1.6.0", + "babel-preset-env": "~1.6.0", "babel-preset-es2015": "~6.24.0", "babel-preset-react": "~6.24.1", "babel-preset-stage-2": "~6.24.1", "babel-register": "~6.24.0", "coveralls": "~2.13.1", "cross-env": "~5.0.1", - "enzyme": "^2.9.1", + "enzyme": "~2.9.1", "enzyme-to-json": "~1.5.0", "eslint": "~3.19.0", "eslint-config-vkbansal": "~5.2.1", @@ -72,12 +72,12 @@ "history": "~4.6.1", "http-server": "~0.10.0", "jest": "~20.0.0", - "jsdom": "^11.1.0", + "jsdom": "~11.1.0", "prop-types": "~15.5.8", - "react": "^15.6.1", - "react-dom": "^15.6.1", + "react": "~15.6.1", + "react-dom": "~15.6.1", "react-router-dom": "~4.1.1", - "react-test-renderer": "^15.6.1", + "react-test-renderer": "~15.6.1", "rimraf": "~2.6.1", "webpack": "~2.5.1" }, From aeedd540ea2480599314d16a95cfcbc7b552e160 Mon Sep 17 00:00:00 2001 From: Vivek Kumar Bansal Date: Tue, 18 Jul 2017 09:05:34 +0530 Subject: [PATCH 153/258] Update build process --- .gitignore | 1 - .travis/deploy.sh | 6 +----- examples.config.js | 29 ++++++++++++++++++++++++++--- examples/index.html | 2 -- examples/index.js | 2 ++ package.json | 8 ++++++-- 6 files changed, 35 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 545f9e9a..15ea97f1 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,5 @@ modules/ es6/ coverage/ .vscode -bundle.js *.log *.js.map diff --git a/.travis/deploy.sh b/.travis/deploy.sh index 73312c8f..53360a1b 100644 --- a/.travis/deploy.sh +++ b/.travis/deploy.sh @@ -11,13 +11,9 @@ set -o errexit # reset public dir rm -rf public -mkdir public # copy required files -cp ./examples/index.html ./public/index.html -cp ./examples/react-contextmenu.css ./public/react-contextmenu.css -npm run build:examples && cp ./examples/bundle.js ./public/bundle.js - +npm run build:examples cd public git init diff --git a/examples.config.js b/examples.config.js index e784fa7c..fdb30de3 100644 --- a/examples.config.js +++ b/examples.config.js @@ -2,15 +2,19 @@ const webpack = require('webpack'); const path = require('path'); +const Extract = require('extract-text-webpack-plugin'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); const PROD = process.env.NODE_ENV === 'production'; +const DEV = !PROD; const config = { entry: ["./examples/index.js"], output: { - filename: "bundle.js", - path: path.resolve(__dirname, "./examples"), + filename: DEV ? "bundle.js" : "bundle.[hash].js", + path: path.resolve(__dirname, "./public"), publicPath: "/", + hashDigestLength: 6, sourceMapFilename: "bundle.js.map" }, resolve: { @@ -45,10 +49,29 @@ const config = { path.resolve(__dirname, './src'), path.resolve(__dirname, './examples') ] + }, + { + test: /\.css$/, + use: Extract.extract({ + fallback: 'style-loader', + use: [{ + loader: 'css-loader' + }] + }), } ] }, - plugins: [] + plugins: [ + new Extract({ + filename: DEV ? 'styles.css' : 'styles.[contenthash:6].css', + allChunks: true + }), + new HtmlWebpackPlugin({ + template: 'examples/index.html', + inject: true, + filename: 'index.html' + }) + ] }; !PROD && (config.devtool = "source-map"); diff --git a/examples/index.html b/examples/index.html index d2e04f56..7c8259c8 100644 --- a/examples/index.html +++ b/examples/index.html @@ -5,7 +5,6 @@ React ContextMenu - + + +
    +
    +

    + All files AbstractMenu.js +

    +
    +
    + 23.88% + Statements + 16/67 +
    +
    + 15.69% + Branches + 8/51 +
    +
    + 33.33% + Functions + 4/12 +
    +
    + 25% + Lines + 16/64 +
    +
    +

    + Press n or j to go to the next uncovered block, b, p or k for the previous block. +

    +
    +
    +
    
    +
    +
    1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152  +  +  +  +  +  +  +  +  +  +  +7x +  +7x +7x +  +  +  +  +  +  +  +  +2x +  +  +  +2x +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +1x +  +  +  +1x +  +  +  +  +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +18x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
    import React, { Component } from 'react';
    +import PropTypes from 'prop-types';
    + 
    +import MenuItem from './MenuItem';
    + 
    +export default class AbstractMenu extends Component {
    +    static propTypes = {
    +        children: PropTypes.node.isRequired
    +    };
    + 
    +    constructor(props) {
    +        super(props);
    + 
    +        this.seletedItemRef = null;
    +        this.state = {
    +            selectedItem: null,
    +            forceSubMenuOpen: false
    +        };
    +    }
    + 
    +    handleKeyNavigation = (e) => {
    +        // check for isVisible strictly here as it might be undefined when this code executes in the context of SubMenu
    +        // but we only need to check when it runs in the ContextMenu context
    +        Iif (this.state.isVisible === false) {
    +            return;
    +        }
    + 
    +        switch (e.keyCode) {
    +            case 37: // left arrow
    +            case 27: // escape
    +                e.preventDefault();
    +                this.hideMenu(e);
    +                break;
    +            case 38: // up arrow
    +                e.preventDefault();
    +                this.selectChildren(true);
    +                break;
    +            case 40: // down arrow
    +                e.preventDefault();
    +                this.selectChildren(false);
    +                break;
    +            case 39: // right arrow
    +                this.tryToOpenSubMenu(e);
    +                break;
    +            case 13: // enter
    +                e.preventDefault();
    +                this.tryToOpenSubMenu(e);
    +                {
    +                    // determine the selected item is disabled or not
    +                    const disabled = this.seletedItemRef &&
    +                        this.seletedItemRef.props &&
    +                        this.seletedItemRef.props.disabled;
    + 
    +                    Iif (this.seletedItemRef &&
    +                        this.seletedItemRef.ref instanceof HTMLElement &&
    +                        !disabled) {
    +                        this.seletedItemRef.ref.click();
    +                    } else {
    +                        this.hideMenu(e);
    +                    }
    +                }
    +                break;
    +            default:
    +                // do nothing
    +        }
    +    }
    + 
    +    handleForceClose = () => {
    +        this.setState({ forceSubMenuOpen: false });
    +    }
    + 
    +    tryToOpenSubMenu = (e) => {
    +        Iif (this.state.selectedItem && this.state.selectedItem.type === this.getSubMenuType()) {
    +            e.preventDefault();
    +            this.setState({ forceSubMenuOpen: true });
    +        }
    +    }
    + 
    +    selectChildren = (forward) => {
    +        const { selectedItem } = this.state;
    +        const children = [];
    +        const childCollector = (child) => {
    +            // child can be empty in case you do conditional rendering of components, in which
    +            // case it should not be accounted for as a real child
    +            if (!child) {
    +                return;
    +            }
    + 
    +            if ([MenuItem, this.getSubMenuType()].indexOf(child.type) < 0) {
    +                // Maybe the MenuItem or SubMenu is capsuled in a wrapper div or something else
    +                React.Children.forEach(child.props.children, childCollector);
    +            } else if (!child.props.divider) {
    +                children.push(child);
    +            }
    +        };
    +        React.Children.forEach(this.props.children, childCollector);
    +        const currentIndex = children.indexOf(selectedItem);
    +        if (currentIndex < 0) {
    +            this.setState({
    +                selectedItem: forward ? children[children.length - 1] : children[0],
    +                forceSubMenuOpen: false
    +            });
    +        } else if (forward) {
    +            this.setState({
    +                selectedItem: children[currentIndex - 1 < 0 ? children.length - 1 : currentIndex - 1],
    +                forceSubMenuOpen: false
    +            });
    +        } else {
    +            this.setState({
    +                selectedItem: children[currentIndex + 1 < children.length ? currentIndex + 1 : 0],
    +                forceSubMenuOpen: false
    +            });
    +        }
    +    }
    + 
    +    onChildMouseMove = (child) => {
    +        if (this.state.selectedItem !== child) {
    +            this.setState({ selectedItem: child, forceSubMenuOpen: false });
    +        }
    +    }
    + 
    +    onChildMouseLeave = () => {
    +        this.setState({ selectedItem: null, forceSubMenuOpen: false });
    +    }
    + 
    +    renderChildren = children => React.Children.map(children, (child) => {
    +        const props = {};
    +        if (!React.isValidElement(child)) return child;
    +        if ([MenuItem, this.getSubMenuType()].indexOf(child.type) < 0) {
    +            // Maybe the MenuItem or SubMenu is capsuled in a wrapper div or something else
    +            props.children = this.renderChildren(child.props.children);
    +            return React.cloneElement(child, props);
    +        }
    +        props.onMouseLeave = this.onChildMouseLeave.bind(this);
    +        if (child.type === this.getSubMenuType()) {
    +            // special props for SubMenu only
    +            props.forceOpen = this.state.forceSubMenuOpen && (this.state.selectedItem === child);
    +            props.forceClose = this.handleForceClose;
    +            props.parentKeyNavigationHandler = this.handleKeyNavigation;
    +        }
    +        if (!child.props.divider && this.state.selectedItem === child) {
    +            // special props for selected item only
    +            props.selected = true;
    +            props.ref = (ref) => { this.seletedItemRef = ref; };
    +            return React.cloneElement(child, props);
    +        }
    +        // onMouseMove is only needed for non selected items
    +        props.onMouseMove = () => this.onChildMouseMove(child);
    +        return React.cloneElement(child, props);
    +    });
    +}
    + 
    +
    +
    + + + + + + + + diff --git a/coverage/lcov-report/ContextMenu.js.html b/coverage/lcov-report/ContextMenu.js.html new file mode 100644 index 00000000..017064ec --- /dev/null +++ b/coverage/lcov-report/ContextMenu.js.html @@ -0,0 +1,684 @@ + + + + Code coverage report for ContextMenu.js + + + + + + + +
    +
    +

    + All files ContextMenu.js +

    +
    +
    + 63.29% + Statements + 50/79 +
    +
    + 41.3% + Branches + 19/46 +
    +
    + 72.22% + Functions + 13/18 +
    +
    + 64.38% + Lines + 47/73 +
    +
    +

    + Press n or j to go to the next uncovered block, b, p or k for the previous block. +

    +
    +
    +
    
    +
    +
    1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +5x +  +  +  +  +7x +  +7x +  +  +  +  +  +  +  +  +  +  +  +7x +  +  +  +11x +6x +  +6x +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +5x +5x +  +  +  +  +7x +7x +  +  +7x +  +  +  +6x +6x +6x +6x +6x +6x +  +  +  +12x +12x +12x +12x +12x +12x +  +  +  +8x +  +6x +  +6x +6x +6x +  +  +  +6x +5x +5x +5x +  +  +  +  +1x +  +  +  +1x +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +14x +  +  +  +18x +18x +18x +  +  +  +  +18x +  +  +  +18x +  +  +  +  +  +  +  +  + 
    import React from 'react';
    +import PropTypes from 'prop-types';
    +import cx from 'classnames';
    +import assign from 'object-assign';
    + 
    +import listener from './globalEventListener';
    +import AbstractMenu from './AbstractMenu';
    +import SubMenu from './SubMenu';
    +import { hideMenu } from './actions';
    +import { cssClasses, callIfExists, store } from './helpers';
    + 
    +export default class ContextMenu extends AbstractMenu {
    +    static propTypes = {
    +        id: PropTypes.string.isRequired,
    +        children: PropTypes.node.isRequired,
    +        data: PropTypes.object,
    +        className: PropTypes.string,
    +        hideOnLeave: PropTypes.bool,
    +        onHide: PropTypes.func,
    +        onMouseLeave: PropTypes.func,
    +        onShow: PropTypes.func,
    +        style: PropTypes.object
    +    };
    + 
    +    static defaultProps = {
    +        className: '',
    +        data: {},
    +        hideOnLeave: false,
    +        onHide() { return null; },
    +        onMouseLeave() { return null; },
    +        onShow() { return null; },
    +        style: {}
    +    };
    + 
    +    constructor(props) {
    +        super(props);
    + 
    +        this.state = assign({}, this.state, {
    +            x: 0,
    +            y: 0,
    +            isVisible: false
    +        });
    +    }
    + 
    +    getSubMenuType() { // eslint-disable-line class-methods-use-this
    +        return SubMenu;
    +    }
    + 
    +    componentDidMount() {
    +        this.listenId = listener.register(this.handleShow, this.handleHide);
    +    }
    + 
    +    componentDidUpdate() {
    +        if (this.state.isVisible) {
    +            const wrapper = window.requestAnimationFrame || setTimeout;
    + 
    +            wrapper(() => {
    +                const { x, y } = this.state;
    + 
    +                const { top, left } = this.getMenuPosition(x, y);
    + 
    +                wrapper(() => {
    +                    if (!this.menu) return;
    +                    this.menu.style.top = `${top}px`;
    +                    this.menu.style.left = `${left}px`;
    +                    this.menu.style.opacity = 1;
    +                    this.menu.style.pointerEvents = 'auto';
    +                });
    +            });
    +        } else {
    +            Iif (!this.menu) return;
    +            this.menu.style.opacity = 0;
    +            this.menu.style.pointerEvents = 'none';
    +        }
    +    }
    + 
    +    componentWillUnmount() {
    +        Eif (this.listenId) {
    +            listener.unregister(this.listenId);
    +        }
    + 
    +        this.unregisterHandlers();
    +    }
    + 
    +    registerHandlers = () => {
    +        document.addEventListener('mousedown', this.handleOutsideClick);
    +        document.addEventListener('touchstart', this.handleOutsideClick);
    +        document.addEventListener('scroll', this.handleHide);
    +        document.addEventListener('contextmenu', this.handleHide);
    +        document.addEventListener('keydown', this.handleKeyNavigation);
    +        window.addEventListener('resize', this.handleHide);
    +    }
    + 
    +    unregisterHandlers = () => {
    +        document.removeEventListener('mousedown', this.handleOutsideClick);
    +        document.removeEventListener('touchstart', this.handleOutsideClick);
    +        document.removeEventListener('scroll', this.handleHide);
    +        document.removeEventListener('contextmenu', this.handleHide);
    +        document.removeEventListener('keydown', this.handleKeyNavigation);
    +        window.removeEventListener('resize', this.handleHide);
    +    }
    + 
    +    handleShow = (e) => {
    +        if (e.detail.id !== this.props.id || this.state.isVisible) return;
    + 
    +        const { x, y } = e.detail.position;
    + 
    +        this.setState({ isVisible: true, x, y });
    +        this.registerHandlers();
    +        callIfExists(this.props.onShow, e);
    +    }
    + 
    +    handleHide = (e) => {
    +        if (this.state.isVisible && (!e.detail || !e.detail.id || e.detail.id === this.props.id)) {
    +            this.unregisterHandlers();
    +            this.setState({ isVisible: false, selectedItem: null, forceSubMenuOpen: false });
    +            callIfExists(this.props.onHide, e);
    +        }
    +    }
    + 
    +    handleOutsideClick = (e) => {
    +        Eif (!this.menu.contains(e.target)) hideMenu();
    +    }
    + 
    +    handleMouseLeave = (event) => {
    +        event.preventDefault();
    + 
    +        callIfExists(
    +            this.props.onMouseLeave,
    +            event,
    +            assign({}, this.props.data, store.data),
    +            store.target
    +        );
    + 
    +        Eif (this.props.hideOnLeave) hideMenu();
    +    }
    + 
    +    handleContextMenu = (e) => {
    +        if (process.env.NODE_ENV === 'production') {
    +            e.preventDefault();
    +        }
    +        this.handleHide(e);
    +    }
    + 
    +    hideMenu = (e) => {
    +        Eif (e.keyCode === 27 || e.keyCode === 13) { // ECS or enter
    +            hideMenu();
    +        }
    +    }
    + 
    +    getMenuPosition = (x = 0, y = 0) => {
    +        let menuStyles = {
    +            top: y,
    +            left: x
    +        };
    + 
    +        if (!this.menu) return menuStyles;
    + 
    +        const { innerWidth, innerHeight } = window;
    +        const rect = this.menu.getBoundingClientRect();
    + 
    +        if (y + rect.height > innerHeight) {
    +            menuStyles.top -= rect.height;
    +        }
    + 
    +        if (x + rect.width > innerWidth) {
    +            menuStyles.left -= rect.width;
    +        }
    + 
    +        if (menuStyles.top < 0) {
    +            menuStyles.top = rect.height < innerHeight ? (innerHeight - rect.height) / 2 : 0;
    +        }
    + 
    +        if (menuStyles.left < 0) {
    +            menuStyles.left = rect.width < innerWidth ? (innerWidth - rect.width) / 2 : 0;
    +        }
    + 
    +        return menuStyles;
    +    }
    + 
    +    menuRef = (c) => {
    +        this.menu = c;
    +    }
    + 
    +    render() {
    +        const { children, className, style } = this.props;
    +        const { isVisible } = this.state;
    +        const inlineStyle = assign(
    +          {},
    +          style,
    +          { position: 'fixed', opacity: 0, pointerEvents: 'none' }
    +        );
    +        const menuClassnames = cx(cssClasses.menu, className, {
    +            [cssClasses.menuVisible]: isVisible
    +        });
    + 
    +        return (
    +            <nav
    +                role='menu' tabIndex='-1' ref={this.menuRef} style={inlineStyle} className={menuClassnames}
    +                onContextMenu={this.handleContextMenu} onMouseLeave={this.handleMouseLeave}>
    +                {this.renderChildren(children)}
    +            </nav>
    +        );
    +    }
    +}
    + 
    +
    +
    + + + + + + + + diff --git a/coverage/lcov-report/MenuItem.js.html b/coverage/lcov-report/MenuItem.js.html new file mode 100644 index 00000000..ee463bac --- /dev/null +++ b/coverage/lcov-report/MenuItem.js.html @@ -0,0 +1,288 @@ + + + + Code coverage report for MenuItem.js + + + + + + + +
    +
    +

    + All files MenuItem.js +

    +
    +
    + 0% + Statements + 0/14 +
    +
    + 0% + Branches + 0/12 +
    +
    + 0% + Functions + 0/5 +
    +
    + 0% + Lines + 0/12 +
    +
    +

    + Press n or j to go to the next uncovered block, b, p or k for the previous block. +

    +
    +
    +
    
    +
    +
    1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
    import React, { Component } from 'react';
    +import PropTypes from 'prop-types';
    +import cx from 'classnames';
    +import assign from 'object-assign';
    + 
    +import { hideMenu } from './actions';
    +import { callIfExists, cssClasses, store } from './helpers';
    + 
    +export default class MenuItem extends Component {
    +    static propTypes = {
    +        children: PropTypes.node,
    +        attributes: PropTypes.object,
    +        data: PropTypes.object,
    +        disabled: PropTypes.bool,
    +        divider: PropTypes.bool,
    +        preventClose: PropTypes.bool,
    +        onClick: PropTypes.func,
    +        selected: PropTypes.bool,
    +        onMouseMove: PropTypes.func,
    +        onMouseLeave: PropTypes.func
    +    };
    + 
    +    static defaultProps = {
    +        disabled: false,
    +        data: {},
    +        divider: false,
    +        attributes: {},
    +        preventClose: false,
    +        onClick() { return null; },
    +        children: null,
    +        selected: false,
    +        onMouseMove: () => null,
    +        onMouseLeave: () => null
    +    };
    + 
    +    handleClick = (event) => {
    +        event.preventDefault();
    + 
    +        if (this.props.disabled || this.props.divider) return;
    + 
    +        callIfExists(
    +            this.props.onClick,
    +            event,
    +            assign({}, this.props.data, store.data),
    +            store.target
    +        );
    + 
    +        if (this.props.preventClose) return;
    + 
    +        hideMenu();
    +    }
    + 
    +    render() {
    +        const { disabled, divider, children, attributes, selected } = this.props;
    +        const menuItemClassNames = cx(cssClasses.menuItem, attributes.className, {
    +            [cx(cssClasses.menuItemDisabled, attributes.disabledClassName)]: disabled,
    +            [cx(cssClasses.menuItemDivider, attributes.dividerClassName)]: divider,
    +            [cx(cssClasses.menuItemSelected, attributes.selectedClassName)]: selected
    +        });
    + 
    +        return (
    +            <div
    +                {...attributes} className={menuItemClassNames}
    +                role='menuitem' tabIndex='-1' aria-disabled={disabled ? 'true' : 'false'}
    +                aria-orientation={divider ? 'horizontal' : null}
    +                ref={(ref) => { this.ref = ref; }}
    +                onMouseMove={this.props.onMouseMove} onMouseLeave={this.props.onMouseLeave}
    +                onTouchEnd={this.handleClick} onClick={this.handleClick}>
    +                {divider ? null : children}
    +            </div>
    +        );
    +    }
    +}
    + 
    +
    +
    + + + + + + + + diff --git a/coverage/lcov-report/SubMenu.js.html b/coverage/lcov-report/SubMenu.js.html new file mode 100644 index 00000000..600c8e29 --- /dev/null +++ b/coverage/lcov-report/SubMenu.js.html @@ -0,0 +1,867 @@ + + + + Code coverage report for SubMenu.js + + + + + + + +
    +
    +

    + All files SubMenu.js +

    +
    +
    + 0% + Statements + 0/102 +
    +
    + 0% + Branches + 0/62 +
    +
    + 0% + Functions + 0/26 +
    +
    + 0% + Lines + 0/88 +
    +
    +

    + Press n or j to go to the next uncovered block, b, p or k for the previous block. +

    +
    +
    +
    
    +
    +
    1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
    import React from 'react';
    +import PropTypes from 'prop-types';
    +import cx from 'classnames';
    +import assign from 'object-assign';
    + 
    +import AbstractMenu from './AbstractMenu';
    +import { callIfExists, cssClasses, hasOwnProp, store } from './helpers';
    +import listener from './globalEventListener';
    + 
    +export default class SubMenu extends AbstractMenu {
    +    static propTypes = {
    +        children: PropTypes.node.isRequired,
    +        attributes: PropTypes.object,
    +        title: PropTypes.node.isRequired,
    +        className: PropTypes.string,
    +        disabled: PropTypes.bool,
    +        hoverDelay: PropTypes.number,
    +        rtl: PropTypes.bool,
    +        selected: PropTypes.bool,
    +        onMouseMove: PropTypes.func,
    +        onMouseOut: PropTypes.func,
    +        forceOpen: PropTypes.bool,
    +        forceClose: PropTypes.func,
    +        parentKeyNavigationHandler: PropTypes.func
    +    };
    + 
    +    static defaultProps = {
    +        disabled: false,
    +        hoverDelay: 500,
    +        attributes: {},
    +        className: '',
    +        rtl: false,
    +        selected: false,
    +        onMouseMove: () => null,
    +        onMouseOut: () => null,
    +        forceOpen: false,
    +        forceClose: () => null,
    +        parentKeyNavigationHandler: () => null
    +    };
    + 
    +    constructor(props) {
    +        super(props);
    + 
    +        this.state = assign({}, this.state, {
    +            visible: false
    +        });
    +    }
    + 
    +    componentDidMount() {
    +        this.listenId = listener.register(() => {}, this.hideMenu);
    +    }
    + 
    +    getSubMenuType() { // eslint-disable-line class-methods-use-this
    +        return SubMenu;
    +    }
    + 
    +    shouldComponentUpdate(nextProps, nextState) {
    +        this.isVisibilityChange = (this.state.visible !== nextState.visible ||
    +                                  this.props.forceOpen !== nextProps.forceOpen) &&
    +                                  !(this.state.visible && nextProps.forceOpen) &&
    +                                  !(this.props.forceOpen && nextState.visible);
    +        return true;
    +    }
    + 
    +    componentDidUpdate() {
    +        if (!this.isVisibilityChange) return;
    +        if (this.props.forceOpen || this.state.visible) {
    +            const wrapper = window.requestAnimationFrame || setTimeout;
    +            wrapper(() => {
    +                const styles = this.props.rtl
    +                                ? this.getRTLMenuPosition()
    +                                : this.getMenuPosition();
    + 
    +                this.subMenu.style.removeProperty('top');
    +                this.subMenu.style.removeProperty('bottom');
    +                this.subMenu.style.removeProperty('left');
    +                this.subMenu.style.removeProperty('right');
    + 
    +                if (hasOwnProp(styles, 'top')) this.subMenu.style.top = styles.top;
    +                if (hasOwnProp(styles, 'left')) this.subMenu.style.left = styles.left;
    +                if (hasOwnProp(styles, 'bottom')) this.subMenu.style.bottom = styles.bottom;
    +                if (hasOwnProp(styles, 'right')) this.subMenu.style.right = styles.right;
    +                this.subMenu.classList.add(cssClasses.menuVisible);
    + 
    +                this.registerHandlers();
    +                this.setState({ selectedItem: null });
    +            });
    +        } else {
    +            const cleanup = () => {
    +                this.subMenu.removeEventListener('transitionend', cleanup);
    +                this.subMenu.style.removeProperty('bottom');
    +                this.subMenu.style.removeProperty('right');
    +                this.subMenu.style.top = 0;
    +                this.subMenu.style.left = '100%';
    +                this.unregisterHandlers();
    +            };
    +            this.subMenu.addEventListener('transitionend', cleanup);
    +            this.subMenu.classList.remove(cssClasses.menuVisible);
    +        }
    +    }
    + 
    +    componentWillUnmount() {
    +        if (this.listenId) {
    +            listener.unregister(this.listenId);
    +        }
    + 
    +        if (this.opentimer) clearTimeout(this.opentimer);
    + 
    +        if (this.closetimer) clearTimeout(this.closetimer);
    + 
    +        this.unregisterHandlers(true);
    +    }
    + 
    +    getMenuPosition = () => {
    +        const { innerWidth, innerHeight } = window;
    +        const rect = this.subMenu.getBoundingClientRect();
    +        const position = {};
    + 
    +        if (rect.bottom > innerHeight) {
    +            position.bottom = 0;
    +        } else {
    +            position.top = 0;
    +        }
    + 
    +        if (rect.right < innerWidth) {
    +            position.left = '100%';
    +        } else {
    +            position.right = '100%';
    +        }
    + 
    +        return position;
    +    }
    + 
    +    getRTLMenuPosition = () => {
    +        const { innerHeight } = window;
    +        const rect = this.subMenu.getBoundingClientRect();
    +        const position = {};
    + 
    +        if (rect.bottom > innerHeight) {
    +            position.bottom = 0;
    +        } else {
    +            position.top = 0;
    +        }
    + 
    +        if (rect.left < 0) {
    +            position.left = '100%';
    +        } else {
    +            position.right = '100%';
    +        }
    + 
    +        return position;
    +    }
    + 
    +    hideMenu = (e) => {
    +        // avoid closing submenus of a different menu tree
    +        if (e.detail && e.detail.id && this.menu && e.detail.id !== this.menu.id) {
    +            return;
    +        }
    + 
    +        if (this.props.forceOpen) {
    +            this.props.forceClose();
    +        }
    +        this.setState({ visible: false, selectedItem: null });
    +        this.unregisterHandlers();
    +    };
    + 
    +    handleClick = (event) => {
    +        event.preventDefault();
    + 
    +        if (this.props.disabled) return;
    + 
    +        callIfExists(
    +            this.props.onClick,
    +            event,
    +            assign({}, this.props.data, store.data),
    +            store.target
    +        );
    +    }
    + 
    +    handleMouseEnter = () => {
    +        if (this.closetimer) clearTimeout(this.closetimer);
    + 
    +        if (this.props.disabled || this.state.visible) return;
    + 
    +        this.opentimer = setTimeout(() => this.setState({
    +            visible: true,
    +            selectedItem: null
    +        }), this.props.hoverDelay);
    +    }
    + 
    +    handleMouseLeave = () => {
    +        if (this.opentimer) clearTimeout(this.opentimer);
    + 
    +        if (!this.state.visible) return;
    + 
    +        this.closetimer = setTimeout(() => this.setState({
    +            visible: false,
    +            selectedItem: null
    +        }), this.props.hoverDelay);
    +    }
    + 
    +    menuRef = (c) => {
    +        this.menu = c;
    +    }
    + 
    +    subMenuRef = (c) => {
    +        this.subMenu = c;
    +    }
    + 
    +    registerHandlers = () => {
    +        document.removeEventListener('keydown', this.props.parentKeyNavigationHandler);
    +        document.addEventListener('keydown', this.handleKeyNavigation);
    +    }
    + 
    +    unregisterHandlers = (dismounting) => {
    +        document.removeEventListener('keydown', this.handleKeyNavigation);
    +        if (!dismounting) {
    +            document.addEventListener('keydown', this.props.parentKeyNavigationHandler);
    +        }
    +    }
    + 
    +    render() {
    +        const { children, attributes, disabled, title, selected } = this.props;
    +        const { visible } = this.state;
    +        const menuProps = {
    +            ref: this.menuRef,
    +            onMouseEnter: this.handleMouseEnter,
    +            onMouseLeave: this.handleMouseLeave,
    +            className: cx(cssClasses.menuItem, cssClasses.subMenu, attributes.listClassName),
    +            style: {
    +                position: 'relative'
    +            }
    +        };
    +        const menuItemProps = {
    +            className: cx(cssClasses.menuItem, attributes.className, {
    +                [cx(cssClasses.menuItemDisabled, attributes.disabledClassName)]: disabled,
    +                [cx(cssClasses.menuItemActive, attributes.visibleClassName)]: visible,
    +                [cx(cssClasses.menuItemSelected, attributes.selectedClassName)]: selected
    +            }),
    +            onMouseMove: this.props.onMouseMove,
    +            onMouseOut: this.props.onMouseOut,
    +            onClick: this.handleClick
    +        };
    +        const subMenuProps = {
    +            ref: this.subMenuRef,
    +            style: {
    +                position: 'absolute',
    +                transition: 'opacity 1ms', // trigger transitionend event
    +                top: 0,
    +                left: '100%'
    +            },
    +            className: cx(cssClasses.menu, this.props.className)
    +        };
    + 
    +        return (
    +            <nav {...menuProps} role='menuitem' tabIndex='-1' aria-haspopup='true'>
    +                <div {...attributes} {...menuItemProps}>
    +                    {title}
    +                </div>
    +                <nav {...subMenuProps} role='menu' tabIndex='-1'>
    +                    {this.renderChildren(children)}
    +                </nav>
    +            </nav>
    +        );
    +    }
    +}
    + 
    +
    +
    + + + + + + + + diff --git a/coverage/lcov-report/actions.js.html b/coverage/lcov-report/actions.js.html new file mode 100644 index 00000000..55f8bb7e --- /dev/null +++ b/coverage/lcov-report/actions.js.html @@ -0,0 +1,168 @@ + + + + Code coverage report for actions.js + + + + + + + +
    +
    +

    + All files actions.js +

    +
    +
    + 81.82% + Statements + 9/11 +
    +
    + 71.43% + Branches + 5/7 +
    +
    + 100% + Functions + 3/3 +
    +
    + 81.82% + Lines + 9/11 +
    +
    +

    + Press n or j to go to the next uncovered block, b, p or k for the previous block. +

    +
    +
    +
    
    +
    +
    1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34  +  +  +  +2x +2x +  +  +  +  +  +  +  +16x +16x +  +  +  +  +  +16x +16x +16x +  +  +  +  +9x +  +  +  +7x +  + 
    import assign from 'object-assign';
    + 
    +import { store } from './helpers';
    + 
    +export const MENU_SHOW = 'REACT_CONTEXTMENU_SHOW';
    +export const MENU_HIDE = 'REACT_CONTEXTMENU_HIDE';
    + 
    + 
    +export function dispatchGlobalEvent(eventName, opts, target = window) {
    +  // Compatibale with IE
    +  // @see http://stackoverflow.com/questions/26596123/internet-explorer-9-10-11-event-constructor-doesnt-work
    +    let event;
    + 
    +    Eif (typeof window.CustomEvent === 'function') {
    +        event = new window.CustomEvent(eventName, { detail: opts });
    +    } else {
    +        event = document.createEvent('CustomEvent');
    +        event.initCustomEvent(eventName, false, true, opts);
    +    }
    + 
    +    Eif (target) {
    +        target.dispatchEvent(event);
    +        assign(store, opts);
    +    }
    +}
    + 
    +export function showMenu(opts = {}, target) {
    +    dispatchGlobalEvent(MENU_SHOW, assign({}, opts, { type: MENU_SHOW }), target);
    +}
    + 
    +export function hideMenu(opts = {}, target) {
    +    dispatchGlobalEvent(MENU_HIDE, assign({}, opts, { type: MENU_HIDE }), target);
    +}
    + 
    +
    +
    + + + + + + + + diff --git a/coverage/lcov-report/base.css b/coverage/lcov-report/base.css new file mode 100644 index 00000000..7090209c --- /dev/null +++ b/coverage/lcov-report/base.css @@ -0,0 +1,223 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } + +.medium .chart { border:1px solid #666; } +.medium .cover-fill { background: #666; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } +.medium { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/lcov-report/block-navigation.js b/coverage/lcov-report/block-navigation.js new file mode 100644 index 00000000..0c719038 --- /dev/null +++ b/coverage/lcov-report/block-navigation.js @@ -0,0 +1,63 @@ +var jumpToCode = (function init () { + // Classes of code we would like to highlight + var missingCoverageClasses = [ '.cbranch-no', '.cstat-no', '.fstat-no' ]; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = notSelector + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements.item(currentIndex).classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index) + .scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if (typeof currentIndex === 'number' && currentIndex < (missingCoverageElements.length - 1)) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +}()); +window.addEventListener('keydown', jumpToCode); diff --git a/coverage/lcov-report/globalEventListener.js.html b/coverage/lcov-report/globalEventListener.js.html new file mode 100644 index 00000000..a94e5ba7 --- /dev/null +++ b/coverage/lcov-report/globalEventListener.js.html @@ -0,0 +1,201 @@ + + + + Code coverage report for globalEventListener.js + + + + + + + +
    +
    +

    + All files globalEventListener.js +

    +
    +
    + 100% + Statements + 15/15 +
    +
    + 60% + Branches + 6/10 +
    +
    + 100% + Functions + 5/5 +
    +
    + 100% + Lines + 13/13 +
    +
    +

    + Press n or j to go to the next uncovered block, b, p or k for the previous block. +

    +
    +
    +
    
    +
    +
    1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45  +  +  +  +  +1x +  +1x +1x +1x +  +  +  +  +8x +8x +  +  +  +  +6x +6x +  +  +  +  +7x +  +7x +  +  +  +  +7x +  +  +  +7x +7x +  +  +  +  +  + 
    import { MENU_SHOW, MENU_HIDE } from './actions';
    +import { uniqueId, hasOwnProp, canUseDOM } from './helpers';
    + 
    +class GlobalEventListener {
    +    constructor() {
    +        this.callbacks = {};
    + 
    +        Eif (canUseDOM) {
    +            window.addEventListener(MENU_SHOW, this.handleShowEvent);
    +            window.addEventListener(MENU_HIDE, this.handleHideEvent);
    +        }
    +    }
    + 
    +    handleShowEvent = (event) => {
    +        for (const id in this.callbacks) {
    +            Eif (hasOwnProp(this.callbacks, id)) this.callbacks[id].show(event);
    +        }
    +    }
    + 
    +    handleHideEvent = (event) => {
    +        for (const id in this.callbacks) {
    +            Eif (hasOwnProp(this.callbacks, id)) this.callbacks[id].hide(event);
    +        }
    +    }
    + 
    +    register = (showCallback, hideCallback) => {
    +        const id = uniqueId();
    + 
    +        this.callbacks[id] = {
    +            show: showCallback,
    +            hide: hideCallback
    +        };
    + 
    +        return id;
    +    }
    + 
    +    unregister = (id) => {
    +        Eif (id && this.callbacks[id]) {
    +            delete this.callbacks[id];
    +        }
    +    }
    +}
    + 
    +export default new GlobalEventListener();
    + 
    +
    +
    + + + + + + + + diff --git a/coverage/lcov-report/helpers.js.html b/coverage/lcov-report/helpers.js.html new file mode 100644 index 00000000..2868b592 --- /dev/null +++ b/coverage/lcov-report/helpers.js.html @@ -0,0 +1,156 @@ + + + + Code coverage report for helpers.js + + + + + + + +
    +
    +

    + All files helpers.js +

    +
    +
    + 100% + Statements + 6/6 +
    +
    + 100% + Branches + 5/5 +
    +
    + 100% + Functions + 3/3 +
    +
    + 100% + Lines + 6/6 +
    +
    +

    + Press n or j to go to the next uncovered block, b, p or k for the previous block. +

    +
    +
    +
    
    +
    +
    1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30  +12x +  +  +  +14x +  +  +  +7x +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +2x +  +2x +  +  + 
    export function callIfExists(func, ...args) {
    +    return (typeof func === 'function') && func(...args);
    +}
    + 
    +export function hasOwnProp(obj, prop) {
    +    return Object.prototype.hasOwnProperty.call(obj, prop);
    +}
    + 
    +export function uniqueId() {
    +    return Math.random().toString(36).substring(7);
    +}
    + 
    +export const cssClasses = {
    +    menu: 'react-contextmenu',
    +    menuVisible: 'react-contextmenu--visible',
    +    menuWrapper: 'react-contextmenu-wrapper',
    +    menuItem: 'react-contextmenu-item',
    +    menuItemActive: 'react-contextmenu-item--active',
    +    menuItemDisabled: 'react-contextmenu-item--disabled',
    +    menuItemDivider: 'react-contextmenu-item--divider',
    +    menuItemSelected: 'react-contextmenu-item--selected',
    +    subMenu: 'react-contextmenu-submenu'
    +};
    + 
    +export const store = {};
    + 
    +export const canUseDOM = Boolean(
    +  typeof window !== 'undefined' && window.document && window.document.createElement
    +);
    + 
    +
    +
    + + + + + + + + diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html new file mode 100644 index 00000000..e30a99b8 --- /dev/null +++ b/coverage/lcov-report/index.html @@ -0,0 +1,175 @@ + + + + Code coverage report for All files + + + + + + + +
    +
    +

    + All files +

    +
    +
    + 32.65% + Statements + 96/294 +
    +
    + 22.28% + Branches + 43/193 +
    +
    + 38.89% + Functions + 28/72 +
    +
    + 34.08% + Lines + 91/267 +
    +
    +

    + Press n or j to go to the next uncovered block, b, p or k for the previous block. +

    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FileStatementsBranchesFunctionsLines
    AbstractMenu.js
    23.88%16/6715.69%8/5133.33%4/1225%16/64
    ContextMenu.js
    63.29%50/7941.3%19/4672.22%13/1864.38%47/73
    MenuItem.js
    0%0/140%0/120%0/50%0/12
    SubMenu.js
    0%0/1020%0/620%0/260%0/88
    actions.js
    81.82%9/1171.43%5/7100%3/381.82%9/11
    globalEventListener.js
    100%15/1560%6/10100%5/5100%13/13
    helpers.js
    100%6/6100%5/5100%3/3100%6/6
    +
    +
    + + + + + + + + diff --git a/coverage/lcov-report/prettify.css b/coverage/lcov-report/prettify.css new file mode 100644 index 00000000..b317a7cd --- /dev/null +++ b/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/lcov-report/prettify.js b/coverage/lcov-report/prettify.js new file mode 100644 index 00000000..ef51e038 --- /dev/null +++ b/coverage/lcov-report/prettify.js @@ -0,0 +1 @@ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/lcov-report/sort-arrow-sprite.png b/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..03f704a609c6fd0dbfdac63466a7d7c958b5cbf3 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jii$m5978H@?Fn+^JD|Y9yzj{W`447Gxa{7*dM7nnnD-Lb z6^}Hx2)'; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function (a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function (a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function () { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i =0 ; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function () { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(cols); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/coverage/lcov.info b/coverage/lcov.info new file mode 100644 index 00000000..2c99890a --- /dev/null +++ b/coverage/lcov.info @@ -0,0 +1,667 @@ +TN: +SF:/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/AbstractMenu.js +FN:11,(anonymous_0) +FN:21,(anonymous_1) +FN:68,(anonymous_2) +FN:72,(anonymous_3) +FN:79,(anonymous_4) +FN:82,(anonymous_5) +FN:116,(anonymous_6) +FN:122,(anonymous_7) +FN:126,(anonymous_8) +FN:126,(anonymous_9) +FN:144,(anonymous_10) +FN:148,(anonymous_11) +FNF:12 +FNH:4 +FNDA:7,(anonymous_0) +FNDA:2,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:1,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:18,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +DA:12,7 +DA:14,7 +DA:15,7 +DA:24,2 +DA:25,0 +DA:28,2 +DA:31,1 +DA:32,1 +DA:33,1 +DA:35,0 +DA:36,0 +DA:37,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:43,0 +DA:44,0 +DA:46,1 +DA:47,1 +DA:50,1 +DA:54,1 +DA:57,0 +DA:59,1 +DA:62,1 +DA:69,0 +DA:73,1 +DA:74,0 +DA:75,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:85,0 +DA:86,0 +DA:89,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:103,0 +DA:104,0 +DA:109,0 +DA:117,0 +DA:118,0 +DA:123,0 +DA:126,18 +DA:127,0 +DA:128,0 +DA:129,0 +DA:131,0 +DA:132,0 +DA:134,0 +DA:135,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:141,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:148,0 +DA:149,0 +LF:64 +LH:16 +BRDA:24,0,0,0 +BRDA:24,0,1,2 +BRDA:28,1,0,0 +BRDA:28,1,1,1 +BRDA:28,1,2,0 +BRDA:28,1,3,0 +BRDA:28,1,4,0 +BRDA:28,1,5,1 +BRDA:28,1,6,0 +BRDA:50,2,0,1 +BRDA:50,2,1,0 +BRDA:50,2,2,0 +BRDA:54,3,0,0 +BRDA:54,3,1,1 +BRDA:54,4,0,1 +BRDA:54,4,1,0 +BRDA:54,4,2,0 +BRDA:73,5,0,0 +BRDA:73,5,1,1 +BRDA:73,6,0,1 +BRDA:73,6,1,0 +BRDA:85,7,0,0 +BRDA:85,7,1,0 +BRDA:89,8,0,0 +BRDA:89,8,1,0 +BRDA:92,9,0,0 +BRDA:92,9,1,0 +BRDA:98,10,0,0 +BRDA:98,10,1,0 +BRDA:100,11,0,0 +BRDA:100,11,1,0 +BRDA:103,12,0,0 +BRDA:103,12,1,0 +BRDA:105,13,0,0 +BRDA:105,13,1,0 +BRDA:110,14,0,0 +BRDA:110,14,1,0 +BRDA:117,15,0,0 +BRDA:117,15,1,0 +BRDA:128,16,0,0 +BRDA:128,16,1,0 +BRDA:129,17,0,0 +BRDA:129,17,1,0 +BRDA:135,18,0,0 +BRDA:135,18,1,0 +BRDA:137,19,0,0 +BRDA:137,19,1,0 +BRDA:141,20,0,0 +BRDA:141,20,1,0 +BRDA:141,21,0,0 +BRDA:141,21,1,0 +BRF:51 +BRH:8 +end_of_record +TN: +SF:/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/ContextMenu.js +FN:35,(anonymous_0) +FN:45,(anonymous_1) +FN:49,(anonymous_2) +FN:53,(anonymous_3) +FN:57,(anonymous_4) +FN:62,(anonymous_5) +FN:77,(anonymous_6) +FN:85,(anonymous_7) +FN:94,(anonymous_8) +FN:103,(anonymous_9) +FN:113,(anonymous_10) +FN:121,(anonymous_11) +FN:125,(anonymous_12) +FN:138,(anonymous_13) +FN:145,(anonymous_14) +FN:151,(anonymous_15) +FN:181,(anonymous_16) +FN:185,(anonymous_17) +FNF:18 +FNH:13 +FNDA:7,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:7,(anonymous_2) +FNDA:11,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:7,(anonymous_6) +FNDA:6,(anonymous_7) +FNDA:12,(anonymous_8) +FNDA:8,(anonymous_9) +FNDA:6,(anonymous_10) +FNDA:1,(anonymous_11) +FNDA:1,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:2,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:14,(anonymous_16) +FNDA:18,(anonymous_17) +DA:29,1 +DA:30,0 +DA:31,5 +DA:36,7 +DA:38,7 +DA:46,0 +DA:50,7 +DA:54,11 +DA:55,6 +DA:57,6 +DA:58,0 +DA:60,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:71,5 +DA:72,5 +DA:73,5 +DA:78,7 +DA:79,7 +DA:82,7 +DA:86,6 +DA:87,6 +DA:88,6 +DA:89,6 +DA:90,6 +DA:91,6 +DA:95,12 +DA:96,12 +DA:97,12 +DA:98,12 +DA:99,12 +DA:100,12 +DA:104,8 +DA:106,6 +DA:108,6 +DA:109,6 +DA:110,6 +DA:114,6 +DA:115,5 +DA:116,5 +DA:117,5 +DA:122,1 +DA:126,1 +DA:128,1 +DA:135,1 +DA:139,0 +DA:140,0 +DA:142,0 +DA:146,2 +DA:147,2 +DA:152,0 +DA:157,0 +DA:159,0 +DA:160,0 +DA:162,0 +DA:163,0 +DA:166,0 +DA:167,0 +DA:170,0 +DA:171,0 +DA:174,0 +DA:175,0 +DA:178,0 +DA:182,14 +DA:186,18 +DA:187,18 +DA:188,18 +DA:193,18 +DA:197,18 +LF:73 +LH:47 +BRDA:54,0,0,6 +BRDA:54,0,1,5 +BRDA:55,1,0,6 +BRDA:55,1,1,0 +BRDA:63,2,0,0 +BRDA:63,2,1,0 +BRDA:71,3,0,0 +BRDA:71,3,1,5 +BRDA:78,4,0,7 +BRDA:78,4,1,0 +BRDA:104,5,0,2 +BRDA:104,5,1,6 +BRDA:104,6,0,8 +BRDA:104,6,1,7 +BRDA:114,7,0,5 +BRDA:114,7,1,1 +BRDA:114,8,0,6 +BRDA:114,8,1,5 +BRDA:114,8,2,5 +BRDA:114,8,3,0 +BRDA:122,9,0,1 +BRDA:122,9,1,0 +BRDA:135,10,0,1 +BRDA:135,10,1,0 +BRDA:139,11,0,0 +BRDA:139,11,1,0 +BRDA:146,12,0,2 +BRDA:146,12,1,0 +BRDA:146,13,0,2 +BRDA:146,13,1,1 +BRDA:151,14,0,0 +BRDA:151,15,0,0 +BRDA:157,16,0,0 +BRDA:157,16,1,0 +BRDA:162,17,0,0 +BRDA:162,17,1,0 +BRDA:166,18,0,0 +BRDA:166,18,1,0 +BRDA:170,19,0,0 +BRDA:170,19,1,0 +BRDA:171,20,0,0 +BRDA:171,20,1,0 +BRDA:174,21,0,0 +BRDA:174,21,1,0 +BRDA:175,22,0,0 +BRDA:175,22,1,0 +BRF:46 +BRH:19 +end_of_record +TN: +SF:/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/MenuItem.js +FN:32,(anonymous_0) +FN:33,(anonymous_1) +FN:36,(anonymous_2) +FN:53,(anonymous_3) +FN:66,(anonymous_4) +FNF:5 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +DA:29,0 +DA:32,0 +DA:33,0 +DA:37,0 +DA:39,0 +DA:41,0 +DA:48,0 +DA:50,0 +DA:54,0 +DA:55,0 +DA:61,0 +DA:66,0 +LF:12 +LH:0 +BRDA:39,0,0,0 +BRDA:39,0,1,0 +BRDA:39,1,0,0 +BRDA:39,1,1,0 +BRDA:48,2,0,0 +BRDA:48,2,1,0 +BRDA:64,3,0,0 +BRDA:64,3,1,0 +BRDA:65,4,0,0 +BRDA:65,4,1,0 +BRDA:69,5,0,0 +BRDA:69,5,1,0 +BRF:12 +BRH:0 +end_of_record +TN: +SF:/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/SubMenu.js +FN:34,(anonymous_0) +FN:35,(anonymous_1) +FN:37,(anonymous_2) +FN:38,(anonymous_3) +FN:41,(anonymous_4) +FN:49,(anonymous_5) +FN:50,(anonymous_6) +FN:53,(anonymous_7) +FN:57,(anonymous_8) +FN:65,(anonymous_9) +FN:69,(anonymous_10) +FN:89,(anonymous_11) +FN:102,(anonymous_12) +FN:114,(anonymous_13) +FN:134,(anonymous_14) +FN:154,(anonymous_15) +FN:167,(anonymous_16) +FN:180,(anonymous_17) +FN:185,(anonymous_18) +FN:191,(anonymous_19) +FN:196,(anonymous_20) +FN:202,(anonymous_21) +FN:206,(anonymous_22) +FN:210,(anonymous_23) +FN:215,(anonymous_24) +FN:222,(anonymous_25) +FNF:26 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +FNDA:0,(anonymous_18) +FNDA:0,(anonymous_19) +FNDA:0,(anonymous_20) +FNDA:0,(anonymous_21) +FNDA:0,(anonymous_22) +FNDA:0,(anonymous_23) +FNDA:0,(anonymous_24) +FNDA:0,(anonymous_25) +DA:34,0 +DA:35,0 +DA:37,0 +DA:38,0 +DA:42,0 +DA:44,0 +DA:50,0 +DA:54,0 +DA:58,0 +DA:62,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:85,0 +DA:86,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:97,0 +DA:98,0 +DA:103,0 +DA:104,0 +DA:107,0 +DA:109,0 +DA:111,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:119,0 +DA:120,0 +DA:122,0 +DA:125,0 +DA:126,0 +DA:128,0 +DA:131,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:139,0 +DA:140,0 +DA:142,0 +DA:145,0 +DA:146,0 +DA:148,0 +DA:151,0 +DA:156,0 +DA:157,0 +DA:160,0 +DA:161,0 +DA:163,0 +DA:164,0 +DA:168,0 +DA:170,0 +DA:172,0 +DA:181,0 +DA:183,0 +DA:185,0 +DA:192,0 +DA:194,0 +DA:196,0 +DA:203,0 +DA:207,0 +DA:211,0 +DA:212,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:234,0 +DA:244,0 +DA:255,0 +LF:88 +LH:0 +BRDA:58,0,0,0 +BRDA:58,0,1,0 +BRDA:58,0,2,0 +BRDA:58,0,3,0 +BRDA:60,1,0,0 +BRDA:60,1,1,0 +BRDA:61,2,0,0 +BRDA:61,2,1,0 +BRDA:66,3,0,0 +BRDA:66,3,1,0 +BRDA:67,4,0,0 +BRDA:67,4,1,0 +BRDA:67,5,0,0 +BRDA:67,5,1,0 +BRDA:68,6,0,0 +BRDA:68,6,1,0 +BRDA:70,7,0,0 +BRDA:70,7,1,0 +BRDA:79,8,0,0 +BRDA:79,8,1,0 +BRDA:80,9,0,0 +BRDA:80,9,1,0 +BRDA:81,10,0,0 +BRDA:81,10,1,0 +BRDA:82,11,0,0 +BRDA:82,11,1,0 +BRDA:103,12,0,0 +BRDA:103,12,1,0 +BRDA:107,13,0,0 +BRDA:107,13,1,0 +BRDA:109,14,0,0 +BRDA:109,14,1,0 +BRDA:119,15,0,0 +BRDA:119,15,1,0 +BRDA:125,16,0,0 +BRDA:125,16,1,0 +BRDA:139,17,0,0 +BRDA:139,17,1,0 +BRDA:145,18,0,0 +BRDA:145,18,1,0 +BRDA:156,19,0,0 +BRDA:156,19,1,0 +BRDA:156,20,0,0 +BRDA:156,20,1,0 +BRDA:156,20,2,0 +BRDA:156,20,3,0 +BRDA:160,21,0,0 +BRDA:160,21,1,0 +BRDA:170,22,0,0 +BRDA:170,22,1,0 +BRDA:181,23,0,0 +BRDA:181,23,1,0 +BRDA:183,24,0,0 +BRDA:183,24,1,0 +BRDA:183,25,0,0 +BRDA:183,25,1,0 +BRDA:192,26,0,0 +BRDA:192,26,1,0 +BRDA:194,27,0,0 +BRDA:194,27,1,0 +BRDA:217,28,0,0 +BRDA:217,28,1,0 +BRF:62 +BRH:0 +end_of_record +TN: +SF:/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/actions.js +FN:9,dispatchGlobalEvent +FN:27,showMenu +FN:31,hideMenu +FNF:3 +FNH:3 +FNDA:16,dispatchGlobalEvent +FNDA:9,showMenu +FNDA:7,hideMenu +DA:5,2 +DA:6,2 +DA:14,16 +DA:15,16 +DA:17,0 +DA:18,0 +DA:21,16 +DA:22,16 +DA:23,16 +DA:28,9 +DA:32,7 +LF:11 +LH:9 +BRDA:9,0,0,16 +BRDA:14,1,0,16 +BRDA:14,1,1,0 +BRDA:21,2,0,16 +BRDA:21,2,1,0 +BRDA:27,3,0,1 +BRDA:31,4,0,7 +BRF:7 +BRH:5 +end_of_record +TN: +SF:/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/globalEventListener.js +FN:5,(anonymous_0) +FN:14,(anonymous_1) +FN:20,(anonymous_2) +FN:26,(anonymous_3) +FN:37,(anonymous_4) +FNF:5 +FNH:5 +FNDA:1,(anonymous_0) +FNDA:8,(anonymous_1) +FNDA:6,(anonymous_2) +FNDA:7,(anonymous_3) +FNDA:7,(anonymous_4) +DA:6,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:15,8 +DA:16,8 +DA:21,6 +DA:22,6 +DA:27,7 +DA:29,7 +DA:34,7 +DA:38,7 +DA:39,7 +LF:13 +LH:13 +BRDA:8,0,0,1 +BRDA:8,0,1,0 +BRDA:16,1,0,8 +BRDA:16,1,1,0 +BRDA:22,2,0,6 +BRDA:22,2,1,0 +BRDA:38,3,0,7 +BRDA:38,3,1,0 +BRDA:38,4,0,7 +BRDA:38,4,1,7 +BRF:10 +BRH:6 +end_of_record +TN: +SF:/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/helpers.js +FN:1,callIfExists +FN:5,hasOwnProp +FN:9,uniqueId +FNF:3 +FNH:3 +FNDA:12,callIfExists +FNDA:14,hasOwnProp +FNDA:7,uniqueId +DA:2,12 +DA:6,14 +DA:10,7 +DA:13,2 +DA:25,2 +DA:27,2 +LF:6 +LH:6 +BRDA:2,0,0,12 +BRDA:2,0,1,12 +BRDA:28,1,0,2 +BRDA:28,1,1,2 +BRDA:28,1,2,2 +BRF:5 +BRH:5 +end_of_record diff --git a/dist/react-contextmenu.js b/dist/react-contextmenu.js new file mode 100644 index 00000000..403b0d6a --- /dev/null +++ b/dist/react-contextmenu.js @@ -0,0 +1,11 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("react")):"function"==typeof define&&define.amd?define(["react"],t):"object"==typeof exports?exports.ReactContextMenu=t(require("react")):e.ReactContextMenu=t(e.React)}(this,function(e){return function(e){function t(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=11)}([function(t,n){t.exports=e},function(e,t,n){"use strict";function o(e){for(var t=arguments.length,n=Array(t>1?t-1:0),o=1;o2&&void 0!==arguments[2]?arguments[2]:window,o=void 0;"function"==typeof window.CustomEvent?o=new window.CustomEvent(e,{detail:t}):(o=document.createEvent("CustomEvent"),o.initCustomEvent(e,!1,!0,t)),n&&(n.dispatchEvent(o),u()(s.e,t))}function r(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];o(c,u()({},e,{type:c}),t)}function i(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];o(l,u()({},e,{type:l}),t)}n.d(t,"b",function(){return c}),n.d(t,"a",function(){return l}),t.d=r,t.c=i;var a=n(3),u=n.n(a),s=n(1),c="REACT_CONTEXTMENU_SHOW",l="REACT_CONTEXTMENU_HIDE"},function(e,t,n){var o,r;/*! + Copyright (c) 2017 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/ +!function(){"use strict";function n(){for(var e=[],t=0;to?i.bottom=0:i.top=0,r.rightt?r.bottom=0:r.top=0,o.left<0?r.left="100%":r.right="100%",r},n.hideMenu=function(e){e.detail&&e.detail.id&&n.menu&&e.detail.id!==n.menu.id||(n.props.forceOpen&&n.props.forceClose(),n.setState({visible:!1,selectedItem:null}),n.unregisterHandlers())},n.handleClick=function(e){e.preventDefault(),n.props.disabled||Object(m.a)(n.props.onClick,e,h()({},n.props.data,m.e.data),m.e.target)},n.handleMouseEnter=function(){n.closetimer&&clearTimeout(n.closetimer),n.props.disabled||n.state.visible||(n.opentimer=setTimeout(function(){return n.setState({visible:!0,selectedItem:null})},n.props.hoverDelay))},n.handleMouseLeave=function(){n.opentimer&&clearTimeout(n.opentimer),n.state.visible&&(n.closetimer=setTimeout(function(){return n.setState({visible:!1,selectedItem:null})},n.props.hoverDelay))},n.menuRef=function(e){n.menu=e},n.subMenuRef=function(e){n.subMenu=e},n.registerHandlers=function(){document.removeEventListener("keydown",n.props.parentKeyNavigationHandler),document.addEventListener("keydown",n.handleKeyNavigation)},n.unregisterHandlers=function(e){document.removeEventListener("keydown",n.handleKeyNavigation),e||document.addEventListener("keydown",n.props.parentKeyNavigationHandler)},n.state=h()({},n.state,{visible:!1}),n}return a(t,e),O(t,[{key:"componentDidMount",value:function(){this.listenId=v.a.register(function(){},this.hideMenu)}},{key:"getSubMenuType",value:function(){return t}},{key:"shouldComponentUpdate",value:function(e,t){return this.isVisibilityChange=!(this.state.visible===t.visible&&this.props.forceOpen===e.forceOpen||this.state.visible&&e.forceOpen||this.props.forceOpen&&t.visible),!0}},{key:"componentDidUpdate",value:function(){var e=this;if(this.isVisibilityChange)if(this.props.forceOpen||this.state.visible){var t=window.requestAnimationFrame||setTimeout;t(function(){var t=e.props.rtl?e.getRTLMenuPosition():e.getMenuPosition();e.subMenu.style.removeProperty("top"),e.subMenu.style.removeProperty("bottom"),e.subMenu.style.removeProperty("left"),e.subMenu.style.removeProperty("right"),Object(m.d)(t,"top")&&(e.subMenu.style.top=t.top),Object(m.d)(t,"left")&&(e.subMenu.style.left=t.left),Object(m.d)(t,"bottom")&&(e.subMenu.style.bottom=t.bottom),Object(m.d)(t,"right")&&(e.subMenu.style.right=t.right),e.subMenu.classList.add(m.c.menuVisible),e.registerHandlers(),e.setState({selectedItem:null})})}else{var n=function t(){e.subMenu.removeEventListener("transitionend",t),e.subMenu.style.removeProperty("bottom"),e.subMenu.style.removeProperty("right"),e.subMenu.style.top=0,e.subMenu.style.left="100%",e.unregisterHandlers()};this.subMenu.addEventListener("transitionend",n),this.subMenu.classList.remove(m.c.menuVisible)}}},{key:"componentWillUnmount",value:function(){this.listenId&&v.a.unregister(this.listenId),this.opentimer&&clearTimeout(this.opentimer),this.closetimer&&clearTimeout(this.closetimer),this.unregisterHandlers(!0)}},{key:"render",value:function(){var e,t=this.props,n=t.children,r=t.attributes,i=t.disabled,a=t.title,u=t.selected,c=this.state.visible,l={ref:this.menuRef,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave,className:p()(m.c.menuItem,m.c.subMenu,r.listClassName),style:{position:"relative"}},d={className:p()(m.c.menuItem,r.className,(e={},o(e,p()(m.c.menuItemDisabled,r.disabledClassName),i),o(e,p()(m.c.menuItemActive,r.visibleClassName),c),o(e,p()(m.c.menuItemSelected,r.selectedClassName),u),e)),onMouseMove:this.props.onMouseMove,onMouseOut:this.props.onMouseOut,onClick:this.handleClick},f={ref:this.subMenuRef,style:{position:"absolute",transition:"opacity 1ms",top:0,left:"100%"},className:p()(m.c.menu,this.props.className)};return s.a.createElement("nav",y({},l,{role:"menuitem",tabIndex:"-1","aria-haspopup":"true"}),s.a.createElement("div",y({},r,d),a),s.a.createElement("nav",y({},f,{role:"menu",tabIndex:"-1"}),this.renderChildren(n)))}}]),t}(b.a);g.propTypes={children:l.a.node.isRequired,attributes:l.a.object,title:l.a.node.isRequired,className:l.a.string,disabled:l.a.bool,hoverDelay:l.a.number,rtl:l.a.bool,selected:l.a.bool,onMouseMove:l.a.func,onMouseOut:l.a.func,forceOpen:l.a.bool,forceClose:l.a.func,parentKeyNavigationHandler:l.a.func},g.defaultProps={disabled:!1,hoverDelay:500,attributes:{},className:"",rtl:!1,selected:!1,onMouseMove:function(){return null},onMouseOut:function(){return null},forceOpen:!1,forceClose:function(){return null},parentKeyNavigationHandler:function(){return null}},t.a=g},function(e,t,n){"use strict";function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(0),u=n.n(a),s=n(2),c=n.n(s),l=n(5),d=n.n(l),p=n(3),f=n.n(p),h=n(4),b=n(1),m=function(){function e(e,t){for(var n=0;n=0&&0===e.button&&(e.persist(),e.stopPropagation(),i.mouseDownTimeoutId=setTimeout(function(){return i.handleContextClick(e)},i.props.holdToDisplay)),Object(b.a)(i.props.attributes.onMouseDown,e)},i.handleMouseUp=function(e){0===e.button&&clearTimeout(i.mouseDownTimeoutId),Object(b.a)(i.props.attributes.onMouseUp,e)},i.handleMouseOut=function(e){0===e.button&&clearTimeout(i.mouseDownTimeoutId),Object(b.a)(i.props.attributes.onMouseOut,e)},i.handleTouchstart=function(e){i.touchHandled=!1,i.props.holdToDisplay>=0&&(e.persist(),e.stopPropagation(),i.touchstartTimeoutId=setTimeout(function(){i.handleContextClick(e),i.touchHandled=!0},i.props.holdToDisplay)),Object(b.a)(i.props.attributes.onTouchStart,e)},i.handleTouchEnd=function(e){i.touchHandled&&e.preventDefault(),clearTimeout(i.touchstartTimeoutId),Object(b.a)(i.props.attributes.onTouchEnd,e)},i.handleContextMenu=function(e){i.handleContextClick(e),Object(b.a)(i.props.attributes.onContextMenu,e)},i.handleContextClick=function(e){if(console.log(i.props),!i.props.disable){e.preventDefault(),e.stopPropagation();var t=e.clientX||e.touches&&e.touches[0].pageX,n=e.clientY||e.touches&&e.touches[0].pageY;Object(h.c)();var o=Object(b.a)(i.props.collect,i.props),r={position:{x:t,y:n},target:i.elem,id:i.props.id,data:o};o&&"function"==typeof o.then?o.then(function(e){r.data=e,Object(h.d)(r)}):Object(h.d)(r)}},i.elemRef=function(e){i.elem=e},a=n,r(i,a)}return i(t,e),m(t,[{key:"render",value:function(){var e=this.props,t=e.renderTag,n=e.attributes,o=e.children,r=f()({},n,{className:d()(b.c.menuWrapper,n.className),onContextMenu:this.handleContextMenu,onMouseDown:this.handleMouseDown,onMouseUp:this.handleMouseUp,onTouchStart:this.handleTouchstart,onTouchEnd:this.handleTouchEnd,onMouseOut:this.handleMouseOut,ref:this.elemRef});return u.a.createElement(t,r,o)}}]),t}(a.Component);v.propTypes={id:c.a.string.isRequired,children:c.a.node.isRequired,attributes:c.a.object,collect:c.a.func,disable:c.a.bool,holdToDisplay:c.a.number,renderTag:c.a.oneOfType([c.a.node,c.a.func])},v.defaultProps={attributes:{},collect:function(){return null},disable:!1,holdToDisplay:1e3,renderTag:"div"},t.a=v},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n(12);n.d(t,"ContextMenu",function(){return o.a});var r=n(10);n.d(t,"ContextMenuTrigger",function(){return r.a});var i=n(8);n.d(t,"MenuItem",function(){return i.a});var a=n(9);n.d(t,"SubMenu",function(){return a.a});var u=n(15);n.d(t,"connectMenu",function(){return u.a});var s=n(4);n.d(t,"hideMenu",function(){return s.c}),n.d(t,"showMenu",function(){return s.d})},function(e,t,n){"use strict";function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=n(0),s=n.n(u),c=n(2),l=n.n(c),d=n(5),p=n.n(d),f=n(3),h=n.n(f),b=n(6),m=n(7),v=n(9),y=n(4),O=n(1),g=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o={top:t,left:e};if(!n.menu)return o;var r=window,i=r.innerWidth,a=r.innerHeight,u=n.menu.getBoundingClientRect();return t+u.height>a&&(o.top-=u.height),e+u.width>i&&(o.left-=u.width),o.top<0&&(o.top=u.height 0 && arguments[0] !== undefined ? arguments[0] : 0; + var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + var menuStyles = { + top: y, + left: x + }; + + if (!_this.menu) return menuStyles; + + var _window = window, + innerWidth = _window.innerWidth, + innerHeight = _window.innerHeight; + + var rect = _this.menu.getBoundingClientRect(); + + if (y + rect.height > innerHeight) { + menuStyles.top -= rect.height; + } + + if (x + rect.width > innerWidth) { + menuStyles.left -= rect.width; + } + + if (menuStyles.top < 0) { + menuStyles.top = rect.height < innerHeight ? (innerHeight - rect.height) / 2 : 0; + } + + if (menuStyles.left < 0) { + menuStyles.left = rect.width < innerWidth ? (innerWidth - rect.width) / 2 : 0; + } + + return menuStyles; + }; + + _this.menuRef = function (c) { + _this.menu = c; + }; + + _this.state = assign({}, _this.state, { + x: 0, + y: 0, + isVisible: false + }); + return _this; + } + + _createClass(ContextMenu, [{ + key: 'getSubMenuType', + value: function getSubMenuType() { + // eslint-disable-line class-methods-use-this + return SubMenu; + } + }, { + key: 'componentDidMount', + value: function componentDidMount() { + this.listenId = listener.register(this.handleShow, this.handleHide); + } + }, { + key: 'componentDidUpdate', + value: function componentDidUpdate() { + var _this2 = this; + + if (this.state.isVisible) { + var wrapper = window.requestAnimationFrame || setTimeout; + + wrapper(function () { + var _state = _this2.state, + x = _state.x, + y = _state.y; + + var _getMenuPosition = _this2.getMenuPosition(x, y), + top = _getMenuPosition.top, + left = _getMenuPosition.left; + + wrapper(function () { + if (!_this2.menu) return; + _this2.menu.style.top = top + 'px'; + _this2.menu.style.left = left + 'px'; + _this2.menu.style.opacity = 1; + _this2.menu.style.pointerEvents = 'auto'; + }); + }); + } else { + if (!this.menu) return; + this.menu.style.opacity = 0; + this.menu.style.pointerEvents = 'none'; + } + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + if (this.listenId) { + listener.unregister(this.listenId); + } + + this.unregisterHandlers(); + } + }, { + key: 'render', + value: function render() { + var _props = this.props, + children = _props.children, + className = _props.className, + style = _props.style; + var isVisible = this.state.isVisible; + + var inlineStyle = assign({}, style, { position: 'fixed', opacity: 0, pointerEvents: 'none' }); + var menuClassnames = cx(cssClasses.menu, className, _defineProperty({}, cssClasses.menuVisible, isVisible)); + + return React.createElement( + 'nav', + { + role: 'menu', tabIndex: '-1', ref: this.menuRef, style: inlineStyle, className: menuClassnames, + onContextMenu: this.handleContextMenu, onMouseLeave: this.handleMouseLeave }, + this.renderChildren(children) + ); + } + }]); + + return ContextMenu; +}(AbstractMenu); + +ContextMenu.propTypes = { + id: PropTypes.string.isRequired, + children: PropTypes.node.isRequired, + data: PropTypes.object, + className: PropTypes.string, + hideOnLeave: PropTypes.bool, + onHide: PropTypes.func, + onMouseLeave: PropTypes.func, + onShow: PropTypes.func, + style: PropTypes.object +}; +ContextMenu.defaultProps = { + className: '', + data: {}, + hideOnLeave: false, + onHide: function onHide() { + return null; + }, + onMouseLeave: function onMouseLeave() { + return null; + }, + onShow: function onShow() { + return null; + }, + + style: {} +}; +export default ContextMenu; \ No newline at end of file diff --git a/es6/ContextMenuTrigger.js b/es6/ContextMenuTrigger.js new file mode 100644 index 00000000..61d6761a --- /dev/null +++ b/es6/ContextMenuTrigger.js @@ -0,0 +1,151 @@ +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import cx from 'classnames'; +import assign from 'object-assign'; + +import { showMenu, hideMenu } from './actions'; +import { callIfExists, cssClasses } from './helpers'; + +var ContextMenuTrigger = function (_Component) { + _inherits(ContextMenuTrigger, _Component); + + function ContextMenuTrigger() { + var _ref; + + var _temp, _this, _ret; + + _classCallCheck(this, ContextMenuTrigger); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = ContextMenuTrigger.__proto__ || Object.getPrototypeOf(ContextMenuTrigger)).call.apply(_ref, [this].concat(args))), _this), _this.touchHandled = false, _this.handleMouseDown = function (event) { + if (_this.props.holdToDisplay >= 0 && event.button === 0) { + event.persist(); + event.stopPropagation(); + + _this.mouseDownTimeoutId = setTimeout(function () { + return _this.handleContextClick(event); + }, _this.props.holdToDisplay); + } + callIfExists(_this.props.attributes.onMouseDown, event); + }, _this.handleMouseUp = function (event) { + if (event.button === 0) { + clearTimeout(_this.mouseDownTimeoutId); + } + callIfExists(_this.props.attributes.onMouseUp, event); + }, _this.handleMouseOut = function (event) { + if (event.button === 0) { + clearTimeout(_this.mouseDownTimeoutId); + } + callIfExists(_this.props.attributes.onMouseOut, event); + }, _this.handleTouchstart = function (event) { + _this.touchHandled = false; + + if (_this.props.holdToDisplay >= 0) { + event.persist(); + event.stopPropagation(); + + _this.touchstartTimeoutId = setTimeout(function () { + _this.handleContextClick(event); + _this.touchHandled = true; + }, _this.props.holdToDisplay); + } + callIfExists(_this.props.attributes.onTouchStart, event); + }, _this.handleTouchEnd = function (event) { + if (_this.touchHandled) { + event.preventDefault(); + } + clearTimeout(_this.touchstartTimeoutId); + callIfExists(_this.props.attributes.onTouchEnd, event); + }, _this.handleContextMenu = function (event) { + _this.handleContextClick(event); + callIfExists(_this.props.attributes.onContextMenu, event); + }, _this.handleContextClick = function (event) { + console.log(_this.props); + if (_this.props.disable) return; + + event.preventDefault(); + event.stopPropagation(); + + var x = event.clientX || event.touches && event.touches[0].pageX; + var y = event.clientY || event.touches && event.touches[0].pageY; + + hideMenu(); + + var data = callIfExists(_this.props.collect, _this.props); + var showMenuConfig = { + position: { x: x, y: y }, + target: _this.elem, + id: _this.props.id, + data: data + }; + if (data && typeof data.then === 'function') { + // it's promise + data.then(function (resp) { + showMenuConfig.data = resp; + showMenu(showMenuConfig); + }); + } else { + showMenu(showMenuConfig); + } + }, _this.elemRef = function (c) { + _this.elem = c; + }, _temp), _possibleConstructorReturn(_this, _ret); + } + + _createClass(ContextMenuTrigger, [{ + key: 'render', + value: function render() { + var _props = this.props, + renderTag = _props.renderTag, + attributes = _props.attributes, + children = _props.children; + + var newAttrs = assign({}, attributes, { + className: cx(cssClasses.menuWrapper, attributes.className), + onContextMenu: this.handleContextMenu, + onMouseDown: this.handleMouseDown, + onMouseUp: this.handleMouseUp, + onTouchStart: this.handleTouchstart, + onTouchEnd: this.handleTouchEnd, + onMouseOut: this.handleMouseOut, + ref: this.elemRef + }); + + return React.createElement(renderTag, newAttrs, children); + } + }]); + + return ContextMenuTrigger; +}(Component); + +ContextMenuTrigger.propTypes = { + id: PropTypes.string.isRequired, + children: PropTypes.node.isRequired, + attributes: PropTypes.object, + collect: PropTypes.func, + disable: PropTypes.bool, + holdToDisplay: PropTypes.number, + renderTag: PropTypes.oneOfType([PropTypes.node, PropTypes.func]) +}; +ContextMenuTrigger.defaultProps = { + attributes: {}, + collect: function collect() { + return null; + }, + + disable: false, + holdToDisplay: 1000, + renderTag: 'div' +}; +export default ContextMenuTrigger; \ No newline at end of file diff --git a/es6/MenuItem.js b/es6/MenuItem.js new file mode 100644 index 00000000..5e1836d7 --- /dev/null +++ b/es6/MenuItem.js @@ -0,0 +1,112 @@ +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import cx from 'classnames'; +import assign from 'object-assign'; + +import { hideMenu } from './actions'; +import { callIfExists, cssClasses, store } from './helpers'; + +var MenuItem = function (_Component) { + _inherits(MenuItem, _Component); + + function MenuItem() { + var _ref; + + var _temp, _this, _ret; + + _classCallCheck(this, MenuItem); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = MenuItem.__proto__ || Object.getPrototypeOf(MenuItem)).call.apply(_ref, [this].concat(args))), _this), _this.handleClick = function (event) { + event.preventDefault(); + + if (_this.props.disabled || _this.props.divider) return; + + callIfExists(_this.props.onClick, event, assign({}, _this.props.data, store.data), store.target); + + if (_this.props.preventClose) return; + + hideMenu(); + }, _temp), _possibleConstructorReturn(_this, _ret); + } + + _createClass(MenuItem, [{ + key: 'render', + value: function render() { + var _cx, + _this2 = this; + + var _props = this.props, + disabled = _props.disabled, + divider = _props.divider, + children = _props.children, + attributes = _props.attributes, + selected = _props.selected; + + var menuItemClassNames = cx(cssClasses.menuItem, attributes.className, (_cx = {}, _defineProperty(_cx, cx(cssClasses.menuItemDisabled, attributes.disabledClassName), disabled), _defineProperty(_cx, cx(cssClasses.menuItemDivider, attributes.dividerClassName), divider), _defineProperty(_cx, cx(cssClasses.menuItemSelected, attributes.selectedClassName), selected), _cx)); + + return React.createElement( + 'div', + _extends({}, attributes, { className: menuItemClassNames, + role: 'menuitem', tabIndex: '-1', 'aria-disabled': disabled ? 'true' : 'false', + 'aria-orientation': divider ? 'horizontal' : null, + ref: function ref(_ref2) { + _this2.ref = _ref2; + }, + onMouseMove: this.props.onMouseMove, onMouseLeave: this.props.onMouseLeave, + onTouchEnd: this.handleClick, onClick: this.handleClick }), + divider ? null : children + ); + } + }]); + + return MenuItem; +}(Component); + +MenuItem.propTypes = { + children: PropTypes.node, + attributes: PropTypes.object, + data: PropTypes.object, + disabled: PropTypes.bool, + divider: PropTypes.bool, + preventClose: PropTypes.bool, + onClick: PropTypes.func, + selected: PropTypes.bool, + onMouseMove: PropTypes.func, + onMouseLeave: PropTypes.func +}; +MenuItem.defaultProps = { + disabled: false, + data: {}, + divider: false, + attributes: {}, + preventClose: false, + onClick: function onClick() { + return null; + }, + + children: null, + selected: false, + onMouseMove: function onMouseMove() { + return null; + }, + onMouseLeave: function onMouseLeave() { + return null; + } +}; +export default MenuItem; \ No newline at end of file diff --git a/es6/SubMenu.js b/es6/SubMenu.js new file mode 100644 index 00000000..39f87326 --- /dev/null +++ b/es6/SubMenu.js @@ -0,0 +1,311 @@ +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +import React from 'react'; +import PropTypes from 'prop-types'; +import cx from 'classnames'; +import assign from 'object-assign'; + +import AbstractMenu from './AbstractMenu'; +import { callIfExists, cssClasses, hasOwnProp, store } from './helpers'; +import listener from './globalEventListener'; + +var SubMenu = function (_AbstractMenu) { + _inherits(SubMenu, _AbstractMenu); + + function SubMenu(props) { + _classCallCheck(this, SubMenu); + + var _this = _possibleConstructorReturn(this, (SubMenu.__proto__ || Object.getPrototypeOf(SubMenu)).call(this, props)); + + _this.getMenuPosition = function () { + var _window = window, + innerWidth = _window.innerWidth, + innerHeight = _window.innerHeight; + + var rect = _this.subMenu.getBoundingClientRect(); + var position = {}; + + if (rect.bottom > innerHeight) { + position.bottom = 0; + } else { + position.top = 0; + } + + if (rect.right < innerWidth) { + position.left = '100%'; + } else { + position.right = '100%'; + } + + return position; + }; + + _this.getRTLMenuPosition = function () { + var _window2 = window, + innerHeight = _window2.innerHeight; + + var rect = _this.subMenu.getBoundingClientRect(); + var position = {}; + + if (rect.bottom > innerHeight) { + position.bottom = 0; + } else { + position.top = 0; + } + + if (rect.left < 0) { + position.left = '100%'; + } else { + position.right = '100%'; + } + + return position; + }; + + _this.hideMenu = function (e) { + // avoid closing submenus of a different menu tree + if (e.detail && e.detail.id && _this.menu && e.detail.id !== _this.menu.id) { + return; + } + + if (_this.props.forceOpen) { + _this.props.forceClose(); + } + _this.setState({ visible: false, selectedItem: null }); + _this.unregisterHandlers(); + }; + + _this.handleClick = function (event) { + event.preventDefault(); + + if (_this.props.disabled) return; + + callIfExists(_this.props.onClick, event, assign({}, _this.props.data, store.data), store.target); + }; + + _this.handleMouseEnter = function () { + if (_this.closetimer) clearTimeout(_this.closetimer); + + if (_this.props.disabled || _this.state.visible) return; + + _this.opentimer = setTimeout(function () { + return _this.setState({ + visible: true, + selectedItem: null + }); + }, _this.props.hoverDelay); + }; + + _this.handleMouseLeave = function () { + if (_this.opentimer) clearTimeout(_this.opentimer); + + if (!_this.state.visible) return; + + _this.closetimer = setTimeout(function () { + return _this.setState({ + visible: false, + selectedItem: null + }); + }, _this.props.hoverDelay); + }; + + _this.menuRef = function (c) { + _this.menu = c; + }; + + _this.subMenuRef = function (c) { + _this.subMenu = c; + }; + + _this.registerHandlers = function () { + document.removeEventListener('keydown', _this.props.parentKeyNavigationHandler); + document.addEventListener('keydown', _this.handleKeyNavigation); + }; + + _this.unregisterHandlers = function (dismounting) { + document.removeEventListener('keydown', _this.handleKeyNavigation); + if (!dismounting) { + document.addEventListener('keydown', _this.props.parentKeyNavigationHandler); + } + }; + + _this.state = assign({}, _this.state, { + visible: false + }); + return _this; + } + + _createClass(SubMenu, [{ + key: 'componentDidMount', + value: function componentDidMount() { + this.listenId = listener.register(function () {}, this.hideMenu); + } + }, { + key: 'getSubMenuType', + value: function getSubMenuType() { + // eslint-disable-line class-methods-use-this + return SubMenu; + } + }, { + key: 'shouldComponentUpdate', + value: function shouldComponentUpdate(nextProps, nextState) { + this.isVisibilityChange = (this.state.visible !== nextState.visible || this.props.forceOpen !== nextProps.forceOpen) && !(this.state.visible && nextProps.forceOpen) && !(this.props.forceOpen && nextState.visible); + return true; + } + }, { + key: 'componentDidUpdate', + value: function componentDidUpdate() { + var _this2 = this; + + if (!this.isVisibilityChange) return; + if (this.props.forceOpen || this.state.visible) { + var wrapper = window.requestAnimationFrame || setTimeout; + wrapper(function () { + var styles = _this2.props.rtl ? _this2.getRTLMenuPosition() : _this2.getMenuPosition(); + + _this2.subMenu.style.removeProperty('top'); + _this2.subMenu.style.removeProperty('bottom'); + _this2.subMenu.style.removeProperty('left'); + _this2.subMenu.style.removeProperty('right'); + + if (hasOwnProp(styles, 'top')) _this2.subMenu.style.top = styles.top; + if (hasOwnProp(styles, 'left')) _this2.subMenu.style.left = styles.left; + if (hasOwnProp(styles, 'bottom')) _this2.subMenu.style.bottom = styles.bottom; + if (hasOwnProp(styles, 'right')) _this2.subMenu.style.right = styles.right; + _this2.subMenu.classList.add(cssClasses.menuVisible); + + _this2.registerHandlers(); + _this2.setState({ selectedItem: null }); + }); + } else { + var cleanup = function cleanup() { + _this2.subMenu.removeEventListener('transitionend', cleanup); + _this2.subMenu.style.removeProperty('bottom'); + _this2.subMenu.style.removeProperty('right'); + _this2.subMenu.style.top = 0; + _this2.subMenu.style.left = '100%'; + _this2.unregisterHandlers(); + }; + this.subMenu.addEventListener('transitionend', cleanup); + this.subMenu.classList.remove(cssClasses.menuVisible); + } + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + if (this.listenId) { + listener.unregister(this.listenId); + } + + if (this.opentimer) clearTimeout(this.opentimer); + + if (this.closetimer) clearTimeout(this.closetimer); + + this.unregisterHandlers(true); + } + }, { + key: 'render', + value: function render() { + var _cx; + + var _props = this.props, + children = _props.children, + attributes = _props.attributes, + disabled = _props.disabled, + title = _props.title, + selected = _props.selected; + var visible = this.state.visible; + + var menuProps = { + ref: this.menuRef, + onMouseEnter: this.handleMouseEnter, + onMouseLeave: this.handleMouseLeave, + className: cx(cssClasses.menuItem, cssClasses.subMenu, attributes.listClassName), + style: { + position: 'relative' + } + }; + var menuItemProps = { + className: cx(cssClasses.menuItem, attributes.className, (_cx = {}, _defineProperty(_cx, cx(cssClasses.menuItemDisabled, attributes.disabledClassName), disabled), _defineProperty(_cx, cx(cssClasses.menuItemActive, attributes.visibleClassName), visible), _defineProperty(_cx, cx(cssClasses.menuItemSelected, attributes.selectedClassName), selected), _cx)), + onMouseMove: this.props.onMouseMove, + onMouseOut: this.props.onMouseOut, + onClick: this.handleClick + }; + var subMenuProps = { + ref: this.subMenuRef, + style: { + position: 'absolute', + transition: 'opacity 1ms', // trigger transitionend event + top: 0, + left: '100%' + }, + className: cx(cssClasses.menu, this.props.className) + }; + + return React.createElement( + 'nav', + _extends({}, menuProps, { role: 'menuitem', tabIndex: '-1', 'aria-haspopup': 'true' }), + React.createElement( + 'div', + _extends({}, attributes, menuItemProps), + title + ), + React.createElement( + 'nav', + _extends({}, subMenuProps, { role: 'menu', tabIndex: '-1' }), + this.renderChildren(children) + ) + ); + } + }]); + + return SubMenu; +}(AbstractMenu); + +SubMenu.propTypes = { + children: PropTypes.node.isRequired, + attributes: PropTypes.object, + title: PropTypes.node.isRequired, + className: PropTypes.string, + disabled: PropTypes.bool, + hoverDelay: PropTypes.number, + rtl: PropTypes.bool, + selected: PropTypes.bool, + onMouseMove: PropTypes.func, + onMouseOut: PropTypes.func, + forceOpen: PropTypes.bool, + forceClose: PropTypes.func, + parentKeyNavigationHandler: PropTypes.func +}; +SubMenu.defaultProps = { + disabled: false, + hoverDelay: 500, + attributes: {}, + className: '', + rtl: false, + selected: false, + onMouseMove: function onMouseMove() { + return null; + }, + onMouseOut: function onMouseOut() { + return null; + }, + forceOpen: false, + forceClose: function forceClose() { + return null; + }, + parentKeyNavigationHandler: function parentKeyNavigationHandler() { + return null; + } +}; +export default SubMenu; \ No newline at end of file diff --git a/es6/actions.js b/es6/actions.js new file mode 100644 index 00000000..fdee9e67 --- /dev/null +++ b/es6/actions.js @@ -0,0 +1,40 @@ +import assign from 'object-assign'; + +import { store } from './helpers'; + +export var MENU_SHOW = 'REACT_CONTEXTMENU_SHOW'; +export var MENU_HIDE = 'REACT_CONTEXTMENU_HIDE'; + +export function dispatchGlobalEvent(eventName, opts) { + var target = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : window; + + // Compatibale with IE + // @see http://stackoverflow.com/questions/26596123/internet-explorer-9-10-11-event-constructor-doesnt-work + var event = void 0; + + if (typeof window.CustomEvent === 'function') { + event = new window.CustomEvent(eventName, { detail: opts }); + } else { + event = document.createEvent('CustomEvent'); + event.initCustomEvent(eventName, false, true, opts); + } + + if (target) { + target.dispatchEvent(event); + assign(store, opts); + } +} + +export function showMenu() { + var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var target = arguments[1]; + + dispatchGlobalEvent(MENU_SHOW, assign({}, opts, { type: MENU_SHOW }), target); +} + +export function hideMenu() { + var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var target = arguments[1]; + + dispatchGlobalEvent(MENU_HIDE, assign({}, opts, { type: MENU_HIDE }), target); +} \ No newline at end of file diff --git a/es6/connectMenu.js b/es6/connectMenu.js new file mode 100644 index 00000000..f879bb75 --- /dev/null +++ b/es6/connectMenu.js @@ -0,0 +1,82 @@ +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +import React, { Component } from 'react'; + +import ContextMenuTrigger from './ContextMenuTrigger'; +import listener from './globalEventListener'; + +// collect ContextMenuTrigger's expected props to NOT pass them on as part of the context +var ignoredTriggerProps = [].concat(_toConsumableArray(Object.keys(ContextMenuTrigger.propTypes)), ['children']); + +// expect the id of the menu to be responsible for as outer parameter +export default function (menuId) { + // expect menu component to connect as inner parameter + // is presumably a wrapper of + return function (Child) { + // return wrapper for that forwards the ContextMenuTrigger's additional props + return function (_Component) { + _inherits(ConnectMenu, _Component); + + function ConnectMenu(props) { + _classCallCheck(this, ConnectMenu); + + var _this = _possibleConstructorReturn(this, (ConnectMenu.__proto__ || Object.getPrototypeOf(ConnectMenu)).call(this, props)); + + _this.handleShow = function (e) { + if (e.detail.id !== menuId) return; + + // the onShow event's detail.data object holds all ContextMenuTrigger props + var data = e.detail.data; + + var filteredData = {}; + + for (var key in data) { + // exclude props the ContextMenuTrigger is expecting itself + if (!ignoredTriggerProps.includes(key)) { + filteredData[key] = data[key]; + } + } + _this.setState({ trigger: filteredData }); + }; + + _this.handleHide = function () { + _this.setState({ trigger: null }); + }; + + _this.state = { trigger: null }; + return _this; + } + + _createClass(ConnectMenu, [{ + key: 'componentDidMount', + value: function componentDidMount() { + this.listenId = listener.register(this.handleShow, this.handleHide); + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + if (this.listenId) { + listener.unregister(this.listenId); + } + } + }, { + key: 'render', + value: function render() { + return React.createElement(Child, _extends({}, this.props, { id: menuId, trigger: this.state.trigger })); + } + }]); + + return ConnectMenu; + }(Component); + }; +} \ No newline at end of file diff --git a/es6/globalEventListener.js b/es6/globalEventListener.js new file mode 100644 index 00000000..03492f0d --- /dev/null +++ b/es6/globalEventListener.js @@ -0,0 +1,48 @@ +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +import { MENU_SHOW, MENU_HIDE } from './actions'; +import { uniqueId, hasOwnProp, canUseDOM } from './helpers'; + +var GlobalEventListener = function GlobalEventListener() { + var _this = this; + + _classCallCheck(this, GlobalEventListener); + + this.handleShowEvent = function (event) { + for (var id in _this.callbacks) { + if (hasOwnProp(_this.callbacks, id)) _this.callbacks[id].show(event); + } + }; + + this.handleHideEvent = function (event) { + for (var id in _this.callbacks) { + if (hasOwnProp(_this.callbacks, id)) _this.callbacks[id].hide(event); + } + }; + + this.register = function (showCallback, hideCallback) { + var id = uniqueId(); + + _this.callbacks[id] = { + show: showCallback, + hide: hideCallback + }; + + return id; + }; + + this.unregister = function (id) { + if (id && _this.callbacks[id]) { + delete _this.callbacks[id]; + } + }; + + this.callbacks = {}; + + if (canUseDOM) { + window.addEventListener(MENU_SHOW, this.handleShowEvent); + window.addEventListener(MENU_HIDE, this.handleHideEvent); + } +}; + +export default new GlobalEventListener(); \ No newline at end of file diff --git a/es6/helpers.js b/es6/helpers.js new file mode 100644 index 00000000..1b1e6b92 --- /dev/null +++ b/es6/helpers.js @@ -0,0 +1,31 @@ +export function callIfExists(func) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + return typeof func === 'function' && func.apply(undefined, args); +} + +export function hasOwnProp(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +export function uniqueId() { + return Math.random().toString(36).substring(7); +} + +export var cssClasses = { + menu: 'react-contextmenu', + menuVisible: 'react-contextmenu--visible', + menuWrapper: 'react-contextmenu-wrapper', + menuItem: 'react-contextmenu-item', + menuItemActive: 'react-contextmenu-item--active', + menuItemDisabled: 'react-contextmenu-item--disabled', + menuItemDivider: 'react-contextmenu-item--divider', + menuItemSelected: 'react-contextmenu-item--selected', + subMenu: 'react-contextmenu-submenu' +}; + +export var store = {}; + +export var canUseDOM = Boolean(typeof window !== 'undefined' && window.document && window.document.createElement); \ No newline at end of file diff --git a/es6/index.js b/es6/index.js new file mode 100644 index 00000000..623c1d2a --- /dev/null +++ b/es6/index.js @@ -0,0 +1,6 @@ +export { default as ContextMenu } from './ContextMenu'; +export { default as ContextMenuTrigger } from './ContextMenuTrigger'; +export { default as MenuItem } from './MenuItem'; +export { default as SubMenu } from './SubMenu'; +export { default as connectMenu } from './connectMenu'; +export { hideMenu, showMenu } from './actions'; \ No newline at end of file diff --git a/modules/AbstractMenu.js b/modules/AbstractMenu.js new file mode 100644 index 00000000..b229c74e --- /dev/null +++ b/modules/AbstractMenu.js @@ -0,0 +1,195 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _propTypes = require('prop-types'); + +var _propTypes2 = _interopRequireDefault(_propTypes); + +var _MenuItem = require('./MenuItem'); + +var _MenuItem2 = _interopRequireDefault(_MenuItem); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var AbstractMenu = function (_Component) { + _inherits(AbstractMenu, _Component); + + function AbstractMenu(props) { + _classCallCheck(this, AbstractMenu); + + var _this = _possibleConstructorReturn(this, (AbstractMenu.__proto__ || Object.getPrototypeOf(AbstractMenu)).call(this, props)); + + _initialiseProps.call(_this); + + _this.seletedItemRef = null; + _this.state = { + selectedItem: null, + forceSubMenuOpen: false + }; + return _this; + } + + return AbstractMenu; +}(_react.Component); + +AbstractMenu.propTypes = { + children: _propTypes2.default.node.isRequired +}; + +var _initialiseProps = function _initialiseProps() { + var _this2 = this; + + this.handleKeyNavigation = function (e) { + // check for isVisible strictly here as it might be undefined when this code executes in the context of SubMenu + // but we only need to check when it runs in the ContextMenu context + if (_this2.state.isVisible === false) { + return; + } + + switch (e.keyCode) { + case 37: // left arrow + case 27: + // escape + e.preventDefault(); + _this2.hideMenu(e); + break; + case 38: + // up arrow + e.preventDefault(); + _this2.selectChildren(true); + break; + case 40: + // down arrow + e.preventDefault(); + _this2.selectChildren(false); + break; + case 39: + // right arrow + _this2.tryToOpenSubMenu(e); + break; + case 13: + // enter + e.preventDefault(); + _this2.tryToOpenSubMenu(e); + { + // determine the selected item is disabled or not + var disabled = _this2.seletedItemRef && _this2.seletedItemRef.props && _this2.seletedItemRef.props.disabled; + + if (_this2.seletedItemRef && _this2.seletedItemRef.ref instanceof HTMLElement && !disabled) { + _this2.seletedItemRef.ref.click(); + } else { + _this2.hideMenu(e); + } + } + break; + default: + // do nothing + } + }; + + this.handleForceClose = function () { + _this2.setState({ forceSubMenuOpen: false }); + }; + + this.tryToOpenSubMenu = function (e) { + if (_this2.state.selectedItem && _this2.state.selectedItem.type === _this2.getSubMenuType()) { + e.preventDefault(); + _this2.setState({ forceSubMenuOpen: true }); + } + }; + + this.selectChildren = function (forward) { + var selectedItem = _this2.state.selectedItem; + + var children = []; + var childCollector = function childCollector(child) { + // child can be empty in case you do conditional rendering of components, in which + // case it should not be accounted for as a real child + if (!child) { + return; + } + + if ([_MenuItem2.default, _this2.getSubMenuType()].indexOf(child.type) < 0) { + // Maybe the MenuItem or SubMenu is capsuled in a wrapper div or something else + _react2.default.Children.forEach(child.props.children, childCollector); + } else if (!child.props.divider) { + children.push(child); + } + }; + _react2.default.Children.forEach(_this2.props.children, childCollector); + var currentIndex = children.indexOf(selectedItem); + if (currentIndex < 0) { + _this2.setState({ + selectedItem: forward ? children[children.length - 1] : children[0], + forceSubMenuOpen: false + }); + } else if (forward) { + _this2.setState({ + selectedItem: children[currentIndex - 1 < 0 ? children.length - 1 : currentIndex - 1], + forceSubMenuOpen: false + }); + } else { + _this2.setState({ + selectedItem: children[currentIndex + 1 < children.length ? currentIndex + 1 : 0], + forceSubMenuOpen: false + }); + } + }; + + this.onChildMouseMove = function (child) { + if (_this2.state.selectedItem !== child) { + _this2.setState({ selectedItem: child, forceSubMenuOpen: false }); + } + }; + + this.onChildMouseLeave = function () { + _this2.setState({ selectedItem: null, forceSubMenuOpen: false }); + }; + + this.renderChildren = function (children) { + return _react2.default.Children.map(children, function (child) { + var props = {}; + if (!_react2.default.isValidElement(child)) return child; + if ([_MenuItem2.default, _this2.getSubMenuType()].indexOf(child.type) < 0) { + // Maybe the MenuItem or SubMenu is capsuled in a wrapper div or something else + props.children = _this2.renderChildren(child.props.children); + return _react2.default.cloneElement(child, props); + } + props.onMouseLeave = _this2.onChildMouseLeave.bind(_this2); + if (child.type === _this2.getSubMenuType()) { + // special props for SubMenu only + props.forceOpen = _this2.state.forceSubMenuOpen && _this2.state.selectedItem === child; + props.forceClose = _this2.handleForceClose; + props.parentKeyNavigationHandler = _this2.handleKeyNavigation; + } + if (!child.props.divider && _this2.state.selectedItem === child) { + // special props for selected item only + props.selected = true; + props.ref = function (ref) { + _this2.seletedItemRef = ref; + }; + return _react2.default.cloneElement(child, props); + } + // onMouseMove is only needed for non selected items + props.onMouseMove = function () { + return _this2.onChildMouseMove(child); + }; + return _react2.default.cloneElement(child, props); + }); + }; +}; + +exports.default = AbstractMenu; \ No newline at end of file diff --git a/modules/ContextMenu.js b/modules/ContextMenu.js new file mode 100644 index 00000000..15b962f6 --- /dev/null +++ b/modules/ContextMenu.js @@ -0,0 +1,275 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _propTypes = require('prop-types'); + +var _propTypes2 = _interopRequireDefault(_propTypes); + +var _classnames = require('classnames'); + +var _classnames2 = _interopRequireDefault(_classnames); + +var _objectAssign = require('object-assign'); + +var _objectAssign2 = _interopRequireDefault(_objectAssign); + +var _globalEventListener = require('./globalEventListener'); + +var _globalEventListener2 = _interopRequireDefault(_globalEventListener); + +var _AbstractMenu2 = require('./AbstractMenu'); + +var _AbstractMenu3 = _interopRequireDefault(_AbstractMenu2); + +var _SubMenu = require('./SubMenu'); + +var _SubMenu2 = _interopRequireDefault(_SubMenu); + +var _actions = require('./actions'); + +var _helpers = require('./helpers'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var ContextMenu = function (_AbstractMenu) { + _inherits(ContextMenu, _AbstractMenu); + + function ContextMenu(props) { + _classCallCheck(this, ContextMenu); + + var _this = _possibleConstructorReturn(this, (ContextMenu.__proto__ || Object.getPrototypeOf(ContextMenu)).call(this, props)); + + _this.registerHandlers = function () { + document.addEventListener('mousedown', _this.handleOutsideClick); + document.addEventListener('touchstart', _this.handleOutsideClick); + document.addEventListener('scroll', _this.handleHide); + document.addEventListener('contextmenu', _this.handleHide); + document.addEventListener('keydown', _this.handleKeyNavigation); + window.addEventListener('resize', _this.handleHide); + }; + + _this.unregisterHandlers = function () { + document.removeEventListener('mousedown', _this.handleOutsideClick); + document.removeEventListener('touchstart', _this.handleOutsideClick); + document.removeEventListener('scroll', _this.handleHide); + document.removeEventListener('contextmenu', _this.handleHide); + document.removeEventListener('keydown', _this.handleKeyNavigation); + window.removeEventListener('resize', _this.handleHide); + }; + + _this.handleShow = function (e) { + if (e.detail.id !== _this.props.id || _this.state.isVisible) return; + + var _e$detail$position = e.detail.position, + x = _e$detail$position.x, + y = _e$detail$position.y; + + + _this.setState({ isVisible: true, x: x, y: y }); + _this.registerHandlers(); + (0, _helpers.callIfExists)(_this.props.onShow, e); + }; + + _this.handleHide = function (e) { + if (_this.state.isVisible && (!e.detail || !e.detail.id || e.detail.id === _this.props.id)) { + _this.unregisterHandlers(); + _this.setState({ isVisible: false, selectedItem: null, forceSubMenuOpen: false }); + (0, _helpers.callIfExists)(_this.props.onHide, e); + } + }; + + _this.handleOutsideClick = function (e) { + if (!_this.menu.contains(e.target)) (0, _actions.hideMenu)(); + }; + + _this.handleMouseLeave = function (event) { + event.preventDefault(); + + (0, _helpers.callIfExists)(_this.props.onMouseLeave, event, (0, _objectAssign2.default)({}, _this.props.data, _helpers.store.data), _helpers.store.target); + + if (_this.props.hideOnLeave) (0, _actions.hideMenu)(); + }; + + _this.handleContextMenu = function (e) { + if (process.env.NODE_ENV === 'production') { + e.preventDefault(); + } + _this.handleHide(e); + }; + + _this.hideMenu = function (e) { + if (e.keyCode === 27 || e.keyCode === 13) { + // ECS or enter + (0, _actions.hideMenu)(); + } + }; + + _this.getMenuPosition = function () { + var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + var menuStyles = { + top: y, + left: x + }; + + if (!_this.menu) return menuStyles; + + var _window = window, + innerWidth = _window.innerWidth, + innerHeight = _window.innerHeight; + + var rect = _this.menu.getBoundingClientRect(); + + if (y + rect.height > innerHeight) { + menuStyles.top -= rect.height; + } + + if (x + rect.width > innerWidth) { + menuStyles.left -= rect.width; + } + + if (menuStyles.top < 0) { + menuStyles.top = rect.height < innerHeight ? (innerHeight - rect.height) / 2 : 0; + } + + if (menuStyles.left < 0) { + menuStyles.left = rect.width < innerWidth ? (innerWidth - rect.width) / 2 : 0; + } + + return menuStyles; + }; + + _this.menuRef = function (c) { + _this.menu = c; + }; + + _this.state = (0, _objectAssign2.default)({}, _this.state, { + x: 0, + y: 0, + isVisible: false + }); + return _this; + } + + _createClass(ContextMenu, [{ + key: 'getSubMenuType', + value: function getSubMenuType() { + // eslint-disable-line class-methods-use-this + return _SubMenu2.default; + } + }, { + key: 'componentDidMount', + value: function componentDidMount() { + this.listenId = _globalEventListener2.default.register(this.handleShow, this.handleHide); + } + }, { + key: 'componentDidUpdate', + value: function componentDidUpdate() { + var _this2 = this; + + if (this.state.isVisible) { + var wrapper = window.requestAnimationFrame || setTimeout; + + wrapper(function () { + var _state = _this2.state, + x = _state.x, + y = _state.y; + + var _getMenuPosition = _this2.getMenuPosition(x, y), + top = _getMenuPosition.top, + left = _getMenuPosition.left; + + wrapper(function () { + if (!_this2.menu) return; + _this2.menu.style.top = top + 'px'; + _this2.menu.style.left = left + 'px'; + _this2.menu.style.opacity = 1; + _this2.menu.style.pointerEvents = 'auto'; + }); + }); + } else { + if (!this.menu) return; + this.menu.style.opacity = 0; + this.menu.style.pointerEvents = 'none'; + } + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + if (this.listenId) { + _globalEventListener2.default.unregister(this.listenId); + } + + this.unregisterHandlers(); + } + }, { + key: 'render', + value: function render() { + var _props = this.props, + children = _props.children, + className = _props.className, + style = _props.style; + var isVisible = this.state.isVisible; + + var inlineStyle = (0, _objectAssign2.default)({}, style, { position: 'fixed', opacity: 0, pointerEvents: 'none' }); + var menuClassnames = (0, _classnames2.default)(_helpers.cssClasses.menu, className, _defineProperty({}, _helpers.cssClasses.menuVisible, isVisible)); + + return _react2.default.createElement( + 'nav', + { + role: 'menu', tabIndex: '-1', ref: this.menuRef, style: inlineStyle, className: menuClassnames, + onContextMenu: this.handleContextMenu, onMouseLeave: this.handleMouseLeave }, + this.renderChildren(children) + ); + } + }]); + + return ContextMenu; +}(_AbstractMenu3.default); + +ContextMenu.propTypes = { + id: _propTypes2.default.string.isRequired, + children: _propTypes2.default.node.isRequired, + data: _propTypes2.default.object, + className: _propTypes2.default.string, + hideOnLeave: _propTypes2.default.bool, + onHide: _propTypes2.default.func, + onMouseLeave: _propTypes2.default.func, + onShow: _propTypes2.default.func, + style: _propTypes2.default.object +}; +ContextMenu.defaultProps = { + className: '', + data: {}, + hideOnLeave: false, + onHide: function onHide() { + return null; + }, + onMouseLeave: function onMouseLeave() { + return null; + }, + onShow: function onShow() { + return null; + }, + + style: {} +}; +exports.default = ContextMenu; \ No newline at end of file diff --git a/modules/ContextMenuTrigger.js b/modules/ContextMenuTrigger.js new file mode 100644 index 00000000..0c67d30d --- /dev/null +++ b/modules/ContextMenuTrigger.js @@ -0,0 +1,171 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _propTypes = require('prop-types'); + +var _propTypes2 = _interopRequireDefault(_propTypes); + +var _classnames = require('classnames'); + +var _classnames2 = _interopRequireDefault(_classnames); + +var _objectAssign = require('object-assign'); + +var _objectAssign2 = _interopRequireDefault(_objectAssign); + +var _actions = require('./actions'); + +var _helpers = require('./helpers'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var ContextMenuTrigger = function (_Component) { + _inherits(ContextMenuTrigger, _Component); + + function ContextMenuTrigger() { + var _ref; + + var _temp, _this, _ret; + + _classCallCheck(this, ContextMenuTrigger); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = ContextMenuTrigger.__proto__ || Object.getPrototypeOf(ContextMenuTrigger)).call.apply(_ref, [this].concat(args))), _this), _this.touchHandled = false, _this.handleMouseDown = function (event) { + if (_this.props.holdToDisplay >= 0 && event.button === 0) { + event.persist(); + event.stopPropagation(); + + _this.mouseDownTimeoutId = setTimeout(function () { + return _this.handleContextClick(event); + }, _this.props.holdToDisplay); + } + (0, _helpers.callIfExists)(_this.props.attributes.onMouseDown, event); + }, _this.handleMouseUp = function (event) { + if (event.button === 0) { + clearTimeout(_this.mouseDownTimeoutId); + } + (0, _helpers.callIfExists)(_this.props.attributes.onMouseUp, event); + }, _this.handleMouseOut = function (event) { + if (event.button === 0) { + clearTimeout(_this.mouseDownTimeoutId); + } + (0, _helpers.callIfExists)(_this.props.attributes.onMouseOut, event); + }, _this.handleTouchstart = function (event) { + _this.touchHandled = false; + + if (_this.props.holdToDisplay >= 0) { + event.persist(); + event.stopPropagation(); + + _this.touchstartTimeoutId = setTimeout(function () { + _this.handleContextClick(event); + _this.touchHandled = true; + }, _this.props.holdToDisplay); + } + (0, _helpers.callIfExists)(_this.props.attributes.onTouchStart, event); + }, _this.handleTouchEnd = function (event) { + if (_this.touchHandled) { + event.preventDefault(); + } + clearTimeout(_this.touchstartTimeoutId); + (0, _helpers.callIfExists)(_this.props.attributes.onTouchEnd, event); + }, _this.handleContextMenu = function (event) { + _this.handleContextClick(event); + (0, _helpers.callIfExists)(_this.props.attributes.onContextMenu, event); + }, _this.handleContextClick = function (event) { + console.log(_this.props); + if (_this.props.disable) return; + + event.preventDefault(); + event.stopPropagation(); + + var x = event.clientX || event.touches && event.touches[0].pageX; + var y = event.clientY || event.touches && event.touches[0].pageY; + + (0, _actions.hideMenu)(); + + var data = (0, _helpers.callIfExists)(_this.props.collect, _this.props); + var showMenuConfig = { + position: { x: x, y: y }, + target: _this.elem, + id: _this.props.id, + data: data + }; + if (data && typeof data.then === 'function') { + // it's promise + data.then(function (resp) { + showMenuConfig.data = resp; + (0, _actions.showMenu)(showMenuConfig); + }); + } else { + (0, _actions.showMenu)(showMenuConfig); + } + }, _this.elemRef = function (c) { + _this.elem = c; + }, _temp), _possibleConstructorReturn(_this, _ret); + } + + _createClass(ContextMenuTrigger, [{ + key: 'render', + value: function render() { + var _props = this.props, + renderTag = _props.renderTag, + attributes = _props.attributes, + children = _props.children; + + var newAttrs = (0, _objectAssign2.default)({}, attributes, { + className: (0, _classnames2.default)(_helpers.cssClasses.menuWrapper, attributes.className), + onContextMenu: this.handleContextMenu, + onMouseDown: this.handleMouseDown, + onMouseUp: this.handleMouseUp, + onTouchStart: this.handleTouchstart, + onTouchEnd: this.handleTouchEnd, + onMouseOut: this.handleMouseOut, + ref: this.elemRef + }); + + return _react2.default.createElement(renderTag, newAttrs, children); + } + }]); + + return ContextMenuTrigger; +}(_react.Component); + +ContextMenuTrigger.propTypes = { + id: _propTypes2.default.string.isRequired, + children: _propTypes2.default.node.isRequired, + attributes: _propTypes2.default.object, + collect: _propTypes2.default.func, + disable: _propTypes2.default.bool, + holdToDisplay: _propTypes2.default.number, + renderTag: _propTypes2.default.oneOfType([_propTypes2.default.node, _propTypes2.default.func]) +}; +ContextMenuTrigger.defaultProps = { + attributes: {}, + collect: function collect() { + return null; + }, + + disable: false, + holdToDisplay: 1000, + renderTag: 'div' +}; +exports.default = ContextMenuTrigger; \ No newline at end of file diff --git a/modules/MenuItem.js b/modules/MenuItem.js new file mode 100644 index 00000000..f1da29e4 --- /dev/null +++ b/modules/MenuItem.js @@ -0,0 +1,132 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _propTypes = require('prop-types'); + +var _propTypes2 = _interopRequireDefault(_propTypes); + +var _classnames = require('classnames'); + +var _classnames2 = _interopRequireDefault(_classnames); + +var _objectAssign = require('object-assign'); + +var _objectAssign2 = _interopRequireDefault(_objectAssign); + +var _actions = require('./actions'); + +var _helpers = require('./helpers'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var MenuItem = function (_Component) { + _inherits(MenuItem, _Component); + + function MenuItem() { + var _ref; + + var _temp, _this, _ret; + + _classCallCheck(this, MenuItem); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = MenuItem.__proto__ || Object.getPrototypeOf(MenuItem)).call.apply(_ref, [this].concat(args))), _this), _this.handleClick = function (event) { + event.preventDefault(); + + if (_this.props.disabled || _this.props.divider) return; + + (0, _helpers.callIfExists)(_this.props.onClick, event, (0, _objectAssign2.default)({}, _this.props.data, _helpers.store.data), _helpers.store.target); + + if (_this.props.preventClose) return; + + (0, _actions.hideMenu)(); + }, _temp), _possibleConstructorReturn(_this, _ret); + } + + _createClass(MenuItem, [{ + key: 'render', + value: function render() { + var _cx, + _this2 = this; + + var _props = this.props, + disabled = _props.disabled, + divider = _props.divider, + children = _props.children, + attributes = _props.attributes, + selected = _props.selected; + + var menuItemClassNames = (0, _classnames2.default)(_helpers.cssClasses.menuItem, attributes.className, (_cx = {}, _defineProperty(_cx, (0, _classnames2.default)(_helpers.cssClasses.menuItemDisabled, attributes.disabledClassName), disabled), _defineProperty(_cx, (0, _classnames2.default)(_helpers.cssClasses.menuItemDivider, attributes.dividerClassName), divider), _defineProperty(_cx, (0, _classnames2.default)(_helpers.cssClasses.menuItemSelected, attributes.selectedClassName), selected), _cx)); + + return _react2.default.createElement( + 'div', + _extends({}, attributes, { className: menuItemClassNames, + role: 'menuitem', tabIndex: '-1', 'aria-disabled': disabled ? 'true' : 'false', + 'aria-orientation': divider ? 'horizontal' : null, + ref: function ref(_ref2) { + _this2.ref = _ref2; + }, + onMouseMove: this.props.onMouseMove, onMouseLeave: this.props.onMouseLeave, + onTouchEnd: this.handleClick, onClick: this.handleClick }), + divider ? null : children + ); + } + }]); + + return MenuItem; +}(_react.Component); + +MenuItem.propTypes = { + children: _propTypes2.default.node, + attributes: _propTypes2.default.object, + data: _propTypes2.default.object, + disabled: _propTypes2.default.bool, + divider: _propTypes2.default.bool, + preventClose: _propTypes2.default.bool, + onClick: _propTypes2.default.func, + selected: _propTypes2.default.bool, + onMouseMove: _propTypes2.default.func, + onMouseLeave: _propTypes2.default.func +}; +MenuItem.defaultProps = { + disabled: false, + data: {}, + divider: false, + attributes: {}, + preventClose: false, + onClick: function onClick() { + return null; + }, + + children: null, + selected: false, + onMouseMove: function onMouseMove() { + return null; + }, + onMouseLeave: function onMouseLeave() { + return null; + } +}; +exports.default = MenuItem; \ No newline at end of file diff --git a/modules/SubMenu.js b/modules/SubMenu.js new file mode 100644 index 00000000..3eb1d4eb --- /dev/null +++ b/modules/SubMenu.js @@ -0,0 +1,336 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _propTypes = require('prop-types'); + +var _propTypes2 = _interopRequireDefault(_propTypes); + +var _classnames = require('classnames'); + +var _classnames2 = _interopRequireDefault(_classnames); + +var _objectAssign = require('object-assign'); + +var _objectAssign2 = _interopRequireDefault(_objectAssign); + +var _AbstractMenu2 = require('./AbstractMenu'); + +var _AbstractMenu3 = _interopRequireDefault(_AbstractMenu2); + +var _helpers = require('./helpers'); + +var _globalEventListener = require('./globalEventListener'); + +var _globalEventListener2 = _interopRequireDefault(_globalEventListener); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var SubMenu = function (_AbstractMenu) { + _inherits(SubMenu, _AbstractMenu); + + function SubMenu(props) { + _classCallCheck(this, SubMenu); + + var _this = _possibleConstructorReturn(this, (SubMenu.__proto__ || Object.getPrototypeOf(SubMenu)).call(this, props)); + + _this.getMenuPosition = function () { + var _window = window, + innerWidth = _window.innerWidth, + innerHeight = _window.innerHeight; + + var rect = _this.subMenu.getBoundingClientRect(); + var position = {}; + + if (rect.bottom > innerHeight) { + position.bottom = 0; + } else { + position.top = 0; + } + + if (rect.right < innerWidth) { + position.left = '100%'; + } else { + position.right = '100%'; + } + + return position; + }; + + _this.getRTLMenuPosition = function () { + var _window2 = window, + innerHeight = _window2.innerHeight; + + var rect = _this.subMenu.getBoundingClientRect(); + var position = {}; + + if (rect.bottom > innerHeight) { + position.bottom = 0; + } else { + position.top = 0; + } + + if (rect.left < 0) { + position.left = '100%'; + } else { + position.right = '100%'; + } + + return position; + }; + + _this.hideMenu = function (e) { + // avoid closing submenus of a different menu tree + if (e.detail && e.detail.id && _this.menu && e.detail.id !== _this.menu.id) { + return; + } + + if (_this.props.forceOpen) { + _this.props.forceClose(); + } + _this.setState({ visible: false, selectedItem: null }); + _this.unregisterHandlers(); + }; + + _this.handleClick = function (event) { + event.preventDefault(); + + if (_this.props.disabled) return; + + (0, _helpers.callIfExists)(_this.props.onClick, event, (0, _objectAssign2.default)({}, _this.props.data, _helpers.store.data), _helpers.store.target); + }; + + _this.handleMouseEnter = function () { + if (_this.closetimer) clearTimeout(_this.closetimer); + + if (_this.props.disabled || _this.state.visible) return; + + _this.opentimer = setTimeout(function () { + return _this.setState({ + visible: true, + selectedItem: null + }); + }, _this.props.hoverDelay); + }; + + _this.handleMouseLeave = function () { + if (_this.opentimer) clearTimeout(_this.opentimer); + + if (!_this.state.visible) return; + + _this.closetimer = setTimeout(function () { + return _this.setState({ + visible: false, + selectedItem: null + }); + }, _this.props.hoverDelay); + }; + + _this.menuRef = function (c) { + _this.menu = c; + }; + + _this.subMenuRef = function (c) { + _this.subMenu = c; + }; + + _this.registerHandlers = function () { + document.removeEventListener('keydown', _this.props.parentKeyNavigationHandler); + document.addEventListener('keydown', _this.handleKeyNavigation); + }; + + _this.unregisterHandlers = function (dismounting) { + document.removeEventListener('keydown', _this.handleKeyNavigation); + if (!dismounting) { + document.addEventListener('keydown', _this.props.parentKeyNavigationHandler); + } + }; + + _this.state = (0, _objectAssign2.default)({}, _this.state, { + visible: false + }); + return _this; + } + + _createClass(SubMenu, [{ + key: 'componentDidMount', + value: function componentDidMount() { + this.listenId = _globalEventListener2.default.register(function () {}, this.hideMenu); + } + }, { + key: 'getSubMenuType', + value: function getSubMenuType() { + // eslint-disable-line class-methods-use-this + return SubMenu; + } + }, { + key: 'shouldComponentUpdate', + value: function shouldComponentUpdate(nextProps, nextState) { + this.isVisibilityChange = (this.state.visible !== nextState.visible || this.props.forceOpen !== nextProps.forceOpen) && !(this.state.visible && nextProps.forceOpen) && !(this.props.forceOpen && nextState.visible); + return true; + } + }, { + key: 'componentDidUpdate', + value: function componentDidUpdate() { + var _this2 = this; + + if (!this.isVisibilityChange) return; + if (this.props.forceOpen || this.state.visible) { + var wrapper = window.requestAnimationFrame || setTimeout; + wrapper(function () { + var styles = _this2.props.rtl ? _this2.getRTLMenuPosition() : _this2.getMenuPosition(); + + _this2.subMenu.style.removeProperty('top'); + _this2.subMenu.style.removeProperty('bottom'); + _this2.subMenu.style.removeProperty('left'); + _this2.subMenu.style.removeProperty('right'); + + if ((0, _helpers.hasOwnProp)(styles, 'top')) _this2.subMenu.style.top = styles.top; + if ((0, _helpers.hasOwnProp)(styles, 'left')) _this2.subMenu.style.left = styles.left; + if ((0, _helpers.hasOwnProp)(styles, 'bottom')) _this2.subMenu.style.bottom = styles.bottom; + if ((0, _helpers.hasOwnProp)(styles, 'right')) _this2.subMenu.style.right = styles.right; + _this2.subMenu.classList.add(_helpers.cssClasses.menuVisible); + + _this2.registerHandlers(); + _this2.setState({ selectedItem: null }); + }); + } else { + var cleanup = function cleanup() { + _this2.subMenu.removeEventListener('transitionend', cleanup); + _this2.subMenu.style.removeProperty('bottom'); + _this2.subMenu.style.removeProperty('right'); + _this2.subMenu.style.top = 0; + _this2.subMenu.style.left = '100%'; + _this2.unregisterHandlers(); + }; + this.subMenu.addEventListener('transitionend', cleanup); + this.subMenu.classList.remove(_helpers.cssClasses.menuVisible); + } + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + if (this.listenId) { + _globalEventListener2.default.unregister(this.listenId); + } + + if (this.opentimer) clearTimeout(this.opentimer); + + if (this.closetimer) clearTimeout(this.closetimer); + + this.unregisterHandlers(true); + } + }, { + key: 'render', + value: function render() { + var _cx; + + var _props = this.props, + children = _props.children, + attributes = _props.attributes, + disabled = _props.disabled, + title = _props.title, + selected = _props.selected; + var visible = this.state.visible; + + var menuProps = { + ref: this.menuRef, + onMouseEnter: this.handleMouseEnter, + onMouseLeave: this.handleMouseLeave, + className: (0, _classnames2.default)(_helpers.cssClasses.menuItem, _helpers.cssClasses.subMenu, attributes.listClassName), + style: { + position: 'relative' + } + }; + var menuItemProps = { + className: (0, _classnames2.default)(_helpers.cssClasses.menuItem, attributes.className, (_cx = {}, _defineProperty(_cx, (0, _classnames2.default)(_helpers.cssClasses.menuItemDisabled, attributes.disabledClassName), disabled), _defineProperty(_cx, (0, _classnames2.default)(_helpers.cssClasses.menuItemActive, attributes.visibleClassName), visible), _defineProperty(_cx, (0, _classnames2.default)(_helpers.cssClasses.menuItemSelected, attributes.selectedClassName), selected), _cx)), + onMouseMove: this.props.onMouseMove, + onMouseOut: this.props.onMouseOut, + onClick: this.handleClick + }; + var subMenuProps = { + ref: this.subMenuRef, + style: { + position: 'absolute', + transition: 'opacity 1ms', // trigger transitionend event + top: 0, + left: '100%' + }, + className: (0, _classnames2.default)(_helpers.cssClasses.menu, this.props.className) + }; + + return _react2.default.createElement( + 'nav', + _extends({}, menuProps, { role: 'menuitem', tabIndex: '-1', 'aria-haspopup': 'true' }), + _react2.default.createElement( + 'div', + _extends({}, attributes, menuItemProps), + title + ), + _react2.default.createElement( + 'nav', + _extends({}, subMenuProps, { role: 'menu', tabIndex: '-1' }), + this.renderChildren(children) + ) + ); + } + }]); + + return SubMenu; +}(_AbstractMenu3.default); + +SubMenu.propTypes = { + children: _propTypes2.default.node.isRequired, + attributes: _propTypes2.default.object, + title: _propTypes2.default.node.isRequired, + className: _propTypes2.default.string, + disabled: _propTypes2.default.bool, + hoverDelay: _propTypes2.default.number, + rtl: _propTypes2.default.bool, + selected: _propTypes2.default.bool, + onMouseMove: _propTypes2.default.func, + onMouseOut: _propTypes2.default.func, + forceOpen: _propTypes2.default.bool, + forceClose: _propTypes2.default.func, + parentKeyNavigationHandler: _propTypes2.default.func +}; +SubMenu.defaultProps = { + disabled: false, + hoverDelay: 500, + attributes: {}, + className: '', + rtl: false, + selected: false, + onMouseMove: function onMouseMove() { + return null; + }, + onMouseOut: function onMouseOut() { + return null; + }, + forceOpen: false, + forceClose: function forceClose() { + return null; + }, + parentKeyNavigationHandler: function parentKeyNavigationHandler() { + return null; + } +}; +exports.default = SubMenu; \ No newline at end of file diff --git a/modules/actions.js b/modules/actions.js new file mode 100644 index 00000000..a564cd73 --- /dev/null +++ b/modules/actions.js @@ -0,0 +1,54 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.MENU_HIDE = exports.MENU_SHOW = undefined; +exports.dispatchGlobalEvent = dispatchGlobalEvent; +exports.showMenu = showMenu; +exports.hideMenu = hideMenu; + +var _objectAssign = require('object-assign'); + +var _objectAssign2 = _interopRequireDefault(_objectAssign); + +var _helpers = require('./helpers'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var MENU_SHOW = exports.MENU_SHOW = 'REACT_CONTEXTMENU_SHOW'; +var MENU_HIDE = exports.MENU_HIDE = 'REACT_CONTEXTMENU_HIDE'; + +function dispatchGlobalEvent(eventName, opts) { + var target = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : window; + + // Compatibale with IE + // @see http://stackoverflow.com/questions/26596123/internet-explorer-9-10-11-event-constructor-doesnt-work + var event = void 0; + + if (typeof window.CustomEvent === 'function') { + event = new window.CustomEvent(eventName, { detail: opts }); + } else { + event = document.createEvent('CustomEvent'); + event.initCustomEvent(eventName, false, true, opts); + } + + if (target) { + target.dispatchEvent(event); + (0, _objectAssign2.default)(_helpers.store, opts); + } +} + +function showMenu() { + var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var target = arguments[1]; + + dispatchGlobalEvent(MENU_SHOW, (0, _objectAssign2.default)({}, opts, { type: MENU_SHOW }), target); +} + +function hideMenu() { + var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var target = arguments[1]; + + dispatchGlobalEvent(MENU_HIDE, (0, _objectAssign2.default)({}, opts, { type: MENU_HIDE }), target); +} \ No newline at end of file diff --git a/modules/connectMenu.js b/modules/connectMenu.js new file mode 100644 index 00000000..c895f3cb --- /dev/null +++ b/modules/connectMenu.js @@ -0,0 +1,98 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +exports.default = function (menuId) { + // expect menu component to connect as inner parameter + // is presumably a wrapper of + return function (Child) { + // return wrapper for that forwards the ContextMenuTrigger's additional props + return function (_Component) { + _inherits(ConnectMenu, _Component); + + function ConnectMenu(props) { + _classCallCheck(this, ConnectMenu); + + var _this = _possibleConstructorReturn(this, (ConnectMenu.__proto__ || Object.getPrototypeOf(ConnectMenu)).call(this, props)); + + _this.handleShow = function (e) { + if (e.detail.id !== menuId) return; + + // the onShow event's detail.data object holds all ContextMenuTrigger props + var data = e.detail.data; + + var filteredData = {}; + + for (var key in data) { + // exclude props the ContextMenuTrigger is expecting itself + if (!ignoredTriggerProps.includes(key)) { + filteredData[key] = data[key]; + } + } + _this.setState({ trigger: filteredData }); + }; + + _this.handleHide = function () { + _this.setState({ trigger: null }); + }; + + _this.state = { trigger: null }; + return _this; + } + + _createClass(ConnectMenu, [{ + key: 'componentDidMount', + value: function componentDidMount() { + this.listenId = _globalEventListener2.default.register(this.handleShow, this.handleHide); + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + if (this.listenId) { + _globalEventListener2.default.unregister(this.listenId); + } + } + }, { + key: 'render', + value: function render() { + return _react2.default.createElement(Child, _extends({}, this.props, { id: menuId, trigger: this.state.trigger })); + } + }]); + + return ConnectMenu; + }(_react.Component); + }; +}; + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _ContextMenuTrigger = require('./ContextMenuTrigger'); + +var _ContextMenuTrigger2 = _interopRequireDefault(_ContextMenuTrigger); + +var _globalEventListener = require('./globalEventListener'); + +var _globalEventListener2 = _interopRequireDefault(_globalEventListener); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +// collect ContextMenuTrigger's expected props to NOT pass them on as part of the context +var ignoredTriggerProps = [].concat(_toConsumableArray(Object.keys(_ContextMenuTrigger2.default.propTypes)), ['children']); + +// expect the id of the menu to be responsible for as outer parameter \ No newline at end of file diff --git a/modules/globalEventListener.js b/modules/globalEventListener.js new file mode 100644 index 00000000..32276107 --- /dev/null +++ b/modules/globalEventListener.js @@ -0,0 +1,55 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _actions = require('./actions'); + +var _helpers = require('./helpers'); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var GlobalEventListener = function GlobalEventListener() { + var _this = this; + + _classCallCheck(this, GlobalEventListener); + + this.handleShowEvent = function (event) { + for (var id in _this.callbacks) { + if ((0, _helpers.hasOwnProp)(_this.callbacks, id)) _this.callbacks[id].show(event); + } + }; + + this.handleHideEvent = function (event) { + for (var id in _this.callbacks) { + if ((0, _helpers.hasOwnProp)(_this.callbacks, id)) _this.callbacks[id].hide(event); + } + }; + + this.register = function (showCallback, hideCallback) { + var id = (0, _helpers.uniqueId)(); + + _this.callbacks[id] = { + show: showCallback, + hide: hideCallback + }; + + return id; + }; + + this.unregister = function (id) { + if (id && _this.callbacks[id]) { + delete _this.callbacks[id]; + } + }; + + this.callbacks = {}; + + if (_helpers.canUseDOM) { + window.addEventListener(_actions.MENU_SHOW, this.handleShowEvent); + window.addEventListener(_actions.MENU_HIDE, this.handleHideEvent); + } +}; + +exports.default = new GlobalEventListener(); \ No newline at end of file diff --git a/modules/helpers.js b/modules/helpers.js new file mode 100644 index 00000000..c160e9e1 --- /dev/null +++ b/modules/helpers.js @@ -0,0 +1,39 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.callIfExists = callIfExists; +exports.hasOwnProp = hasOwnProp; +exports.uniqueId = uniqueId; +function callIfExists(func) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + return typeof func === 'function' && func.apply(undefined, args); +} + +function hasOwnProp(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +function uniqueId() { + return Math.random().toString(36).substring(7); +} + +var cssClasses = exports.cssClasses = { + menu: 'react-contextmenu', + menuVisible: 'react-contextmenu--visible', + menuWrapper: 'react-contextmenu-wrapper', + menuItem: 'react-contextmenu-item', + menuItemActive: 'react-contextmenu-item--active', + menuItemDisabled: 'react-contextmenu-item--disabled', + menuItemDivider: 'react-contextmenu-item--divider', + menuItemSelected: 'react-contextmenu-item--selected', + subMenu: 'react-contextmenu-submenu' +}; + +var store = exports.store = {}; + +var canUseDOM = exports.canUseDOM = Boolean(typeof window !== 'undefined' && window.document && window.document.createElement); \ No newline at end of file diff --git a/modules/index.js b/modules/index.js new file mode 100644 index 00000000..60dcffa3 --- /dev/null +++ b/modules/index.js @@ -0,0 +1,67 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _ContextMenu = require('./ContextMenu'); + +Object.defineProperty(exports, 'ContextMenu', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_ContextMenu).default; + } +}); + +var _ContextMenuTrigger = require('./ContextMenuTrigger'); + +Object.defineProperty(exports, 'ContextMenuTrigger', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_ContextMenuTrigger).default; + } +}); + +var _MenuItem = require('./MenuItem'); + +Object.defineProperty(exports, 'MenuItem', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_MenuItem).default; + } +}); + +var _SubMenu = require('./SubMenu'); + +Object.defineProperty(exports, 'SubMenu', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_SubMenu).default; + } +}); + +var _connectMenu = require('./connectMenu'); + +Object.defineProperty(exports, 'connectMenu', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_connectMenu).default; + } +}); + +var _actions = require('./actions'); + +Object.defineProperty(exports, 'hideMenu', { + enumerable: true, + get: function get() { + return _actions.hideMenu; + } +}); +Object.defineProperty(exports, 'showMenu', { + enumerable: true, + get: function get() { + return _actions.showMenu; + } +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file From 40f37bf16c6abfb3414bbc664f9eb8e5efd609f3 Mon Sep 17 00:00:00 2001 From: Akash Depra Date: Fri, 20 Jul 2018 19:36:16 +0530 Subject: [PATCH 208/258] Updated gitignore --- .gitignore | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.gitignore b/.gitignore index bd458237..a413743c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,5 @@ node_modules/ public/ -dist/ -modules/ -es6/ -coverage/ .vscode .idea *.log From 24c75b06338391a11a7f969f06d20a587ea1c59c Mon Sep 17 00:00:00 2001 From: Akash Depra Date: Fri, 20 Jul 2018 19:47:07 +0530 Subject: [PATCH 209/258] Added x position for context menu --- coverage/clover.xml | 4 ++-- coverage/lcov-report/AbstractMenu.js.html | 2 +- coverage/lcov-report/ContextMenu.js.html | 2 +- coverage/lcov-report/MenuItem.js.html | 2 +- coverage/lcov-report/SubMenu.js.html | 2 +- coverage/lcov-report/actions.js.html | 2 +- coverage/lcov-report/globalEventListener.js.html | 2 +- coverage/lcov-report/helpers.js.html | 2 +- coverage/lcov-report/index.html | 2 +- dist/react-contextmenu.js | 2 +- es6/ContextMenuTrigger.js | 9 +++++++-- modules/ContextMenuTrigger.js | 9 +++++++-- src/ContextMenuTrigger.js | 11 ++++++++--- 13 files changed, 33 insertions(+), 18 deletions(-) diff --git a/coverage/clover.xml b/coverage/clover.xml index 63163a3c..e6cf1358 100644 --- a/coverage/clover.xml +++ b/coverage/clover.xml @@ -1,6 +1,6 @@ - - + + diff --git a/coverage/lcov-report/AbstractMenu.js.html b/coverage/lcov-report/AbstractMenu.js.html index 2d5c974a..af9133d7 100644 --- a/coverage/lcov-report/AbstractMenu.js.html +++ b/coverage/lcov-report/AbstractMenu.js.html @@ -505,7 +505,7 @@

    diff --git a/coverage/lcov-report/ContextMenu.js.html b/coverage/lcov-report/ContextMenu.js.html index 017064ec..fe507fa7 100644 --- a/coverage/lcov-report/ContextMenu.js.html +++ b/coverage/lcov-report/ContextMenu.js.html @@ -667,7 +667,7 @@

    diff --git a/coverage/lcov-report/MenuItem.js.html b/coverage/lcov-report/MenuItem.js.html index ee463bac..9209da75 100644 --- a/coverage/lcov-report/MenuItem.js.html +++ b/coverage/lcov-report/MenuItem.js.html @@ -271,7 +271,7 @@

    diff --git a/coverage/lcov-report/SubMenu.js.html b/coverage/lcov-report/SubMenu.js.html index 600c8e29..6f304412 100644 --- a/coverage/lcov-report/SubMenu.js.html +++ b/coverage/lcov-report/SubMenu.js.html @@ -850,7 +850,7 @@

    diff --git a/coverage/lcov-report/actions.js.html b/coverage/lcov-report/actions.js.html index 55f8bb7e..0d8d13e4 100644 --- a/coverage/lcov-report/actions.js.html +++ b/coverage/lcov-report/actions.js.html @@ -151,7 +151,7 @@

    diff --git a/coverage/lcov-report/globalEventListener.js.html b/coverage/lcov-report/globalEventListener.js.html index a94e5ba7..38c92d88 100644 --- a/coverage/lcov-report/globalEventListener.js.html +++ b/coverage/lcov-report/globalEventListener.js.html @@ -184,7 +184,7 @@

    diff --git a/coverage/lcov-report/helpers.js.html b/coverage/lcov-report/helpers.js.html index 2868b592..14f17744 100644 --- a/coverage/lcov-report/helpers.js.html +++ b/coverage/lcov-report/helpers.js.html @@ -139,7 +139,7 @@

    diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html index e30a99b8..16cc7f99 100644 --- a/coverage/lcov-report/index.html +++ b/coverage/lcov-report/index.html @@ -158,7 +158,7 @@

    diff --git a/dist/react-contextmenu.js b/dist/react-contextmenu.js index 403b0d6a..749ed690 100644 --- a/dist/react-contextmenu.js +++ b/dist/react-contextmenu.js @@ -8,4 +8,4 @@ var r=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,a=Object.pr Licensed under the MIT License (MIT), see http://jedwatson.github.io/classnames */ -!function(){"use strict";function n(){for(var e=[],t=0;to?i.bottom=0:i.top=0,r.rightt?r.bottom=0:r.top=0,o.left<0?r.left="100%":r.right="100%",r},n.hideMenu=function(e){e.detail&&e.detail.id&&n.menu&&e.detail.id!==n.menu.id||(n.props.forceOpen&&n.props.forceClose(),n.setState({visible:!1,selectedItem:null}),n.unregisterHandlers())},n.handleClick=function(e){e.preventDefault(),n.props.disabled||Object(m.a)(n.props.onClick,e,h()({},n.props.data,m.e.data),m.e.target)},n.handleMouseEnter=function(){n.closetimer&&clearTimeout(n.closetimer),n.props.disabled||n.state.visible||(n.opentimer=setTimeout(function(){return n.setState({visible:!0,selectedItem:null})},n.props.hoverDelay))},n.handleMouseLeave=function(){n.opentimer&&clearTimeout(n.opentimer),n.state.visible&&(n.closetimer=setTimeout(function(){return n.setState({visible:!1,selectedItem:null})},n.props.hoverDelay))},n.menuRef=function(e){n.menu=e},n.subMenuRef=function(e){n.subMenu=e},n.registerHandlers=function(){document.removeEventListener("keydown",n.props.parentKeyNavigationHandler),document.addEventListener("keydown",n.handleKeyNavigation)},n.unregisterHandlers=function(e){document.removeEventListener("keydown",n.handleKeyNavigation),e||document.addEventListener("keydown",n.props.parentKeyNavigationHandler)},n.state=h()({},n.state,{visible:!1}),n}return a(t,e),O(t,[{key:"componentDidMount",value:function(){this.listenId=v.a.register(function(){},this.hideMenu)}},{key:"getSubMenuType",value:function(){return t}},{key:"shouldComponentUpdate",value:function(e,t){return this.isVisibilityChange=!(this.state.visible===t.visible&&this.props.forceOpen===e.forceOpen||this.state.visible&&e.forceOpen||this.props.forceOpen&&t.visible),!0}},{key:"componentDidUpdate",value:function(){var e=this;if(this.isVisibilityChange)if(this.props.forceOpen||this.state.visible){var t=window.requestAnimationFrame||setTimeout;t(function(){var t=e.props.rtl?e.getRTLMenuPosition():e.getMenuPosition();e.subMenu.style.removeProperty("top"),e.subMenu.style.removeProperty("bottom"),e.subMenu.style.removeProperty("left"),e.subMenu.style.removeProperty("right"),Object(m.d)(t,"top")&&(e.subMenu.style.top=t.top),Object(m.d)(t,"left")&&(e.subMenu.style.left=t.left),Object(m.d)(t,"bottom")&&(e.subMenu.style.bottom=t.bottom),Object(m.d)(t,"right")&&(e.subMenu.style.right=t.right),e.subMenu.classList.add(m.c.menuVisible),e.registerHandlers(),e.setState({selectedItem:null})})}else{var n=function t(){e.subMenu.removeEventListener("transitionend",t),e.subMenu.style.removeProperty("bottom"),e.subMenu.style.removeProperty("right"),e.subMenu.style.top=0,e.subMenu.style.left="100%",e.unregisterHandlers()};this.subMenu.addEventListener("transitionend",n),this.subMenu.classList.remove(m.c.menuVisible)}}},{key:"componentWillUnmount",value:function(){this.listenId&&v.a.unregister(this.listenId),this.opentimer&&clearTimeout(this.opentimer),this.closetimer&&clearTimeout(this.closetimer),this.unregisterHandlers(!0)}},{key:"render",value:function(){var e,t=this.props,n=t.children,r=t.attributes,i=t.disabled,a=t.title,u=t.selected,c=this.state.visible,l={ref:this.menuRef,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave,className:p()(m.c.menuItem,m.c.subMenu,r.listClassName),style:{position:"relative"}},d={className:p()(m.c.menuItem,r.className,(e={},o(e,p()(m.c.menuItemDisabled,r.disabledClassName),i),o(e,p()(m.c.menuItemActive,r.visibleClassName),c),o(e,p()(m.c.menuItemSelected,r.selectedClassName),u),e)),onMouseMove:this.props.onMouseMove,onMouseOut:this.props.onMouseOut,onClick:this.handleClick},f={ref:this.subMenuRef,style:{position:"absolute",transition:"opacity 1ms",top:0,left:"100%"},className:p()(m.c.menu,this.props.className)};return s.a.createElement("nav",y({},l,{role:"menuitem",tabIndex:"-1","aria-haspopup":"true"}),s.a.createElement("div",y({},r,d),a),s.a.createElement("nav",y({},f,{role:"menu",tabIndex:"-1"}),this.renderChildren(n)))}}]),t}(b.a);g.propTypes={children:l.a.node.isRequired,attributes:l.a.object,title:l.a.node.isRequired,className:l.a.string,disabled:l.a.bool,hoverDelay:l.a.number,rtl:l.a.bool,selected:l.a.bool,onMouseMove:l.a.func,onMouseOut:l.a.func,forceOpen:l.a.bool,forceClose:l.a.func,parentKeyNavigationHandler:l.a.func},g.defaultProps={disabled:!1,hoverDelay:500,attributes:{},className:"",rtl:!1,selected:!1,onMouseMove:function(){return null},onMouseOut:function(){return null},forceOpen:!1,forceClose:function(){return null},parentKeyNavigationHandler:function(){return null}},t.a=g},function(e,t,n){"use strict";function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(0),u=n.n(a),s=n(2),c=n.n(s),l=n(5),d=n.n(l),p=n(3),f=n.n(p),h=n(4),b=n(1),m=function(){function e(e,t){for(var n=0;n=0&&0===e.button&&(e.persist(),e.stopPropagation(),i.mouseDownTimeoutId=setTimeout(function(){return i.handleContextClick(e)},i.props.holdToDisplay)),Object(b.a)(i.props.attributes.onMouseDown,e)},i.handleMouseUp=function(e){0===e.button&&clearTimeout(i.mouseDownTimeoutId),Object(b.a)(i.props.attributes.onMouseUp,e)},i.handleMouseOut=function(e){0===e.button&&clearTimeout(i.mouseDownTimeoutId),Object(b.a)(i.props.attributes.onMouseOut,e)},i.handleTouchstart=function(e){i.touchHandled=!1,i.props.holdToDisplay>=0&&(e.persist(),e.stopPropagation(),i.touchstartTimeoutId=setTimeout(function(){i.handleContextClick(e),i.touchHandled=!0},i.props.holdToDisplay)),Object(b.a)(i.props.attributes.onTouchStart,e)},i.handleTouchEnd=function(e){i.touchHandled&&e.preventDefault(),clearTimeout(i.touchstartTimeoutId),Object(b.a)(i.props.attributes.onTouchEnd,e)},i.handleContextMenu=function(e){i.handleContextClick(e),Object(b.a)(i.props.attributes.onContextMenu,e)},i.handleContextClick=function(e){if(console.log(i.props),!i.props.disable){e.preventDefault(),e.stopPropagation();var t=e.clientX||e.touches&&e.touches[0].pageX,n=e.clientY||e.touches&&e.touches[0].pageY;Object(h.c)();var o=Object(b.a)(i.props.collect,i.props),r={position:{x:t,y:n},target:i.elem,id:i.props.id,data:o};o&&"function"==typeof o.then?o.then(function(e){r.data=e,Object(h.d)(r)}):Object(h.d)(r)}},i.elemRef=function(e){i.elem=e},a=n,r(i,a)}return i(t,e),m(t,[{key:"render",value:function(){var e=this.props,t=e.renderTag,n=e.attributes,o=e.children,r=f()({},n,{className:d()(b.c.menuWrapper,n.className),onContextMenu:this.handleContextMenu,onMouseDown:this.handleMouseDown,onMouseUp:this.handleMouseUp,onTouchStart:this.handleTouchstart,onTouchEnd:this.handleTouchEnd,onMouseOut:this.handleMouseOut,ref:this.elemRef});return u.a.createElement(t,r,o)}}]),t}(a.Component);v.propTypes={id:c.a.string.isRequired,children:c.a.node.isRequired,attributes:c.a.object,collect:c.a.func,disable:c.a.bool,holdToDisplay:c.a.number,renderTag:c.a.oneOfType([c.a.node,c.a.func])},v.defaultProps={attributes:{},collect:function(){return null},disable:!1,holdToDisplay:1e3,renderTag:"div"},t.a=v},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n(12);n.d(t,"ContextMenu",function(){return o.a});var r=n(10);n.d(t,"ContextMenuTrigger",function(){return r.a});var i=n(8);n.d(t,"MenuItem",function(){return i.a});var a=n(9);n.d(t,"SubMenu",function(){return a.a});var u=n(15);n.d(t,"connectMenu",function(){return u.a});var s=n(4);n.d(t,"hideMenu",function(){return s.c}),n.d(t,"showMenu",function(){return s.d})},function(e,t,n){"use strict";function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=n(0),s=n.n(u),c=n(2),l=n.n(c),d=n(5),p=n.n(d),f=n(3),h=n.n(f),b=n(6),m=n(7),v=n(9),y=n(4),O=n(1),g=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o={top:t,left:e};if(!n.menu)return o;var r=window,i=r.innerWidth,a=r.innerHeight,u=n.menu.getBoundingClientRect();return t+u.height>a&&(o.top-=u.height),e+u.width>i&&(o.left-=u.width),o.top<0&&(o.top=u.heighto?i.bottom=0:i.top=0,r.rightt?r.bottom=0:r.top=0,o.left<0?r.left="100%":r.right="100%",r},n.hideMenu=function(e){e.detail&&e.detail.id&&n.menu&&e.detail.id!==n.menu.id||(n.props.forceOpen&&n.props.forceClose(),n.setState({visible:!1,selectedItem:null}),n.unregisterHandlers())},n.handleClick=function(e){e.preventDefault(),n.props.disabled||Object(m.a)(n.props.onClick,e,h()({},n.props.data,m.e.data),m.e.target)},n.handleMouseEnter=function(){n.closetimer&&clearTimeout(n.closetimer),n.props.disabled||n.state.visible||(n.opentimer=setTimeout(function(){return n.setState({visible:!0,selectedItem:null})},n.props.hoverDelay))},n.handleMouseLeave=function(){n.opentimer&&clearTimeout(n.opentimer),n.state.visible&&(n.closetimer=setTimeout(function(){return n.setState({visible:!1,selectedItem:null})},n.props.hoverDelay))},n.menuRef=function(e){n.menu=e},n.subMenuRef=function(e){n.subMenu=e},n.registerHandlers=function(){document.removeEventListener("keydown",n.props.parentKeyNavigationHandler),document.addEventListener("keydown",n.handleKeyNavigation)},n.unregisterHandlers=function(e){document.removeEventListener("keydown",n.handleKeyNavigation),e||document.addEventListener("keydown",n.props.parentKeyNavigationHandler)},n.state=h()({},n.state,{visible:!1}),n}return a(t,e),O(t,[{key:"componentDidMount",value:function(){this.listenId=v.a.register(function(){},this.hideMenu)}},{key:"getSubMenuType",value:function(){return t}},{key:"shouldComponentUpdate",value:function(e,t){return this.isVisibilityChange=!(this.state.visible===t.visible&&this.props.forceOpen===e.forceOpen||this.state.visible&&e.forceOpen||this.props.forceOpen&&t.visible),!0}},{key:"componentDidUpdate",value:function(){var e=this;if(this.isVisibilityChange)if(this.props.forceOpen||this.state.visible){var t=window.requestAnimationFrame||setTimeout;t(function(){var t=e.props.rtl?e.getRTLMenuPosition():e.getMenuPosition();e.subMenu.style.removeProperty("top"),e.subMenu.style.removeProperty("bottom"),e.subMenu.style.removeProperty("left"),e.subMenu.style.removeProperty("right"),Object(m.d)(t,"top")&&(e.subMenu.style.top=t.top),Object(m.d)(t,"left")&&(e.subMenu.style.left=t.left),Object(m.d)(t,"bottom")&&(e.subMenu.style.bottom=t.bottom),Object(m.d)(t,"right")&&(e.subMenu.style.right=t.right),e.subMenu.classList.add(m.c.menuVisible),e.registerHandlers(),e.setState({selectedItem:null})})}else{var n=function t(){e.subMenu.removeEventListener("transitionend",t),e.subMenu.style.removeProperty("bottom"),e.subMenu.style.removeProperty("right"),e.subMenu.style.top=0,e.subMenu.style.left="100%",e.unregisterHandlers()};this.subMenu.addEventListener("transitionend",n),this.subMenu.classList.remove(m.c.menuVisible)}}},{key:"componentWillUnmount",value:function(){this.listenId&&v.a.unregister(this.listenId),this.opentimer&&clearTimeout(this.opentimer),this.closetimer&&clearTimeout(this.closetimer),this.unregisterHandlers(!0)}},{key:"render",value:function(){var e,t=this.props,n=t.children,r=t.attributes,i=t.disabled,a=t.title,u=t.selected,c=this.state.visible,l={ref:this.menuRef,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave,className:p()(m.c.menuItem,m.c.subMenu,r.listClassName),style:{position:"relative"}},d={className:p()(m.c.menuItem,r.className,(e={},o(e,p()(m.c.menuItemDisabled,r.disabledClassName),i),o(e,p()(m.c.menuItemActive,r.visibleClassName),c),o(e,p()(m.c.menuItemSelected,r.selectedClassName),u),e)),onMouseMove:this.props.onMouseMove,onMouseOut:this.props.onMouseOut,onClick:this.handleClick},f={ref:this.subMenuRef,style:{position:"absolute",transition:"opacity 1ms",top:0,left:"100%"},className:p()(m.c.menu,this.props.className)};return s.a.createElement("nav",y({},l,{role:"menuitem",tabIndex:"-1","aria-haspopup":"true"}),s.a.createElement("div",y({},r,d),a),s.a.createElement("nav",y({},f,{role:"menu",tabIndex:"-1"}),this.renderChildren(n)))}}]),t}(b.a);g.propTypes={children:l.a.node.isRequired,attributes:l.a.object,title:l.a.node.isRequired,className:l.a.string,disabled:l.a.bool,hoverDelay:l.a.number,rtl:l.a.bool,selected:l.a.bool,onMouseMove:l.a.func,onMouseOut:l.a.func,forceOpen:l.a.bool,forceClose:l.a.func,parentKeyNavigationHandler:l.a.func},g.defaultProps={disabled:!1,hoverDelay:500,attributes:{},className:"",rtl:!1,selected:!1,onMouseMove:function(){return null},onMouseOut:function(){return null},forceOpen:!1,forceClose:function(){return null},parentKeyNavigationHandler:function(){return null}},t.a=g},function(e,t,n){"use strict";function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(0),u=n.n(a),s=n(2),c=n.n(s),l=n(5),d=n.n(l),p=n(3),f=n.n(p),h=n(4),b=n(1),m=function(){function e(e,t){for(var n=0;n=0&&0===e.button&&(e.persist(),e.stopPropagation(),i.mouseDownTimeoutId=setTimeout(function(){return i.handleContextClick(e)},i.props.holdToDisplay)),Object(b.a)(i.props.attributes.onMouseDown,e)},i.handleMouseUp=function(e){0===e.button&&clearTimeout(i.mouseDownTimeoutId),Object(b.a)(i.props.attributes.onMouseUp,e)},i.handleMouseOut=function(e){0===e.button&&clearTimeout(i.mouseDownTimeoutId),Object(b.a)(i.props.attributes.onMouseOut,e)},i.handleTouchstart=function(e){i.touchHandled=!1,i.props.holdToDisplay>=0&&(e.persist(),e.stopPropagation(),i.touchstartTimeoutId=setTimeout(function(){i.handleContextClick(e),i.touchHandled=!0},i.props.holdToDisplay)),Object(b.a)(i.props.attributes.onTouchStart,e)},i.handleTouchEnd=function(e){i.touchHandled&&e.preventDefault(),clearTimeout(i.touchstartTimeoutId),Object(b.a)(i.props.attributes.onTouchEnd,e)},i.handleContextMenu=function(e){i.handleContextClick(e),Object(b.a)(i.props.attributes.onContextMenu,e)},i.handleContextClick=function(e){if(!i.props.disable){e.preventDefault(),e.stopPropagation();var t=e.clientX||e.touches&&e.touches[0].pageX,n=e.clientY||e.touches&&e.touches[0].pageY;i.props.posX&&(t-=i.props.posX),Object(h.c)();var o=Object(b.a)(i.props.collect,i.props),r={position:{x:t,y:n},target:i.elem,id:i.props.id,data:o};o&&"function"==typeof o.then?o.then(function(e){r.data=e,Object(h.d)(r)}):Object(h.d)(r)}},i.elemRef=function(e){i.elem=e},a=n,r(i,a)}return i(t,e),m(t,[{key:"render",value:function(){var e=this.props,t=e.renderTag,n=e.attributes,o=e.children,r=f()({},n,{className:d()(b.c.menuWrapper,n.className),onContextMenu:this.handleContextMenu,onMouseDown:this.handleMouseDown,onMouseUp:this.handleMouseUp,onTouchStart:this.handleTouchstart,onTouchEnd:this.handleTouchEnd,onMouseOut:this.handleMouseOut,ref:this.elemRef});return u.a.createElement(t,r,o)}}]),t}(a.Component);v.propTypes={id:c.a.string.isRequired,children:c.a.node.isRequired,attributes:c.a.object,collect:c.a.func,disable:c.a.bool,holdToDisplay:c.a.number,posX:c.a.number,renderTag:c.a.oneOfType([c.a.node,c.a.func])},v.defaultProps={attributes:{},collect:function(){return null},disable:!1,holdToDisplay:1e3,renderTag:"div",posX:0},t.a=v},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n(12);n.d(t,"ContextMenu",function(){return o.a});var r=n(10);n.d(t,"ContextMenuTrigger",function(){return r.a});var i=n(8);n.d(t,"MenuItem",function(){return i.a});var a=n(9);n.d(t,"SubMenu",function(){return a.a});var u=n(15);n.d(t,"connectMenu",function(){return u.a});var s=n(4);n.d(t,"hideMenu",function(){return s.c}),n.d(t,"showMenu",function(){return s.d})},function(e,t,n){"use strict";function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=n(0),s=n.n(u),c=n(2),l=n.n(c),d=n(5),p=n.n(d),f=n(3),h=n.n(f),b=n(6),m=n(7),v=n(9),y=n(4),O=n(1),g=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o={top:t,left:e};if(!n.menu)return o;var r=window,i=r.innerWidth,a=r.innerHeight,u=n.menu.getBoundingClientRect();return t+u.height>a&&(o.top-=u.height),e+u.width>i&&(o.left-=u.width),o.top<0&&(o.top=u.height { - console.log(this.props); if (this.props.disable) return; event.preventDefault(); event.stopPropagation(); - const x = event.clientX || (event.touches && event.touches[0].pageX); + let x = event.clientX || (event.touches && event.touches[0].pageX); const y = event.clientY || (event.touches && event.touches[0].pageY); + if (this.props.posX) { + x -= this.props.posX; + } + hideMenu(); let data = callIfExists(this.props.collect, this.props); From e5e0d0dc1249b08f5f6fcff67916bc66ec3d0976 Mon Sep 17 00:00:00 2001 From: Akash Depra Date: Fri, 20 Jul 2018 19:55:17 +0530 Subject: [PATCH 210/258] Added Y position for context menu --- coverage/clover.xml | 4 ++-- coverage/lcov-report/AbstractMenu.js.html | 2 +- coverage/lcov-report/ContextMenu.js.html | 2 +- coverage/lcov-report/MenuItem.js.html | 2 +- coverage/lcov-report/SubMenu.js.html | 2 +- coverage/lcov-report/actions.js.html | 2 +- coverage/lcov-report/globalEventListener.js.html | 2 +- coverage/lcov-report/helpers.js.html | 2 +- coverage/lcov-report/index.html | 2 +- dist/react-contextmenu.js | 2 +- es6/ContextMenuTrigger.js | 7 ++++++- modules/ContextMenuTrigger.js | 7 ++++++- src/ContextMenuTrigger.js | 9 +++++++-- 13 files changed, 30 insertions(+), 15 deletions(-) diff --git a/coverage/clover.xml b/coverage/clover.xml index e6cf1358..17ce4dbd 100644 --- a/coverage/clover.xml +++ b/coverage/clover.xml @@ -1,6 +1,6 @@ - - + + diff --git a/coverage/lcov-report/AbstractMenu.js.html b/coverage/lcov-report/AbstractMenu.js.html index af9133d7..4811de53 100644 --- a/coverage/lcov-report/AbstractMenu.js.html +++ b/coverage/lcov-report/AbstractMenu.js.html @@ -505,7 +505,7 @@

    diff --git a/coverage/lcov-report/ContextMenu.js.html b/coverage/lcov-report/ContextMenu.js.html index fe507fa7..e4c6d0ec 100644 --- a/coverage/lcov-report/ContextMenu.js.html +++ b/coverage/lcov-report/ContextMenu.js.html @@ -667,7 +667,7 @@

    diff --git a/coverage/lcov-report/MenuItem.js.html b/coverage/lcov-report/MenuItem.js.html index 9209da75..066429b6 100644 --- a/coverage/lcov-report/MenuItem.js.html +++ b/coverage/lcov-report/MenuItem.js.html @@ -271,7 +271,7 @@

    diff --git a/coverage/lcov-report/SubMenu.js.html b/coverage/lcov-report/SubMenu.js.html index 6f304412..c7cc95ac 100644 --- a/coverage/lcov-report/SubMenu.js.html +++ b/coverage/lcov-report/SubMenu.js.html @@ -850,7 +850,7 @@

    diff --git a/coverage/lcov-report/actions.js.html b/coverage/lcov-report/actions.js.html index 0d8d13e4..1b78dfe8 100644 --- a/coverage/lcov-report/actions.js.html +++ b/coverage/lcov-report/actions.js.html @@ -151,7 +151,7 @@

    diff --git a/coverage/lcov-report/globalEventListener.js.html b/coverage/lcov-report/globalEventListener.js.html index 38c92d88..d2154716 100644 --- a/coverage/lcov-report/globalEventListener.js.html +++ b/coverage/lcov-report/globalEventListener.js.html @@ -184,7 +184,7 @@

    diff --git a/coverage/lcov-report/helpers.js.html b/coverage/lcov-report/helpers.js.html index 14f17744..84c765be 100644 --- a/coverage/lcov-report/helpers.js.html +++ b/coverage/lcov-report/helpers.js.html @@ -139,7 +139,7 @@

    diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html index 16cc7f99..39b90315 100644 --- a/coverage/lcov-report/index.html +++ b/coverage/lcov-report/index.html @@ -158,7 +158,7 @@

    diff --git a/dist/react-contextmenu.js b/dist/react-contextmenu.js index 749ed690..4805f0f2 100644 --- a/dist/react-contextmenu.js +++ b/dist/react-contextmenu.js @@ -8,4 +8,4 @@ var r=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,a=Object.pr Licensed under the MIT License (MIT), see http://jedwatson.github.io/classnames */ -!function(){"use strict";function n(){for(var e=[],t=0;to?i.bottom=0:i.top=0,r.rightt?r.bottom=0:r.top=0,o.left<0?r.left="100%":r.right="100%",r},n.hideMenu=function(e){e.detail&&e.detail.id&&n.menu&&e.detail.id!==n.menu.id||(n.props.forceOpen&&n.props.forceClose(),n.setState({visible:!1,selectedItem:null}),n.unregisterHandlers())},n.handleClick=function(e){e.preventDefault(),n.props.disabled||Object(m.a)(n.props.onClick,e,h()({},n.props.data,m.e.data),m.e.target)},n.handleMouseEnter=function(){n.closetimer&&clearTimeout(n.closetimer),n.props.disabled||n.state.visible||(n.opentimer=setTimeout(function(){return n.setState({visible:!0,selectedItem:null})},n.props.hoverDelay))},n.handleMouseLeave=function(){n.opentimer&&clearTimeout(n.opentimer),n.state.visible&&(n.closetimer=setTimeout(function(){return n.setState({visible:!1,selectedItem:null})},n.props.hoverDelay))},n.menuRef=function(e){n.menu=e},n.subMenuRef=function(e){n.subMenu=e},n.registerHandlers=function(){document.removeEventListener("keydown",n.props.parentKeyNavigationHandler),document.addEventListener("keydown",n.handleKeyNavigation)},n.unregisterHandlers=function(e){document.removeEventListener("keydown",n.handleKeyNavigation),e||document.addEventListener("keydown",n.props.parentKeyNavigationHandler)},n.state=h()({},n.state,{visible:!1}),n}return a(t,e),O(t,[{key:"componentDidMount",value:function(){this.listenId=v.a.register(function(){},this.hideMenu)}},{key:"getSubMenuType",value:function(){return t}},{key:"shouldComponentUpdate",value:function(e,t){return this.isVisibilityChange=!(this.state.visible===t.visible&&this.props.forceOpen===e.forceOpen||this.state.visible&&e.forceOpen||this.props.forceOpen&&t.visible),!0}},{key:"componentDidUpdate",value:function(){var e=this;if(this.isVisibilityChange)if(this.props.forceOpen||this.state.visible){var t=window.requestAnimationFrame||setTimeout;t(function(){var t=e.props.rtl?e.getRTLMenuPosition():e.getMenuPosition();e.subMenu.style.removeProperty("top"),e.subMenu.style.removeProperty("bottom"),e.subMenu.style.removeProperty("left"),e.subMenu.style.removeProperty("right"),Object(m.d)(t,"top")&&(e.subMenu.style.top=t.top),Object(m.d)(t,"left")&&(e.subMenu.style.left=t.left),Object(m.d)(t,"bottom")&&(e.subMenu.style.bottom=t.bottom),Object(m.d)(t,"right")&&(e.subMenu.style.right=t.right),e.subMenu.classList.add(m.c.menuVisible),e.registerHandlers(),e.setState({selectedItem:null})})}else{var n=function t(){e.subMenu.removeEventListener("transitionend",t),e.subMenu.style.removeProperty("bottom"),e.subMenu.style.removeProperty("right"),e.subMenu.style.top=0,e.subMenu.style.left="100%",e.unregisterHandlers()};this.subMenu.addEventListener("transitionend",n),this.subMenu.classList.remove(m.c.menuVisible)}}},{key:"componentWillUnmount",value:function(){this.listenId&&v.a.unregister(this.listenId),this.opentimer&&clearTimeout(this.opentimer),this.closetimer&&clearTimeout(this.closetimer),this.unregisterHandlers(!0)}},{key:"render",value:function(){var e,t=this.props,n=t.children,r=t.attributes,i=t.disabled,a=t.title,u=t.selected,c=this.state.visible,l={ref:this.menuRef,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave,className:p()(m.c.menuItem,m.c.subMenu,r.listClassName),style:{position:"relative"}},d={className:p()(m.c.menuItem,r.className,(e={},o(e,p()(m.c.menuItemDisabled,r.disabledClassName),i),o(e,p()(m.c.menuItemActive,r.visibleClassName),c),o(e,p()(m.c.menuItemSelected,r.selectedClassName),u),e)),onMouseMove:this.props.onMouseMove,onMouseOut:this.props.onMouseOut,onClick:this.handleClick},f={ref:this.subMenuRef,style:{position:"absolute",transition:"opacity 1ms",top:0,left:"100%"},className:p()(m.c.menu,this.props.className)};return s.a.createElement("nav",y({},l,{role:"menuitem",tabIndex:"-1","aria-haspopup":"true"}),s.a.createElement("div",y({},r,d),a),s.a.createElement("nav",y({},f,{role:"menu",tabIndex:"-1"}),this.renderChildren(n)))}}]),t}(b.a);g.propTypes={children:l.a.node.isRequired,attributes:l.a.object,title:l.a.node.isRequired,className:l.a.string,disabled:l.a.bool,hoverDelay:l.a.number,rtl:l.a.bool,selected:l.a.bool,onMouseMove:l.a.func,onMouseOut:l.a.func,forceOpen:l.a.bool,forceClose:l.a.func,parentKeyNavigationHandler:l.a.func},g.defaultProps={disabled:!1,hoverDelay:500,attributes:{},className:"",rtl:!1,selected:!1,onMouseMove:function(){return null},onMouseOut:function(){return null},forceOpen:!1,forceClose:function(){return null},parentKeyNavigationHandler:function(){return null}},t.a=g},function(e,t,n){"use strict";function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(0),u=n.n(a),s=n(2),c=n.n(s),l=n(5),d=n.n(l),p=n(3),f=n.n(p),h=n(4),b=n(1),m=function(){function e(e,t){for(var n=0;n=0&&0===e.button&&(e.persist(),e.stopPropagation(),i.mouseDownTimeoutId=setTimeout(function(){return i.handleContextClick(e)},i.props.holdToDisplay)),Object(b.a)(i.props.attributes.onMouseDown,e)},i.handleMouseUp=function(e){0===e.button&&clearTimeout(i.mouseDownTimeoutId),Object(b.a)(i.props.attributes.onMouseUp,e)},i.handleMouseOut=function(e){0===e.button&&clearTimeout(i.mouseDownTimeoutId),Object(b.a)(i.props.attributes.onMouseOut,e)},i.handleTouchstart=function(e){i.touchHandled=!1,i.props.holdToDisplay>=0&&(e.persist(),e.stopPropagation(),i.touchstartTimeoutId=setTimeout(function(){i.handleContextClick(e),i.touchHandled=!0},i.props.holdToDisplay)),Object(b.a)(i.props.attributes.onTouchStart,e)},i.handleTouchEnd=function(e){i.touchHandled&&e.preventDefault(),clearTimeout(i.touchstartTimeoutId),Object(b.a)(i.props.attributes.onTouchEnd,e)},i.handleContextMenu=function(e){i.handleContextClick(e),Object(b.a)(i.props.attributes.onContextMenu,e)},i.handleContextClick=function(e){if(!i.props.disable){e.preventDefault(),e.stopPropagation();var t=e.clientX||e.touches&&e.touches[0].pageX,n=e.clientY||e.touches&&e.touches[0].pageY;i.props.posX&&(t-=i.props.posX),Object(h.c)();var o=Object(b.a)(i.props.collect,i.props),r={position:{x:t,y:n},target:i.elem,id:i.props.id,data:o};o&&"function"==typeof o.then?o.then(function(e){r.data=e,Object(h.d)(r)}):Object(h.d)(r)}},i.elemRef=function(e){i.elem=e},a=n,r(i,a)}return i(t,e),m(t,[{key:"render",value:function(){var e=this.props,t=e.renderTag,n=e.attributes,o=e.children,r=f()({},n,{className:d()(b.c.menuWrapper,n.className),onContextMenu:this.handleContextMenu,onMouseDown:this.handleMouseDown,onMouseUp:this.handleMouseUp,onTouchStart:this.handleTouchstart,onTouchEnd:this.handleTouchEnd,onMouseOut:this.handleMouseOut,ref:this.elemRef});return u.a.createElement(t,r,o)}}]),t}(a.Component);v.propTypes={id:c.a.string.isRequired,children:c.a.node.isRequired,attributes:c.a.object,collect:c.a.func,disable:c.a.bool,holdToDisplay:c.a.number,posX:c.a.number,renderTag:c.a.oneOfType([c.a.node,c.a.func])},v.defaultProps={attributes:{},collect:function(){return null},disable:!1,holdToDisplay:1e3,renderTag:"div",posX:0},t.a=v},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n(12);n.d(t,"ContextMenu",function(){return o.a});var r=n(10);n.d(t,"ContextMenuTrigger",function(){return r.a});var i=n(8);n.d(t,"MenuItem",function(){return i.a});var a=n(9);n.d(t,"SubMenu",function(){return a.a});var u=n(15);n.d(t,"connectMenu",function(){return u.a});var s=n(4);n.d(t,"hideMenu",function(){return s.c}),n.d(t,"showMenu",function(){return s.d})},function(e,t,n){"use strict";function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=n(0),s=n.n(u),c=n(2),l=n.n(c),d=n(5),p=n.n(d),f=n(3),h=n.n(f),b=n(6),m=n(7),v=n(9),y=n(4),O=n(1),g=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o={top:t,left:e};if(!n.menu)return o;var r=window,i=r.innerWidth,a=r.innerHeight,u=n.menu.getBoundingClientRect();return t+u.height>a&&(o.top-=u.height),e+u.width>i&&(o.left-=u.width),o.top<0&&(o.top=u.heighto?i.bottom=0:i.top=0,r.rightt?r.bottom=0:r.top=0,o.left<0?r.left="100%":r.right="100%",r},n.hideMenu=function(e){e.detail&&e.detail.id&&n.menu&&e.detail.id!==n.menu.id||(n.props.forceOpen&&n.props.forceClose(),n.setState({visible:!1,selectedItem:null}),n.unregisterHandlers())},n.handleClick=function(e){e.preventDefault(),n.props.disabled||Object(m.a)(n.props.onClick,e,h()({},n.props.data,m.e.data),m.e.target)},n.handleMouseEnter=function(){n.closetimer&&clearTimeout(n.closetimer),n.props.disabled||n.state.visible||(n.opentimer=setTimeout(function(){return n.setState({visible:!0,selectedItem:null})},n.props.hoverDelay))},n.handleMouseLeave=function(){n.opentimer&&clearTimeout(n.opentimer),n.state.visible&&(n.closetimer=setTimeout(function(){return n.setState({visible:!1,selectedItem:null})},n.props.hoverDelay))},n.menuRef=function(e){n.menu=e},n.subMenuRef=function(e){n.subMenu=e},n.registerHandlers=function(){document.removeEventListener("keydown",n.props.parentKeyNavigationHandler),document.addEventListener("keydown",n.handleKeyNavigation)},n.unregisterHandlers=function(e){document.removeEventListener("keydown",n.handleKeyNavigation),e||document.addEventListener("keydown",n.props.parentKeyNavigationHandler)},n.state=h()({},n.state,{visible:!1}),n}return a(t,e),O(t,[{key:"componentDidMount",value:function(){this.listenId=v.a.register(function(){},this.hideMenu)}},{key:"getSubMenuType",value:function(){return t}},{key:"shouldComponentUpdate",value:function(e,t){return this.isVisibilityChange=!(this.state.visible===t.visible&&this.props.forceOpen===e.forceOpen||this.state.visible&&e.forceOpen||this.props.forceOpen&&t.visible),!0}},{key:"componentDidUpdate",value:function(){var e=this;if(this.isVisibilityChange)if(this.props.forceOpen||this.state.visible){var t=window.requestAnimationFrame||setTimeout;t(function(){var t=e.props.rtl?e.getRTLMenuPosition():e.getMenuPosition();e.subMenu.style.removeProperty("top"),e.subMenu.style.removeProperty("bottom"),e.subMenu.style.removeProperty("left"),e.subMenu.style.removeProperty("right"),Object(m.d)(t,"top")&&(e.subMenu.style.top=t.top),Object(m.d)(t,"left")&&(e.subMenu.style.left=t.left),Object(m.d)(t,"bottom")&&(e.subMenu.style.bottom=t.bottom),Object(m.d)(t,"right")&&(e.subMenu.style.right=t.right),e.subMenu.classList.add(m.c.menuVisible),e.registerHandlers(),e.setState({selectedItem:null})})}else{var n=function t(){e.subMenu.removeEventListener("transitionend",t),e.subMenu.style.removeProperty("bottom"),e.subMenu.style.removeProperty("right"),e.subMenu.style.top=0,e.subMenu.style.left="100%",e.unregisterHandlers()};this.subMenu.addEventListener("transitionend",n),this.subMenu.classList.remove(m.c.menuVisible)}}},{key:"componentWillUnmount",value:function(){this.listenId&&v.a.unregister(this.listenId),this.opentimer&&clearTimeout(this.opentimer),this.closetimer&&clearTimeout(this.closetimer),this.unregisterHandlers(!0)}},{key:"render",value:function(){var e,t=this.props,n=t.children,r=t.attributes,i=t.disabled,a=t.title,u=t.selected,c=this.state.visible,l={ref:this.menuRef,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave,className:p()(m.c.menuItem,m.c.subMenu,r.listClassName),style:{position:"relative"}},d={className:p()(m.c.menuItem,r.className,(e={},o(e,p()(m.c.menuItemDisabled,r.disabledClassName),i),o(e,p()(m.c.menuItemActive,r.visibleClassName),c),o(e,p()(m.c.menuItemSelected,r.selectedClassName),u),e)),onMouseMove:this.props.onMouseMove,onMouseOut:this.props.onMouseOut,onClick:this.handleClick},f={ref:this.subMenuRef,style:{position:"absolute",transition:"opacity 1ms",top:0,left:"100%"},className:p()(m.c.menu,this.props.className)};return s.a.createElement("nav",y({},l,{role:"menuitem",tabIndex:"-1","aria-haspopup":"true"}),s.a.createElement("div",y({},r,d),a),s.a.createElement("nav",y({},f,{role:"menu",tabIndex:"-1"}),this.renderChildren(n)))}}]),t}(b.a);g.propTypes={children:l.a.node.isRequired,attributes:l.a.object,title:l.a.node.isRequired,className:l.a.string,disabled:l.a.bool,hoverDelay:l.a.number,rtl:l.a.bool,selected:l.a.bool,onMouseMove:l.a.func,onMouseOut:l.a.func,forceOpen:l.a.bool,forceClose:l.a.func,parentKeyNavigationHandler:l.a.func},g.defaultProps={disabled:!1,hoverDelay:500,attributes:{},className:"",rtl:!1,selected:!1,onMouseMove:function(){return null},onMouseOut:function(){return null},forceOpen:!1,forceClose:function(){return null},parentKeyNavigationHandler:function(){return null}},t.a=g},function(e,t,n){"use strict";function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(0),u=n.n(a),s=n(2),c=n.n(s),l=n(5),d=n.n(l),p=n(3),f=n.n(p),h=n(4),b=n(1),m=function(){function e(e,t){for(var n=0;n=0&&0===e.button&&(e.persist(),e.stopPropagation(),i.mouseDownTimeoutId=setTimeout(function(){return i.handleContextClick(e)},i.props.holdToDisplay)),Object(b.a)(i.props.attributes.onMouseDown,e)},i.handleMouseUp=function(e){0===e.button&&clearTimeout(i.mouseDownTimeoutId),Object(b.a)(i.props.attributes.onMouseUp,e)},i.handleMouseOut=function(e){0===e.button&&clearTimeout(i.mouseDownTimeoutId),Object(b.a)(i.props.attributes.onMouseOut,e)},i.handleTouchstart=function(e){i.touchHandled=!1,i.props.holdToDisplay>=0&&(e.persist(),e.stopPropagation(),i.touchstartTimeoutId=setTimeout(function(){i.handleContextClick(e),i.touchHandled=!0},i.props.holdToDisplay)),Object(b.a)(i.props.attributes.onTouchStart,e)},i.handleTouchEnd=function(e){i.touchHandled&&e.preventDefault(),clearTimeout(i.touchstartTimeoutId),Object(b.a)(i.props.attributes.onTouchEnd,e)},i.handleContextMenu=function(e){i.handleContextClick(e),Object(b.a)(i.props.attributes.onContextMenu,e)},i.handleContextClick=function(e){if(!i.props.disable){e.preventDefault(),e.stopPropagation();var t=e.clientX||e.touches&&e.touches[0].pageX,n=e.clientY||e.touches&&e.touches[0].pageY;i.props.posX&&(t-=i.props.posX),i.props.posY&&(n-=i.props.posY),Object(h.c)();var o=Object(b.a)(i.props.collect,i.props),r={position:{x:t,y:n},target:i.elem,id:i.props.id,data:o};o&&"function"==typeof o.then?o.then(function(e){r.data=e,Object(h.d)(r)}):Object(h.d)(r)}},i.elemRef=function(e){i.elem=e},a=n,r(i,a)}return i(t,e),m(t,[{key:"render",value:function(){var e=this.props,t=e.renderTag,n=e.attributes,o=e.children,r=f()({},n,{className:d()(b.c.menuWrapper,n.className),onContextMenu:this.handleContextMenu,onMouseDown:this.handleMouseDown,onMouseUp:this.handleMouseUp,onTouchStart:this.handleTouchstart,onTouchEnd:this.handleTouchEnd,onMouseOut:this.handleMouseOut,ref:this.elemRef});return u.a.createElement(t,r,o)}}]),t}(a.Component);v.propTypes={id:c.a.string.isRequired,children:c.a.node.isRequired,attributes:c.a.object,collect:c.a.func,disable:c.a.bool,holdToDisplay:c.a.number,posX:c.a.number,posY:c.a.number,renderTag:c.a.oneOfType([c.a.node,c.a.func])},v.defaultProps={attributes:{},collect:function(){return null},disable:!1,holdToDisplay:1e3,renderTag:"div",posX:0,posY:0},t.a=v},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n(12);n.d(t,"ContextMenu",function(){return o.a});var r=n(10);n.d(t,"ContextMenuTrigger",function(){return r.a});var i=n(8);n.d(t,"MenuItem",function(){return i.a});var a=n(9);n.d(t,"SubMenu",function(){return a.a});var u=n(15);n.d(t,"connectMenu",function(){return u.a});var s=n(4);n.d(t,"hideMenu",function(){return s.c}),n.d(t,"showMenu",function(){return s.d})},function(e,t,n){"use strict";function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=n(0),s=n.n(u),c=n(2),l=n.n(c),d=n(5),p=n.n(d),f=n(3),h=n.n(f),b=n(6),m=n(7),v=n(9),y=n(4),O=n(1),g=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o={top:t,left:e};if(!n.menu)return o;var r=window,i=r.innerWidth,a=r.innerHeight,u=n.menu.getBoundingClientRect();return t+u.height>a&&(o.top-=u.height),e+u.width>i&&(o.left-=u.width),o.top<0&&(o.top=u.height Date: Tue, 24 Jul 2018 10:32:15 +0530 Subject: [PATCH 211/258] Highlighted the note part for holdToDisplay prop. --- docs/api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api.md b/docs/api.md index 94ff58f5..31dd8c28 100644 --- a/docs/api.md +++ b/docs/api.md @@ -33,7 +33,7 @@ Contextmenu Trigger Component | attributes | Object | | | The attributes will be passed directly passed to the root element of component. Use this to customize it like adding custom classes, adding `colspan` etc. | | collect | Function | | | A simple function which takes `props` as input and returns the data to be passed to contextmenu. | | disable | Boolean | | `false` | Prop to ignore right clicks and display the default browser context menu. | -| holdToDisplay | Number | | `1000` | This is applicable only for touch screens. The time (in ms) for which, user has to hold down his/her finger before the menu is shown. Note: To disable the long press trigger on left-click just set a negative holdToDisplay value such as `-1` | +| holdToDisplay | Number | | `1000` | This is applicable only for touch screens. The time (in ms) for which, user has to hold down his/her finger before the menu is shown. **Note:** To disable the long press trigger on left-click just set a negative holdToDisplay value such as `-1` | | renderTag | String or React Element | | | The element inside which the Component must be wrapped. By default `div` is used. But this prop can used to customize it. | ### `` From 9c36e96b40e88cbf2bcb8b81860300df5c8ef5f9 Mon Sep 17 00:00:00 2001 From: Akash Depra Date: Tue, 24 Jul 2018 11:52:29 +0530 Subject: [PATCH 212/258] Changed gitignore --- .gitignore | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a413743c..36f1f6d7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,10 @@ node_modules/ public/ +dist/ +modules/ +es6/ +coverage/ .vscode .idea *.log -*.js.map +*.js.map \ No newline at end of file From a50d99e02ee956ce5587f9e150d66bb1329861ff Mon Sep 17 00:00:00 2001 From: Akash Depra Date: Tue, 24 Jul 2018 11:56:26 +0530 Subject: [PATCH 213/258] Removed unwanted directories --- .gitignore | 4 - coverage/clover.xml | 295 ------ coverage/coverage-final.json | 8 - coverage/lcov-report/AbstractMenu.js.html | 522 ----------- coverage/lcov-report/ContextMenu.js.html | 684 -------------- coverage/lcov-report/MenuItem.js.html | 288 ------ coverage/lcov-report/SubMenu.js.html | 867 ------------------ coverage/lcov-report/actions.js.html | 168 ---- coverage/lcov-report/base.css | 223 ----- coverage/lcov-report/block-navigation.js | 63 -- .../lcov-report/globalEventListener.js.html | 201 ---- coverage/lcov-report/helpers.js.html | 156 ---- coverage/lcov-report/index.html | 175 ---- coverage/lcov-report/prettify.css | 1 - coverage/lcov-report/prettify.js | 1 - coverage/lcov-report/sort-arrow-sprite.png | Bin 209 -> 0 bytes coverage/lcov-report/sorter.js | 158 ---- coverage/lcov.info | 667 -------------- dist/react-contextmenu.js | 11 - es6/AbstractMenu.js | 180 ---- es6/ContextMenu.js | 246 ----- es6/ContextMenuTrigger.js | 161 ---- es6/MenuItem.js | 112 --- es6/SubMenu.js | 311 ------- es6/actions.js | 40 - es6/connectMenu.js | 82 -- es6/globalEventListener.js | 48 - es6/helpers.js | 31 - es6/index.js | 6 - modules/AbstractMenu.js | 195 ---- modules/ContextMenu.js | 275 ------ modules/ContextMenuTrigger.js | 181 ---- modules/MenuItem.js | 132 --- modules/SubMenu.js | 336 ------- modules/actions.js | 54 -- modules/connectMenu.js | 98 -- modules/globalEventListener.js | 55 -- modules/helpers.js | 39 - modules/index.js | 67 -- 39 files changed, 7141 deletions(-) delete mode 100644 coverage/clover.xml delete mode 100644 coverage/coverage-final.json delete mode 100644 coverage/lcov-report/AbstractMenu.js.html delete mode 100644 coverage/lcov-report/ContextMenu.js.html delete mode 100644 coverage/lcov-report/MenuItem.js.html delete mode 100644 coverage/lcov-report/SubMenu.js.html delete mode 100644 coverage/lcov-report/actions.js.html delete mode 100644 coverage/lcov-report/base.css delete mode 100644 coverage/lcov-report/block-navigation.js delete mode 100644 coverage/lcov-report/globalEventListener.js.html delete mode 100644 coverage/lcov-report/helpers.js.html delete mode 100644 coverage/lcov-report/index.html delete mode 100644 coverage/lcov-report/prettify.css delete mode 100644 coverage/lcov-report/prettify.js delete mode 100644 coverage/lcov-report/sort-arrow-sprite.png delete mode 100644 coverage/lcov-report/sorter.js delete mode 100644 coverage/lcov.info delete mode 100644 dist/react-contextmenu.js delete mode 100644 es6/AbstractMenu.js delete mode 100644 es6/ContextMenu.js delete mode 100644 es6/ContextMenuTrigger.js delete mode 100644 es6/MenuItem.js delete mode 100644 es6/SubMenu.js delete mode 100644 es6/actions.js delete mode 100644 es6/connectMenu.js delete mode 100644 es6/globalEventListener.js delete mode 100644 es6/helpers.js delete mode 100644 es6/index.js delete mode 100644 modules/AbstractMenu.js delete mode 100644 modules/ContextMenu.js delete mode 100644 modules/ContextMenuTrigger.js delete mode 100644 modules/MenuItem.js delete mode 100644 modules/SubMenu.js delete mode 100644 modules/actions.js delete mode 100644 modules/connectMenu.js delete mode 100644 modules/globalEventListener.js delete mode 100644 modules/helpers.js delete mode 100644 modules/index.js diff --git a/.gitignore b/.gitignore index 36f1f6d7..637782bd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,5 @@ node_modules/ public/ -dist/ -modules/ -es6/ -coverage/ .vscode .idea *.log diff --git a/coverage/clover.xml b/coverage/clover.xml deleted file mode 100644 index 17ce4dbd..00000000 --- a/coverage/clover.xml +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json deleted file mode 100644 index e167e33d..00000000 --- a/coverage/coverage-final.json +++ /dev/null @@ -1,8 +0,0 @@ -{"/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/AbstractMenu.js": {"path":"/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/AbstractMenu.js","statementMap":{"0":{"start":{"line":12,"column":8},"end":{"line":12,"column":21}},"1":{"start":{"line":14,"column":8},"end":{"line":14,"column":35}},"2":{"start":{"line":15,"column":8},"end":{"line":18,"column":10}},"3":{"start":{"line":24,"column":8},"end":{"line":26,"column":9}},"4":{"start":{"line":25,"column":12},"end":{"line":25,"column":19}},"5":{"start":{"line":28,"column":8},"end":{"line":65,"column":9}},"6":{"start":{"line":31,"column":16},"end":{"line":31,"column":35}},"7":{"start":{"line":32,"column":16},"end":{"line":32,"column":33}},"8":{"start":{"line":33,"column":16},"end":{"line":33,"column":22}},"9":{"start":{"line":35,"column":16},"end":{"line":35,"column":35}},"10":{"start":{"line":36,"column":16},"end":{"line":36,"column":42}},"11":{"start":{"line":37,"column":16},"end":{"line":37,"column":22}},"12":{"start":{"line":39,"column":16},"end":{"line":39,"column":35}},"13":{"start":{"line":40,"column":16},"end":{"line":40,"column":43}},"14":{"start":{"line":41,"column":16},"end":{"line":41,"column":22}},"15":{"start":{"line":43,"column":16},"end":{"line":43,"column":41}},"16":{"start":{"line":44,"column":16},"end":{"line":44,"column":22}},"17":{"start":{"line":46,"column":16},"end":{"line":46,"column":35}},"18":{"start":{"line":47,"column":16},"end":{"line":47,"column":41}},"19":{"start":{"line":50,"column":37},"end":{"line":52,"column":58}},"20":{"start":{"line":54,"column":20},"end":{"line":60,"column":21}},"21":{"start":{"line":57,"column":24},"end":{"line":57,"column":56}},"22":{"start":{"line":59,"column":24},"end":{"line":59,"column":41}},"23":{"start":{"line":62,"column":16},"end":{"line":62,"column":22}},"24":{"start":{"line":69,"column":8},"end":{"line":69,"column":51}},"25":{"start":{"line":73,"column":8},"end":{"line":76,"column":9}},"26":{"start":{"line":74,"column":12},"end":{"line":74,"column":31}},"27":{"start":{"line":75,"column":12},"end":{"line":75,"column":54}},"28":{"start":{"line":80,"column":33},"end":{"line":80,"column":43}},"29":{"start":{"line":81,"column":25},"end":{"line":81,"column":27}},"30":{"start":{"line":82,"column":31},"end":{"line":95,"column":9}},"31":{"start":{"line":85,"column":12},"end":{"line":87,"column":13}},"32":{"start":{"line":86,"column":16},"end":{"line":86,"column":23}},"33":{"start":{"line":89,"column":12},"end":{"line":94,"column":13}},"34":{"start":{"line":91,"column":16},"end":{"line":91,"column":77}},"35":{"start":{"line":92,"column":19},"end":{"line":94,"column":13}},"36":{"start":{"line":93,"column":16},"end":{"line":93,"column":37}},"37":{"start":{"line":96,"column":8},"end":{"line":96,"column":68}},"38":{"start":{"line":97,"column":29},"end":{"line":97,"column":59}},"39":{"start":{"line":98,"column":8},"end":{"line":113,"column":9}},"40":{"start":{"line":99,"column":12},"end":{"line":102,"column":15}},"41":{"start":{"line":103,"column":15},"end":{"line":113,"column":9}},"42":{"start":{"line":104,"column":12},"end":{"line":107,"column":15}},"43":{"start":{"line":109,"column":12},"end":{"line":112,"column":15}},"44":{"start":{"line":117,"column":8},"end":{"line":119,"column":9}},"45":{"start":{"line":118,"column":12},"end":{"line":118,"column":76}},"46":{"start":{"line":123,"column":8},"end":{"line":123,"column":71}},"47":{"start":{"line":126,"column":33},"end":{"line":150,"column":6}},"48":{"start":{"line":127,"column":22},"end":{"line":127,"column":24}},"49":{"start":{"line":128,"column":8},"end":{"line":128,"column":55}},"50":{"start":{"line":128,"column":42},"end":{"line":128,"column":55}},"51":{"start":{"line":129,"column":8},"end":{"line":133,"column":9}},"52":{"start":{"line":131,"column":12},"end":{"line":131,"column":71}},"53":{"start":{"line":132,"column":12},"end":{"line":132,"column":52}},"54":{"start":{"line":134,"column":8},"end":{"line":134,"column":63}},"55":{"start":{"line":135,"column":8},"end":{"line":140,"column":9}},"56":{"start":{"line":137,"column":12},"end":{"line":137,"column":97}},"57":{"start":{"line":138,"column":12},"end":{"line":138,"column":53}},"58":{"start":{"line":139,"column":12},"end":{"line":139,"column":72}},"59":{"start":{"line":141,"column":8},"end":{"line":146,"column":9}},"60":{"start":{"line":143,"column":12},"end":{"line":143,"column":34}},"61":{"start":{"line":144,"column":12},"end":{"line":144,"column":64}},"62":{"start":{"line":144,"column":35},"end":{"line":144,"column":61}},"63":{"start":{"line":145,"column":12},"end":{"line":145,"column":52}},"64":{"start":{"line":148,"column":8},"end":{"line":148,"column":63}},"65":{"start":{"line":148,"column":34},"end":{"line":148,"column":62}},"66":{"start":{"line":149,"column":8},"end":{"line":149,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":11,"column":4},"end":{"line":11,"column":5}},"loc":{"start":{"line":11,"column":23},"end":{"line":19,"column":5}},"line":11},"1":{"name":"(anonymous_1)","decl":{"start":{"line":21,"column":26},"end":{"line":21,"column":27}},"loc":{"start":{"line":21,"column":33},"end":{"line":66,"column":5}},"line":21},"2":{"name":"(anonymous_2)","decl":{"start":{"line":68,"column":23},"end":{"line":68,"column":24}},"loc":{"start":{"line":68,"column":29},"end":{"line":70,"column":5}},"line":68},"3":{"name":"(anonymous_3)","decl":{"start":{"line":72,"column":23},"end":{"line":72,"column":24}},"loc":{"start":{"line":72,"column":30},"end":{"line":77,"column":5}},"line":72},"4":{"name":"(anonymous_4)","decl":{"start":{"line":79,"column":21},"end":{"line":79,"column":22}},"loc":{"start":{"line":79,"column":34},"end":{"line":114,"column":5}},"line":79},"5":{"name":"(anonymous_5)","decl":{"start":{"line":82,"column":31},"end":{"line":82,"column":32}},"loc":{"start":{"line":82,"column":42},"end":{"line":95,"column":9}},"line":82},"6":{"name":"(anonymous_6)","decl":{"start":{"line":116,"column":23},"end":{"line":116,"column":24}},"loc":{"start":{"line":116,"column":34},"end":{"line":120,"column":5}},"line":116},"7":{"name":"(anonymous_7)","decl":{"start":{"line":122,"column":24},"end":{"line":122,"column":25}},"loc":{"start":{"line":122,"column":30},"end":{"line":124,"column":5}},"line":122},"8":{"name":"(anonymous_8)","decl":{"start":{"line":126,"column":21},"end":{"line":126,"column":22}},"loc":{"start":{"line":126,"column":33},"end":{"line":150,"column":6}},"line":126},"9":{"name":"(anonymous_9)","decl":{"start":{"line":126,"column":62},"end":{"line":126,"column":63}},"loc":{"start":{"line":126,"column":73},"end":{"line":150,"column":5}},"line":126},"10":{"name":"(anonymous_10)","decl":{"start":{"line":144,"column":24},"end":{"line":144,"column":25}},"loc":{"start":{"line":144,"column":33},"end":{"line":144,"column":63}},"line":144},"11":{"name":"(anonymous_11)","decl":{"start":{"line":148,"column":28},"end":{"line":148,"column":29}},"loc":{"start":{"line":148,"column":34},"end":{"line":148,"column":62}},"line":148}},"branchMap":{"0":{"loc":{"start":{"line":24,"column":8},"end":{"line":26,"column":9}},"type":"if","locations":[{"start":{"line":24,"column":8},"end":{"line":26,"column":9}},{"start":{"line":24,"column":8},"end":{"line":26,"column":9}}],"line":24},"1":{"loc":{"start":{"line":28,"column":8},"end":{"line":65,"column":9}},"type":"switch","locations":[{"start":{"line":29,"column":12},"end":{"line":29,"column":20}},{"start":{"line":30,"column":12},"end":{"line":33,"column":22}},{"start":{"line":34,"column":12},"end":{"line":37,"column":22}},{"start":{"line":38,"column":12},"end":{"line":41,"column":22}},{"start":{"line":42,"column":12},"end":{"line":44,"column":22}},{"start":{"line":45,"column":12},"end":{"line":62,"column":22}},{"start":{"line":63,"column":12},"end":{"line":63,"column":20}}],"line":28},"2":{"loc":{"start":{"line":50,"column":37},"end":{"line":52,"column":58}},"type":"binary-expr","locations":[{"start":{"line":50,"column":37},"end":{"line":50,"column":56}},{"start":{"line":51,"column":24},"end":{"line":51,"column":49}},{"start":{"line":52,"column":24},"end":{"line":52,"column":58}}],"line":50},"3":{"loc":{"start":{"line":54,"column":20},"end":{"line":60,"column":21}},"type":"if","locations":[{"start":{"line":54,"column":20},"end":{"line":60,"column":21}},{"start":{"line":54,"column":20},"end":{"line":60,"column":21}}],"line":54},"4":{"loc":{"start":{"line":54,"column":24},"end":{"line":56,"column":33}},"type":"binary-expr","locations":[{"start":{"line":54,"column":24},"end":{"line":54,"column":43}},{"start":{"line":55,"column":24},"end":{"line":55,"column":70}},{"start":{"line":56,"column":24},"end":{"line":56,"column":33}}],"line":54},"5":{"loc":{"start":{"line":73,"column":8},"end":{"line":76,"column":9}},"type":"if","locations":[{"start":{"line":73,"column":8},"end":{"line":76,"column":9}},{"start":{"line":73,"column":8},"end":{"line":76,"column":9}}],"line":73},"6":{"loc":{"start":{"line":73,"column":12},"end":{"line":73,"column":93}},"type":"binary-expr","locations":[{"start":{"line":73,"column":12},"end":{"line":73,"column":35}},{"start":{"line":73,"column":39},"end":{"line":73,"column":93}}],"line":73},"7":{"loc":{"start":{"line":85,"column":12},"end":{"line":87,"column":13}},"type":"if","locations":[{"start":{"line":85,"column":12},"end":{"line":87,"column":13}},{"start":{"line":85,"column":12},"end":{"line":87,"column":13}}],"line":85},"8":{"loc":{"start":{"line":89,"column":12},"end":{"line":94,"column":13}},"type":"if","locations":[{"start":{"line":89,"column":12},"end":{"line":94,"column":13}},{"start":{"line":89,"column":12},"end":{"line":94,"column":13}}],"line":89},"9":{"loc":{"start":{"line":92,"column":19},"end":{"line":94,"column":13}},"type":"if","locations":[{"start":{"line":92,"column":19},"end":{"line":94,"column":13}},{"start":{"line":92,"column":19},"end":{"line":94,"column":13}}],"line":92},"10":{"loc":{"start":{"line":98,"column":8},"end":{"line":113,"column":9}},"type":"if","locations":[{"start":{"line":98,"column":8},"end":{"line":113,"column":9}},{"start":{"line":98,"column":8},"end":{"line":113,"column":9}}],"line":98},"11":{"loc":{"start":{"line":100,"column":30},"end":{"line":100,"column":83}},"type":"cond-expr","locations":[{"start":{"line":100,"column":40},"end":{"line":100,"column":69}},{"start":{"line":100,"column":72},"end":{"line":100,"column":83}}],"line":100},"12":{"loc":{"start":{"line":103,"column":15},"end":{"line":113,"column":9}},"type":"if","locations":[{"start":{"line":103,"column":15},"end":{"line":113,"column":9}},{"start":{"line":103,"column":15},"end":{"line":113,"column":9}}],"line":103},"13":{"loc":{"start":{"line":105,"column":39},"end":{"line":105,"column":100}},"type":"cond-expr","locations":[{"start":{"line":105,"column":62},"end":{"line":105,"column":81}},{"start":{"line":105,"column":84},"end":{"line":105,"column":100}}],"line":105},"14":{"loc":{"start":{"line":110,"column":39},"end":{"line":110,"column":96}},"type":"cond-expr","locations":[{"start":{"line":110,"column":76},"end":{"line":110,"column":92}},{"start":{"line":110,"column":95},"end":{"line":110,"column":96}}],"line":110},"15":{"loc":{"start":{"line":117,"column":8},"end":{"line":119,"column":9}},"type":"if","locations":[{"start":{"line":117,"column":8},"end":{"line":119,"column":9}},{"start":{"line":117,"column":8},"end":{"line":119,"column":9}}],"line":117},"16":{"loc":{"start":{"line":128,"column":8},"end":{"line":128,"column":55}},"type":"if","locations":[{"start":{"line":128,"column":8},"end":{"line":128,"column":55}},{"start":{"line":128,"column":8},"end":{"line":128,"column":55}}],"line":128},"17":{"loc":{"start":{"line":129,"column":8},"end":{"line":133,"column":9}},"type":"if","locations":[{"start":{"line":129,"column":8},"end":{"line":133,"column":9}},{"start":{"line":129,"column":8},"end":{"line":133,"column":9}}],"line":129},"18":{"loc":{"start":{"line":135,"column":8},"end":{"line":140,"column":9}},"type":"if","locations":[{"start":{"line":135,"column":8},"end":{"line":140,"column":9}},{"start":{"line":135,"column":8},"end":{"line":140,"column":9}}],"line":135},"19":{"loc":{"start":{"line":137,"column":30},"end":{"line":137,"column":96}},"type":"binary-expr","locations":[{"start":{"line":137,"column":30},"end":{"line":137,"column":57}},{"start":{"line":137,"column":62},"end":{"line":137,"column":95}}],"line":137},"20":{"loc":{"start":{"line":141,"column":8},"end":{"line":146,"column":9}},"type":"if","locations":[{"start":{"line":141,"column":8},"end":{"line":146,"column":9}},{"start":{"line":141,"column":8},"end":{"line":146,"column":9}}],"line":141},"21":{"loc":{"start":{"line":141,"column":12},"end":{"line":141,"column":69}},"type":"binary-expr","locations":[{"start":{"line":141,"column":12},"end":{"line":141,"column":32}},{"start":{"line":141,"column":36},"end":{"line":141,"column":69}}],"line":141}},"s":{"0":7,"1":7,"2":7,"3":2,"4":0,"5":2,"6":1,"7":1,"8":1,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":1,"18":1,"19":1,"20":1,"21":0,"22":1,"23":1,"24":0,"25":1,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":18,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0},"f":{"0":7,"1":2,"2":0,"3":1,"4":0,"5":0,"6":0,"7":0,"8":18,"9":0,"10":0,"11":0},"b":{"0":[0,2],"1":[0,1,0,0,0,1,0],"2":[1,0,0],"3":[0,1],"4":[1,0,0],"5":[0,1],"6":[1,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"b044abdf12dcc48afc41fc3c11cce67a6ec2e51c"} -,"/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/ContextMenu.js": {"path":"/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/ContextMenu.js","statementMap":{"0":{"start":{"line":29,"column":19},"end":{"line":29,"column":31}},"1":{"start":{"line":30,"column":25},"end":{"line":30,"column":37}},"2":{"start":{"line":31,"column":19},"end":{"line":31,"column":31}},"3":{"start":{"line":36,"column":8},"end":{"line":36,"column":21}},"4":{"start":{"line":38,"column":8},"end":{"line":42,"column":11}},"5":{"start":{"line":46,"column":8},"end":{"line":46,"column":23}},"6":{"start":{"line":50,"column":8},"end":{"line":50,"column":76}},"7":{"start":{"line":54,"column":8},"end":{"line":74,"column":9}},"8":{"start":{"line":55,"column":28},"end":{"line":55,"column":70}},"9":{"start":{"line":57,"column":12},"end":{"line":69,"column":15}},"10":{"start":{"line":58,"column":33},"end":{"line":58,"column":43}},"11":{"start":{"line":60,"column":38},"end":{"line":60,"column":64}},"12":{"start":{"line":62,"column":16},"end":{"line":68,"column":19}},"13":{"start":{"line":63,"column":20},"end":{"line":63,"column":43}},"14":{"start":{"line":63,"column":36},"end":{"line":63,"column":43}},"15":{"start":{"line":64,"column":20},"end":{"line":64,"column":53}},"16":{"start":{"line":65,"column":20},"end":{"line":65,"column":55}},"17":{"start":{"line":66,"column":20},"end":{"line":66,"column":48}},"18":{"start":{"line":67,"column":20},"end":{"line":67,"column":59}},"19":{"start":{"line":71,"column":12},"end":{"line":71,"column":35}},"20":{"start":{"line":71,"column":28},"end":{"line":71,"column":35}},"21":{"start":{"line":72,"column":12},"end":{"line":72,"column":40}},"22":{"start":{"line":73,"column":12},"end":{"line":73,"column":51}},"23":{"start":{"line":78,"column":8},"end":{"line":80,"column":9}},"24":{"start":{"line":79,"column":12},"end":{"line":79,"column":47}},"25":{"start":{"line":82,"column":8},"end":{"line":82,"column":34}},"26":{"start":{"line":86,"column":8},"end":{"line":86,"column":72}},"27":{"start":{"line":87,"column":8},"end":{"line":87,"column":73}},"28":{"start":{"line":88,"column":8},"end":{"line":88,"column":61}},"29":{"start":{"line":89,"column":8},"end":{"line":89,"column":66}},"30":{"start":{"line":90,"column":8},"end":{"line":90,"column":71}},"31":{"start":{"line":91,"column":8},"end":{"line":91,"column":59}},"32":{"start":{"line":95,"column":8},"end":{"line":95,"column":75}},"33":{"start":{"line":96,"column":8},"end":{"line":96,"column":76}},"34":{"start":{"line":97,"column":8},"end":{"line":97,"column":64}},"35":{"start":{"line":98,"column":8},"end":{"line":98,"column":69}},"36":{"start":{"line":99,"column":8},"end":{"line":99,"column":74}},"37":{"start":{"line":100,"column":8},"end":{"line":100,"column":62}},"38":{"start":{"line":104,"column":8},"end":{"line":104,"column":74}},"39":{"start":{"line":104,"column":67},"end":{"line":104,"column":74}},"40":{"start":{"line":106,"column":25},"end":{"line":106,"column":42}},"41":{"start":{"line":108,"column":8},"end":{"line":108,"column":49}},"42":{"start":{"line":109,"column":8},"end":{"line":109,"column":32}},"43":{"start":{"line":110,"column":8},"end":{"line":110,"column":43}},"44":{"start":{"line":114,"column":8},"end":{"line":118,"column":9}},"45":{"start":{"line":115,"column":12},"end":{"line":115,"column":38}},"46":{"start":{"line":116,"column":12},"end":{"line":116,"column":93}},"47":{"start":{"line":117,"column":12},"end":{"line":117,"column":47}},"48":{"start":{"line":122,"column":8},"end":{"line":122,"column":54}},"49":{"start":{"line":122,"column":43},"end":{"line":122,"column":54}},"50":{"start":{"line":126,"column":8},"end":{"line":126,"column":31}},"51":{"start":{"line":128,"column":8},"end":{"line":133,"column":10}},"52":{"start":{"line":135,"column":8},"end":{"line":135,"column":47}},"53":{"start":{"line":135,"column":36},"end":{"line":135,"column":47}},"54":{"start":{"line":139,"column":8},"end":{"line":141,"column":9}},"55":{"start":{"line":140,"column":12},"end":{"line":140,"column":31}},"56":{"start":{"line":142,"column":8},"end":{"line":142,"column":27}},"57":{"start":{"line":146,"column":8},"end":{"line":148,"column":9}},"58":{"start":{"line":147,"column":12},"end":{"line":147,"column":23}},"59":{"start":{"line":152,"column":25},"end":{"line":155,"column":9}},"60":{"start":{"line":157,"column":8},"end":{"line":157,"column":42}},"61":{"start":{"line":157,"column":24},"end":{"line":157,"column":42}},"62":{"start":{"line":159,"column":44},"end":{"line":159,"column":50}},"63":{"start":{"line":160,"column":21},"end":{"line":160,"column":54}},"64":{"start":{"line":162,"column":8},"end":{"line":164,"column":9}},"65":{"start":{"line":163,"column":12},"end":{"line":163,"column":42}},"66":{"start":{"line":166,"column":8},"end":{"line":168,"column":9}},"67":{"start":{"line":167,"column":12},"end":{"line":167,"column":42}},"68":{"start":{"line":170,"column":8},"end":{"line":172,"column":9}},"69":{"start":{"line":171,"column":12},"end":{"line":171,"column":93}},"70":{"start":{"line":174,"column":8},"end":{"line":176,"column":9}},"71":{"start":{"line":175,"column":12},"end":{"line":175,"column":90}},"72":{"start":{"line":178,"column":8},"end":{"line":178,"column":26}},"73":{"start":{"line":182,"column":8},"end":{"line":182,"column":22}},"74":{"start":{"line":186,"column":47},"end":{"line":186,"column":57}},"75":{"start":{"line":187,"column":30},"end":{"line":187,"column":40}},"76":{"start":{"line":188,"column":28},"end":{"line":192,"column":9}},"77":{"start":{"line":193,"column":31},"end":{"line":195,"column":10}},"78":{"start":{"line":197,"column":8},"end":{"line":203,"column":10}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":35,"column":4},"end":{"line":35,"column":5}},"loc":{"start":{"line":35,"column":23},"end":{"line":43,"column":5}},"line":35},"1":{"name":"(anonymous_1)","decl":{"start":{"line":45,"column":4},"end":{"line":45,"column":5}},"loc":{"start":{"line":45,"column":21},"end":{"line":47,"column":5}},"line":45},"2":{"name":"(anonymous_2)","decl":{"start":{"line":49,"column":4},"end":{"line":49,"column":5}},"loc":{"start":{"line":49,"column":24},"end":{"line":51,"column":5}},"line":49},"3":{"name":"(anonymous_3)","decl":{"start":{"line":53,"column":4},"end":{"line":53,"column":5}},"loc":{"start":{"line":53,"column":25},"end":{"line":75,"column":5}},"line":53},"4":{"name":"(anonymous_4)","decl":{"start":{"line":57,"column":20},"end":{"line":57,"column":21}},"loc":{"start":{"line":57,"column":26},"end":{"line":69,"column":13}},"line":57},"5":{"name":"(anonymous_5)","decl":{"start":{"line":62,"column":24},"end":{"line":62,"column":25}},"loc":{"start":{"line":62,"column":30},"end":{"line":68,"column":17}},"line":62},"6":{"name":"(anonymous_6)","decl":{"start":{"line":77,"column":4},"end":{"line":77,"column":5}},"loc":{"start":{"line":77,"column":27},"end":{"line":83,"column":5}},"line":77},"7":{"name":"(anonymous_7)","decl":{"start":{"line":85,"column":23},"end":{"line":85,"column":24}},"loc":{"start":{"line":85,"column":29},"end":{"line":92,"column":5}},"line":85},"8":{"name":"(anonymous_8)","decl":{"start":{"line":94,"column":25},"end":{"line":94,"column":26}},"loc":{"start":{"line":94,"column":31},"end":{"line":101,"column":5}},"line":94},"9":{"name":"(anonymous_9)","decl":{"start":{"line":103,"column":17},"end":{"line":103,"column":18}},"loc":{"start":{"line":103,"column":24},"end":{"line":111,"column":5}},"line":103},"10":{"name":"(anonymous_10)","decl":{"start":{"line":113,"column":17},"end":{"line":113,"column":18}},"loc":{"start":{"line":113,"column":24},"end":{"line":119,"column":5}},"line":113},"11":{"name":"(anonymous_11)","decl":{"start":{"line":121,"column":25},"end":{"line":121,"column":26}},"loc":{"start":{"line":121,"column":32},"end":{"line":123,"column":5}},"line":121},"12":{"name":"(anonymous_12)","decl":{"start":{"line":125,"column":23},"end":{"line":125,"column":24}},"loc":{"start":{"line":125,"column":34},"end":{"line":136,"column":5}},"line":125},"13":{"name":"(anonymous_13)","decl":{"start":{"line":138,"column":24},"end":{"line":138,"column":25}},"loc":{"start":{"line":138,"column":31},"end":{"line":143,"column":5}},"line":138},"14":{"name":"(anonymous_14)","decl":{"start":{"line":145,"column":15},"end":{"line":145,"column":16}},"loc":{"start":{"line":145,"column":22},"end":{"line":149,"column":5}},"line":145},"15":{"name":"(anonymous_15)","decl":{"start":{"line":151,"column":22},"end":{"line":151,"column":23}},"loc":{"start":{"line":151,"column":40},"end":{"line":179,"column":5}},"line":151},"16":{"name":"(anonymous_16)","decl":{"start":{"line":181,"column":14},"end":{"line":181,"column":15}},"loc":{"start":{"line":181,"column":21},"end":{"line":183,"column":5}},"line":181},"17":{"name":"(anonymous_17)","decl":{"start":{"line":185,"column":4},"end":{"line":185,"column":5}},"loc":{"start":{"line":185,"column":13},"end":{"line":204,"column":5}},"line":185}},"branchMap":{"0":{"loc":{"start":{"line":54,"column":8},"end":{"line":74,"column":9}},"type":"if","locations":[{"start":{"line":54,"column":8},"end":{"line":74,"column":9}},{"start":{"line":54,"column":8},"end":{"line":74,"column":9}}],"line":54},"1":{"loc":{"start":{"line":55,"column":28},"end":{"line":55,"column":70}},"type":"binary-expr","locations":[{"start":{"line":55,"column":28},"end":{"line":55,"column":56}},{"start":{"line":55,"column":60},"end":{"line":55,"column":70}}],"line":55},"2":{"loc":{"start":{"line":63,"column":20},"end":{"line":63,"column":43}},"type":"if","locations":[{"start":{"line":63,"column":20},"end":{"line":63,"column":43}},{"start":{"line":63,"column":20},"end":{"line":63,"column":43}}],"line":63},"3":{"loc":{"start":{"line":71,"column":12},"end":{"line":71,"column":35}},"type":"if","locations":[{"start":{"line":71,"column":12},"end":{"line":71,"column":35}},{"start":{"line":71,"column":12},"end":{"line":71,"column":35}}],"line":71},"4":{"loc":{"start":{"line":78,"column":8},"end":{"line":80,"column":9}},"type":"if","locations":[{"start":{"line":78,"column":8},"end":{"line":80,"column":9}},{"start":{"line":78,"column":8},"end":{"line":80,"column":9}}],"line":78},"5":{"loc":{"start":{"line":104,"column":8},"end":{"line":104,"column":74}},"type":"if","locations":[{"start":{"line":104,"column":8},"end":{"line":104,"column":74}},{"start":{"line":104,"column":8},"end":{"line":104,"column":74}}],"line":104},"6":{"loc":{"start":{"line":104,"column":12},"end":{"line":104,"column":65}},"type":"binary-expr","locations":[{"start":{"line":104,"column":12},"end":{"line":104,"column":41}},{"start":{"line":104,"column":45},"end":{"line":104,"column":65}}],"line":104},"7":{"loc":{"start":{"line":114,"column":8},"end":{"line":118,"column":9}},"type":"if","locations":[{"start":{"line":114,"column":8},"end":{"line":118,"column":9}},{"start":{"line":114,"column":8},"end":{"line":118,"column":9}}],"line":114},"8":{"loc":{"start":{"line":114,"column":12},"end":{"line":114,"column":96}},"type":"binary-expr","locations":[{"start":{"line":114,"column":12},"end":{"line":114,"column":32}},{"start":{"line":114,"column":37},"end":{"line":114,"column":46}},{"start":{"line":114,"column":50},"end":{"line":114,"column":62}},{"start":{"line":114,"column":66},"end":{"line":114,"column":95}}],"line":114},"9":{"loc":{"start":{"line":122,"column":8},"end":{"line":122,"column":54}},"type":"if","locations":[{"start":{"line":122,"column":8},"end":{"line":122,"column":54}},{"start":{"line":122,"column":8},"end":{"line":122,"column":54}}],"line":122},"10":{"loc":{"start":{"line":135,"column":8},"end":{"line":135,"column":47}},"type":"if","locations":[{"start":{"line":135,"column":8},"end":{"line":135,"column":47}},{"start":{"line":135,"column":8},"end":{"line":135,"column":47}}],"line":135},"11":{"loc":{"start":{"line":139,"column":8},"end":{"line":141,"column":9}},"type":"if","locations":[{"start":{"line":139,"column":8},"end":{"line":141,"column":9}},{"start":{"line":139,"column":8},"end":{"line":141,"column":9}}],"line":139},"12":{"loc":{"start":{"line":146,"column":8},"end":{"line":148,"column":9}},"type":"if","locations":[{"start":{"line":146,"column":8},"end":{"line":148,"column":9}},{"start":{"line":146,"column":8},"end":{"line":148,"column":9}}],"line":146},"13":{"loc":{"start":{"line":146,"column":12},"end":{"line":146,"column":48}},"type":"binary-expr","locations":[{"start":{"line":146,"column":12},"end":{"line":146,"column":28}},{"start":{"line":146,"column":32},"end":{"line":146,"column":48}}],"line":146},"14":{"loc":{"start":{"line":151,"column":23},"end":{"line":151,"column":28}},"type":"default-arg","locations":[{"start":{"line":151,"column":27},"end":{"line":151,"column":28}}],"line":151},"15":{"loc":{"start":{"line":151,"column":30},"end":{"line":151,"column":35}},"type":"default-arg","locations":[{"start":{"line":151,"column":34},"end":{"line":151,"column":35}}],"line":151},"16":{"loc":{"start":{"line":157,"column":8},"end":{"line":157,"column":42}},"type":"if","locations":[{"start":{"line":157,"column":8},"end":{"line":157,"column":42}},{"start":{"line":157,"column":8},"end":{"line":157,"column":42}}],"line":157},"17":{"loc":{"start":{"line":162,"column":8},"end":{"line":164,"column":9}},"type":"if","locations":[{"start":{"line":162,"column":8},"end":{"line":164,"column":9}},{"start":{"line":162,"column":8},"end":{"line":164,"column":9}}],"line":162},"18":{"loc":{"start":{"line":166,"column":8},"end":{"line":168,"column":9}},"type":"if","locations":[{"start":{"line":166,"column":8},"end":{"line":168,"column":9}},{"start":{"line":166,"column":8},"end":{"line":168,"column":9}}],"line":166},"19":{"loc":{"start":{"line":170,"column":8},"end":{"line":172,"column":9}},"type":"if","locations":[{"start":{"line":170,"column":8},"end":{"line":172,"column":9}},{"start":{"line":170,"column":8},"end":{"line":172,"column":9}}],"line":170},"20":{"loc":{"start":{"line":171,"column":29},"end":{"line":171,"column":92}},"type":"cond-expr","locations":[{"start":{"line":171,"column":57},"end":{"line":171,"column":88}},{"start":{"line":171,"column":91},"end":{"line":171,"column":92}}],"line":171},"21":{"loc":{"start":{"line":174,"column":8},"end":{"line":176,"column":9}},"type":"if","locations":[{"start":{"line":174,"column":8},"end":{"line":176,"column":9}},{"start":{"line":174,"column":8},"end":{"line":176,"column":9}}],"line":174},"22":{"loc":{"start":{"line":175,"column":30},"end":{"line":175,"column":89}},"type":"cond-expr","locations":[{"start":{"line":175,"column":56},"end":{"line":175,"column":85}},{"start":{"line":175,"column":88},"end":{"line":175,"column":89}}],"line":175}},"s":{"0":1,"1":0,"2":5,"3":7,"4":7,"5":0,"6":7,"7":11,"8":6,"9":6,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":5,"20":0,"21":5,"22":5,"23":7,"24":7,"25":7,"26":6,"27":6,"28":6,"29":6,"30":6,"31":6,"32":12,"33":12,"34":12,"35":12,"36":12,"37":12,"38":8,"39":2,"40":6,"41":6,"42":6,"43":6,"44":6,"45":5,"46":5,"47":5,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":0,"55":0,"56":0,"57":2,"58":2,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":14,"74":18,"75":18,"76":18,"77":18,"78":18},"f":{"0":7,"1":0,"2":7,"3":11,"4":0,"5":0,"6":7,"7":6,"8":12,"9":8,"10":6,"11":1,"12":1,"13":0,"14":2,"15":0,"16":14,"17":18},"b":{"0":[6,5],"1":[6,0],"2":[0,0],"3":[0,5],"4":[7,0],"5":[2,6],"6":[8,7],"7":[5,1],"8":[6,5,5,0],"9":[1,0],"10":[1,0],"11":[0,0],"12":[2,0],"13":[2,1],"14":[0],"15":[0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"ac7b2cdf2c7334998c6cbb03cf0c3b2343ae357a"} -,"/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/MenuItem.js": {"path":"/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/MenuItem.js","statementMap":{"0":{"start":{"line":29,"column":20},"end":{"line":29,"column":32}},"1":{"start":{"line":32,"column":27},"end":{"line":32,"column":31}},"2":{"start":{"line":33,"column":28},"end":{"line":33,"column":32}},"3":{"start":{"line":37,"column":8},"end":{"line":37,"column":31}},"4":{"start":{"line":39,"column":8},"end":{"line":39,"column":62}},"5":{"start":{"line":39,"column":55},"end":{"line":39,"column":62}},"6":{"start":{"line":41,"column":8},"end":{"line":46,"column":10}},"7":{"start":{"line":48,"column":8},"end":{"line":48,"column":44}},"8":{"start":{"line":48,"column":37},"end":{"line":48,"column":44}},"9":{"start":{"line":50,"column":8},"end":{"line":50,"column":19}},"10":{"start":{"line":54,"column":70},"end":{"line":54,"column":80}},"11":{"start":{"line":55,"column":35},"end":{"line":59,"column":10}},"12":{"start":{"line":61,"column":8},"end":{"line":71,"column":10}},"13":{"start":{"line":66,"column":32},"end":{"line":66,"column":47}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":32,"column":21},"end":{"line":32,"column":22}},"loc":{"start":{"line":32,"column":27},"end":{"line":32,"column":31}},"line":32},"1":{"name":"(anonymous_1)","decl":{"start":{"line":33,"column":22},"end":{"line":33,"column":23}},"loc":{"start":{"line":33,"column":28},"end":{"line":33,"column":32}},"line":33},"2":{"name":"(anonymous_2)","decl":{"start":{"line":36,"column":18},"end":{"line":36,"column":19}},"loc":{"start":{"line":36,"column":29},"end":{"line":51,"column":5}},"line":36},"3":{"name":"(anonymous_3)","decl":{"start":{"line":53,"column":4},"end":{"line":53,"column":5}},"loc":{"start":{"line":53,"column":13},"end":{"line":72,"column":5}},"line":53},"4":{"name":"(anonymous_4)","decl":{"start":{"line":66,"column":21},"end":{"line":66,"column":22}},"loc":{"start":{"line":66,"column":30},"end":{"line":66,"column":49}},"line":66}},"branchMap":{"0":{"loc":{"start":{"line":39,"column":8},"end":{"line":39,"column":62}},"type":"if","locations":[{"start":{"line":39,"column":8},"end":{"line":39,"column":62}},{"start":{"line":39,"column":8},"end":{"line":39,"column":62}}],"line":39},"1":{"loc":{"start":{"line":39,"column":12},"end":{"line":39,"column":53}},"type":"binary-expr","locations":[{"start":{"line":39,"column":12},"end":{"line":39,"column":31}},{"start":{"line":39,"column":35},"end":{"line":39,"column":53}}],"line":39},"2":{"loc":{"start":{"line":48,"column":8},"end":{"line":48,"column":44}},"type":"if","locations":[{"start":{"line":48,"column":8},"end":{"line":48,"column":44}},{"start":{"line":48,"column":8},"end":{"line":48,"column":44}}],"line":48},"3":{"loc":{"start":{"line":64,"column":61},"end":{"line":64,"column":88}},"type":"cond-expr","locations":[{"start":{"line":64,"column":72},"end":{"line":64,"column":78}},{"start":{"line":64,"column":81},"end":{"line":64,"column":88}}],"line":64},"4":{"loc":{"start":{"line":65,"column":34},"end":{"line":65,"column":63}},"type":"cond-expr","locations":[{"start":{"line":65,"column":44},"end":{"line":65,"column":56}},{"start":{"line":65,"column":59},"end":{"line":65,"column":63}}],"line":65},"5":{"loc":{"start":{"line":69,"column":17},"end":{"line":69,"column":42}},"type":"cond-expr","locations":[{"start":{"line":69,"column":27},"end":{"line":69,"column":31}},{"start":{"line":69,"column":34},"end":{"line":69,"column":42}}],"line":69}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"7b9dd5d50de3ceb6a134b2e54dfce9147e2581bb"} -,"/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/SubMenu.js": {"path":"/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/SubMenu.js","statementMap":{"0":{"start":{"line":34,"column":27},"end":{"line":34,"column":31}},"1":{"start":{"line":35,"column":26},"end":{"line":35,"column":30}},"2":{"start":{"line":37,"column":26},"end":{"line":37,"column":30}},"3":{"start":{"line":38,"column":42},"end":{"line":38,"column":46}},"4":{"start":{"line":42,"column":8},"end":{"line":42,"column":21}},"5":{"start":{"line":44,"column":8},"end":{"line":46,"column":11}},"6":{"start":{"line":50,"column":8},"end":{"line":50,"column":67}},"7":{"start":{"line":54,"column":8},"end":{"line":54,"column":23}},"8":{"start":{"line":58,"column":8},"end":{"line":61,"column":79}},"9":{"start":{"line":62,"column":8},"end":{"line":62,"column":20}},"10":{"start":{"line":66,"column":8},"end":{"line":66,"column":45}},"11":{"start":{"line":66,"column":38},"end":{"line":66,"column":45}},"12":{"start":{"line":67,"column":8},"end":{"line":99,"column":9}},"13":{"start":{"line":68,"column":28},"end":{"line":68,"column":70}},"14":{"start":{"line":69,"column":12},"end":{"line":87,"column":15}},"15":{"start":{"line":70,"column":31},"end":{"line":72,"column":56}},"16":{"start":{"line":74,"column":16},"end":{"line":74,"column":57}},"17":{"start":{"line":75,"column":16},"end":{"line":75,"column":60}},"18":{"start":{"line":76,"column":16},"end":{"line":76,"column":58}},"19":{"start":{"line":77,"column":16},"end":{"line":77,"column":59}},"20":{"start":{"line":79,"column":16},"end":{"line":79,"column":83}},"21":{"start":{"line":79,"column":47},"end":{"line":79,"column":83}},"22":{"start":{"line":80,"column":16},"end":{"line":80,"column":86}},"23":{"start":{"line":80,"column":48},"end":{"line":80,"column":86}},"24":{"start":{"line":81,"column":16},"end":{"line":81,"column":92}},"25":{"start":{"line":81,"column":50},"end":{"line":81,"column":92}},"26":{"start":{"line":82,"column":16},"end":{"line":82,"column":89}},"27":{"start":{"line":82,"column":49},"end":{"line":82,"column":89}},"28":{"start":{"line":83,"column":16},"end":{"line":83,"column":67}},"29":{"start":{"line":85,"column":16},"end":{"line":85,"column":40}},"30":{"start":{"line":86,"column":16},"end":{"line":86,"column":54}},"31":{"start":{"line":89,"column":28},"end":{"line":96,"column":13}},"32":{"start":{"line":90,"column":16},"end":{"line":90,"column":75}},"33":{"start":{"line":91,"column":16},"end":{"line":91,"column":60}},"34":{"start":{"line":92,"column":16},"end":{"line":92,"column":59}},"35":{"start":{"line":93,"column":16},"end":{"line":93,"column":43}},"36":{"start":{"line":94,"column":16},"end":{"line":94,"column":49}},"37":{"start":{"line":95,"column":16},"end":{"line":95,"column":42}},"38":{"start":{"line":97,"column":12},"end":{"line":97,"column":68}},"39":{"start":{"line":98,"column":12},"end":{"line":98,"column":66}},"40":{"start":{"line":103,"column":8},"end":{"line":105,"column":9}},"41":{"start":{"line":104,"column":12},"end":{"line":104,"column":47}},"42":{"start":{"line":107,"column":8},"end":{"line":107,"column":57}},"43":{"start":{"line":107,"column":28},"end":{"line":107,"column":57}},"44":{"start":{"line":109,"column":8},"end":{"line":109,"column":59}},"45":{"start":{"line":109,"column":29},"end":{"line":109,"column":59}},"46":{"start":{"line":111,"column":8},"end":{"line":111,"column":38}},"47":{"start":{"line":115,"column":44},"end":{"line":115,"column":50}},"48":{"start":{"line":116,"column":21},"end":{"line":116,"column":57}},"49":{"start":{"line":117,"column":25},"end":{"line":117,"column":27}},"50":{"start":{"line":119,"column":8},"end":{"line":123,"column":9}},"51":{"start":{"line":120,"column":12},"end":{"line":120,"column":32}},"52":{"start":{"line":122,"column":12},"end":{"line":122,"column":29}},"53":{"start":{"line":125,"column":8},"end":{"line":129,"column":9}},"54":{"start":{"line":126,"column":12},"end":{"line":126,"column":35}},"55":{"start":{"line":128,"column":12},"end":{"line":128,"column":36}},"56":{"start":{"line":131,"column":8},"end":{"line":131,"column":24}},"57":{"start":{"line":135,"column":32},"end":{"line":135,"column":38}},"58":{"start":{"line":136,"column":21},"end":{"line":136,"column":57}},"59":{"start":{"line":137,"column":25},"end":{"line":137,"column":27}},"60":{"start":{"line":139,"column":8},"end":{"line":143,"column":9}},"61":{"start":{"line":140,"column":12},"end":{"line":140,"column":32}},"62":{"start":{"line":142,"column":12},"end":{"line":142,"column":29}},"63":{"start":{"line":145,"column":8},"end":{"line":149,"column":9}},"64":{"start":{"line":146,"column":12},"end":{"line":146,"column":35}},"65":{"start":{"line":148,"column":12},"end":{"line":148,"column":36}},"66":{"start":{"line":151,"column":8},"end":{"line":151,"column":24}},"67":{"start":{"line":156,"column":8},"end":{"line":158,"column":9}},"68":{"start":{"line":157,"column":12},"end":{"line":157,"column":19}},"69":{"start":{"line":160,"column":8},"end":{"line":162,"column":9}},"70":{"start":{"line":161,"column":12},"end":{"line":161,"column":36}},"71":{"start":{"line":163,"column":8},"end":{"line":163,"column":62}},"72":{"start":{"line":164,"column":8},"end":{"line":164,"column":34}},"73":{"start":{"line":168,"column":8},"end":{"line":168,"column":31}},"74":{"start":{"line":170,"column":8},"end":{"line":170,"column":40}},"75":{"start":{"line":170,"column":33},"end":{"line":170,"column":40}},"76":{"start":{"line":172,"column":8},"end":{"line":177,"column":10}},"77":{"start":{"line":181,"column":8},"end":{"line":181,"column":59}},"78":{"start":{"line":181,"column":29},"end":{"line":181,"column":59}},"79":{"start":{"line":183,"column":8},"end":{"line":183,"column":62}},"80":{"start":{"line":183,"column":55},"end":{"line":183,"column":62}},"81":{"start":{"line":185,"column":8},"end":{"line":188,"column":35}},"82":{"start":{"line":185,"column":42},"end":{"line":188,"column":10}},"83":{"start":{"line":192,"column":8},"end":{"line":192,"column":57}},"84":{"start":{"line":192,"column":28},"end":{"line":192,"column":57}},"85":{"start":{"line":194,"column":8},"end":{"line":194,"column":40}},"86":{"start":{"line":194,"column":33},"end":{"line":194,"column":40}},"87":{"start":{"line":196,"column":8},"end":{"line":199,"column":35}},"88":{"start":{"line":196,"column":43},"end":{"line":199,"column":10}},"89":{"start":{"line":203,"column":8},"end":{"line":203,"column":22}},"90":{"start":{"line":207,"column":8},"end":{"line":207,"column":25}},"91":{"start":{"line":211,"column":8},"end":{"line":211,"column":87}},"92":{"start":{"line":212,"column":8},"end":{"line":212,"column":71}},"93":{"start":{"line":216,"column":8},"end":{"line":216,"column":74}},"94":{"start":{"line":217,"column":8},"end":{"line":219,"column":9}},"95":{"start":{"line":218,"column":12},"end":{"line":218,"column":88}},"96":{"start":{"line":223,"column":68},"end":{"line":223,"column":78}},"97":{"start":{"line":224,"column":28},"end":{"line":224,"column":38}},"98":{"start":{"line":225,"column":26},"end":{"line":233,"column":9}},"99":{"start":{"line":234,"column":30},"end":{"line":243,"column":9}},"100":{"start":{"line":244,"column":29},"end":{"line":253,"column":9}},"101":{"start":{"line":255,"column":8},"end":{"line":264,"column":10}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":34,"column":21},"end":{"line":34,"column":22}},"loc":{"start":{"line":34,"column":27},"end":{"line":34,"column":31}},"line":34},"1":{"name":"(anonymous_1)","decl":{"start":{"line":35,"column":20},"end":{"line":35,"column":21}},"loc":{"start":{"line":35,"column":26},"end":{"line":35,"column":30}},"line":35},"2":{"name":"(anonymous_2)","decl":{"start":{"line":37,"column":20},"end":{"line":37,"column":21}},"loc":{"start":{"line":37,"column":26},"end":{"line":37,"column":30}},"line":37},"3":{"name":"(anonymous_3)","decl":{"start":{"line":38,"column":36},"end":{"line":38,"column":37}},"loc":{"start":{"line":38,"column":42},"end":{"line":38,"column":46}},"line":38},"4":{"name":"(anonymous_4)","decl":{"start":{"line":41,"column":4},"end":{"line":41,"column":5}},"loc":{"start":{"line":41,"column":23},"end":{"line":47,"column":5}},"line":41},"5":{"name":"(anonymous_5)","decl":{"start":{"line":49,"column":4},"end":{"line":49,"column":5}},"loc":{"start":{"line":49,"column":24},"end":{"line":51,"column":5}},"line":49},"6":{"name":"(anonymous_6)","decl":{"start":{"line":50,"column":42},"end":{"line":50,"column":43}},"loc":{"start":{"line":50,"column":48},"end":{"line":50,"column":50}},"line":50},"7":{"name":"(anonymous_7)","decl":{"start":{"line":53,"column":4},"end":{"line":53,"column":5}},"loc":{"start":{"line":53,"column":21},"end":{"line":55,"column":5}},"line":53},"8":{"name":"(anonymous_8)","decl":{"start":{"line":57,"column":4},"end":{"line":57,"column":5}},"loc":{"start":{"line":57,"column":48},"end":{"line":63,"column":5}},"line":57},"9":{"name":"(anonymous_9)","decl":{"start":{"line":65,"column":4},"end":{"line":65,"column":5}},"loc":{"start":{"line":65,"column":25},"end":{"line":100,"column":5}},"line":65},"10":{"name":"(anonymous_10)","decl":{"start":{"line":69,"column":20},"end":{"line":69,"column":21}},"loc":{"start":{"line":69,"column":26},"end":{"line":87,"column":13}},"line":69},"11":{"name":"(anonymous_11)","decl":{"start":{"line":89,"column":28},"end":{"line":89,"column":29}},"loc":{"start":{"line":89,"column":34},"end":{"line":96,"column":13}},"line":89},"12":{"name":"(anonymous_12)","decl":{"start":{"line":102,"column":4},"end":{"line":102,"column":5}},"loc":{"start":{"line":102,"column":27},"end":{"line":112,"column":5}},"line":102},"13":{"name":"(anonymous_13)","decl":{"start":{"line":114,"column":22},"end":{"line":114,"column":23}},"loc":{"start":{"line":114,"column":28},"end":{"line":132,"column":5}},"line":114},"14":{"name":"(anonymous_14)","decl":{"start":{"line":134,"column":25},"end":{"line":134,"column":26}},"loc":{"start":{"line":134,"column":31},"end":{"line":152,"column":5}},"line":134},"15":{"name":"(anonymous_15)","decl":{"start":{"line":154,"column":15},"end":{"line":154,"column":16}},"loc":{"start":{"line":154,"column":22},"end":{"line":165,"column":5}},"line":154},"16":{"name":"(anonymous_16)","decl":{"start":{"line":167,"column":18},"end":{"line":167,"column":19}},"loc":{"start":{"line":167,"column":29},"end":{"line":178,"column":5}},"line":167},"17":{"name":"(anonymous_17)","decl":{"start":{"line":180,"column":23},"end":{"line":180,"column":24}},"loc":{"start":{"line":180,"column":29},"end":{"line":189,"column":5}},"line":180},"18":{"name":"(anonymous_18)","decl":{"start":{"line":185,"column":36},"end":{"line":185,"column":37}},"loc":{"start":{"line":185,"column":42},"end":{"line":188,"column":10}},"line":185},"19":{"name":"(anonymous_19)","decl":{"start":{"line":191,"column":23},"end":{"line":191,"column":24}},"loc":{"start":{"line":191,"column":29},"end":{"line":200,"column":5}},"line":191},"20":{"name":"(anonymous_20)","decl":{"start":{"line":196,"column":37},"end":{"line":196,"column":38}},"loc":{"start":{"line":196,"column":43},"end":{"line":199,"column":10}},"line":196},"21":{"name":"(anonymous_21)","decl":{"start":{"line":202,"column":14},"end":{"line":202,"column":15}},"loc":{"start":{"line":202,"column":21},"end":{"line":204,"column":5}},"line":202},"22":{"name":"(anonymous_22)","decl":{"start":{"line":206,"column":17},"end":{"line":206,"column":18}},"loc":{"start":{"line":206,"column":24},"end":{"line":208,"column":5}},"line":206},"23":{"name":"(anonymous_23)","decl":{"start":{"line":210,"column":23},"end":{"line":210,"column":24}},"loc":{"start":{"line":210,"column":29},"end":{"line":213,"column":5}},"line":210},"24":{"name":"(anonymous_24)","decl":{"start":{"line":215,"column":25},"end":{"line":215,"column":26}},"loc":{"start":{"line":215,"column":42},"end":{"line":220,"column":5}},"line":215},"25":{"name":"(anonymous_25)","decl":{"start":{"line":222,"column":4},"end":{"line":222,"column":5}},"loc":{"start":{"line":222,"column":13},"end":{"line":265,"column":5}},"line":222}},"branchMap":{"0":{"loc":{"start":{"line":58,"column":34},"end":{"line":61,"column":78}},"type":"binary-expr","locations":[{"start":{"line":58,"column":35},"end":{"line":58,"column":75}},{"start":{"line":59,"column":34},"end":{"line":59,"column":78}},{"start":{"line":60,"column":34},"end":{"line":60,"column":78}},{"start":{"line":61,"column":34},"end":{"line":61,"column":78}}],"line":58},"1":{"loc":{"start":{"line":60,"column":36},"end":{"line":60,"column":77}},"type":"binary-expr","locations":[{"start":{"line":60,"column":36},"end":{"line":60,"column":54}},{"start":{"line":60,"column":58},"end":{"line":60,"column":77}}],"line":60},"2":{"loc":{"start":{"line":61,"column":36},"end":{"line":61,"column":77}},"type":"binary-expr","locations":[{"start":{"line":61,"column":36},"end":{"line":61,"column":56}},{"start":{"line":61,"column":60},"end":{"line":61,"column":77}}],"line":61},"3":{"loc":{"start":{"line":66,"column":8},"end":{"line":66,"column":45}},"type":"if","locations":[{"start":{"line":66,"column":8},"end":{"line":66,"column":45}},{"start":{"line":66,"column":8},"end":{"line":66,"column":45}}],"line":66},"4":{"loc":{"start":{"line":67,"column":8},"end":{"line":99,"column":9}},"type":"if","locations":[{"start":{"line":67,"column":8},"end":{"line":99,"column":9}},{"start":{"line":67,"column":8},"end":{"line":99,"column":9}}],"line":67},"5":{"loc":{"start":{"line":67,"column":12},"end":{"line":67,"column":54}},"type":"binary-expr","locations":[{"start":{"line":67,"column":12},"end":{"line":67,"column":32}},{"start":{"line":67,"column":36},"end":{"line":67,"column":54}}],"line":67},"6":{"loc":{"start":{"line":68,"column":28},"end":{"line":68,"column":70}},"type":"binary-expr","locations":[{"start":{"line":68,"column":28},"end":{"line":68,"column":56}},{"start":{"line":68,"column":60},"end":{"line":68,"column":70}}],"line":68},"7":{"loc":{"start":{"line":70,"column":31},"end":{"line":72,"column":56}},"type":"cond-expr","locations":[{"start":{"line":71,"column":34},"end":{"line":71,"column":59}},{"start":{"line":72,"column":34},"end":{"line":72,"column":56}}],"line":70},"8":{"loc":{"start":{"line":79,"column":16},"end":{"line":79,"column":83}},"type":"if","locations":[{"start":{"line":79,"column":16},"end":{"line":79,"column":83}},{"start":{"line":79,"column":16},"end":{"line":79,"column":83}}],"line":79},"9":{"loc":{"start":{"line":80,"column":16},"end":{"line":80,"column":86}},"type":"if","locations":[{"start":{"line":80,"column":16},"end":{"line":80,"column":86}},{"start":{"line":80,"column":16},"end":{"line":80,"column":86}}],"line":80},"10":{"loc":{"start":{"line":81,"column":16},"end":{"line":81,"column":92}},"type":"if","locations":[{"start":{"line":81,"column":16},"end":{"line":81,"column":92}},{"start":{"line":81,"column":16},"end":{"line":81,"column":92}}],"line":81},"11":{"loc":{"start":{"line":82,"column":16},"end":{"line":82,"column":89}},"type":"if","locations":[{"start":{"line":82,"column":16},"end":{"line":82,"column":89}},{"start":{"line":82,"column":16},"end":{"line":82,"column":89}}],"line":82},"12":{"loc":{"start":{"line":103,"column":8},"end":{"line":105,"column":9}},"type":"if","locations":[{"start":{"line":103,"column":8},"end":{"line":105,"column":9}},{"start":{"line":103,"column":8},"end":{"line":105,"column":9}}],"line":103},"13":{"loc":{"start":{"line":107,"column":8},"end":{"line":107,"column":57}},"type":"if","locations":[{"start":{"line":107,"column":8},"end":{"line":107,"column":57}},{"start":{"line":107,"column":8},"end":{"line":107,"column":57}}],"line":107},"14":{"loc":{"start":{"line":109,"column":8},"end":{"line":109,"column":59}},"type":"if","locations":[{"start":{"line":109,"column":8},"end":{"line":109,"column":59}},{"start":{"line":109,"column":8},"end":{"line":109,"column":59}}],"line":109},"15":{"loc":{"start":{"line":119,"column":8},"end":{"line":123,"column":9}},"type":"if","locations":[{"start":{"line":119,"column":8},"end":{"line":123,"column":9}},{"start":{"line":119,"column":8},"end":{"line":123,"column":9}}],"line":119},"16":{"loc":{"start":{"line":125,"column":8},"end":{"line":129,"column":9}},"type":"if","locations":[{"start":{"line":125,"column":8},"end":{"line":129,"column":9}},{"start":{"line":125,"column":8},"end":{"line":129,"column":9}}],"line":125},"17":{"loc":{"start":{"line":139,"column":8},"end":{"line":143,"column":9}},"type":"if","locations":[{"start":{"line":139,"column":8},"end":{"line":143,"column":9}},{"start":{"line":139,"column":8},"end":{"line":143,"column":9}}],"line":139},"18":{"loc":{"start":{"line":145,"column":8},"end":{"line":149,"column":9}},"type":"if","locations":[{"start":{"line":145,"column":8},"end":{"line":149,"column":9}},{"start":{"line":145,"column":8},"end":{"line":149,"column":9}}],"line":145},"19":{"loc":{"start":{"line":156,"column":8},"end":{"line":158,"column":9}},"type":"if","locations":[{"start":{"line":156,"column":8},"end":{"line":158,"column":9}},{"start":{"line":156,"column":8},"end":{"line":158,"column":9}}],"line":156},"20":{"loc":{"start":{"line":156,"column":12},"end":{"line":156,"column":80}},"type":"binary-expr","locations":[{"start":{"line":156,"column":12},"end":{"line":156,"column":20}},{"start":{"line":156,"column":24},"end":{"line":156,"column":35}},{"start":{"line":156,"column":39},"end":{"line":156,"column":48}},{"start":{"line":156,"column":52},"end":{"line":156,"column":80}}],"line":156},"21":{"loc":{"start":{"line":160,"column":8},"end":{"line":162,"column":9}},"type":"if","locations":[{"start":{"line":160,"column":8},"end":{"line":162,"column":9}},{"start":{"line":160,"column":8},"end":{"line":162,"column":9}}],"line":160},"22":{"loc":{"start":{"line":170,"column":8},"end":{"line":170,"column":40}},"type":"if","locations":[{"start":{"line":170,"column":8},"end":{"line":170,"column":40}},{"start":{"line":170,"column":8},"end":{"line":170,"column":40}}],"line":170},"23":{"loc":{"start":{"line":181,"column":8},"end":{"line":181,"column":59}},"type":"if","locations":[{"start":{"line":181,"column":8},"end":{"line":181,"column":59}},{"start":{"line":181,"column":8},"end":{"line":181,"column":59}}],"line":181},"24":{"loc":{"start":{"line":183,"column":8},"end":{"line":183,"column":62}},"type":"if","locations":[{"start":{"line":183,"column":8},"end":{"line":183,"column":62}},{"start":{"line":183,"column":8},"end":{"line":183,"column":62}}],"line":183},"25":{"loc":{"start":{"line":183,"column":12},"end":{"line":183,"column":53}},"type":"binary-expr","locations":[{"start":{"line":183,"column":12},"end":{"line":183,"column":31}},{"start":{"line":183,"column":35},"end":{"line":183,"column":53}}],"line":183},"26":{"loc":{"start":{"line":192,"column":8},"end":{"line":192,"column":57}},"type":"if","locations":[{"start":{"line":192,"column":8},"end":{"line":192,"column":57}},{"start":{"line":192,"column":8},"end":{"line":192,"column":57}}],"line":192},"27":{"loc":{"start":{"line":194,"column":8},"end":{"line":194,"column":40}},"type":"if","locations":[{"start":{"line":194,"column":8},"end":{"line":194,"column":40}},{"start":{"line":194,"column":8},"end":{"line":194,"column":40}}],"line":194},"28":{"loc":{"start":{"line":217,"column":8},"end":{"line":219,"column":9}},"type":"if","locations":[{"start":{"line":217,"column":8},"end":{"line":219,"column":9}},{"start":{"line":217,"column":8},"end":{"line":219,"column":9}}],"line":217}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0},"b":{"0":[0,0,0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0,0,0],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0,0]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"8cf4718ada055173fcde2aeb41e19b99fdae18e4"} -,"/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/actions.js": {"path":"/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/actions.js","statementMap":{"0":{"start":{"line":5,"column":25},"end":{"line":5,"column":49}},"1":{"start":{"line":6,"column":25},"end":{"line":6,"column":49}},"2":{"start":{"line":14,"column":4},"end":{"line":19,"column":5}},"3":{"start":{"line":15,"column":8},"end":{"line":15,"column":68}},"4":{"start":{"line":17,"column":8},"end":{"line":17,"column":52}},"5":{"start":{"line":18,"column":8},"end":{"line":18,"column":60}},"6":{"start":{"line":21,"column":4},"end":{"line":24,"column":5}},"7":{"start":{"line":22,"column":8},"end":{"line":22,"column":36}},"8":{"start":{"line":23,"column":8},"end":{"line":23,"column":28}},"9":{"start":{"line":28,"column":4},"end":{"line":28,"column":82}},"10":{"start":{"line":32,"column":4},"end":{"line":32,"column":82}}},"fnMap":{"0":{"name":"dispatchGlobalEvent","decl":{"start":{"line":9,"column":16},"end":{"line":9,"column":35}},"loc":{"start":{"line":9,"column":70},"end":{"line":25,"column":1}},"line":9},"1":{"name":"showMenu","decl":{"start":{"line":27,"column":16},"end":{"line":27,"column":24}},"loc":{"start":{"line":27,"column":44},"end":{"line":29,"column":1}},"line":27},"2":{"name":"hideMenu","decl":{"start":{"line":31,"column":16},"end":{"line":31,"column":24}},"loc":{"start":{"line":31,"column":44},"end":{"line":33,"column":1}},"line":31}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":53},"end":{"line":9,"column":68}},"type":"default-arg","locations":[{"start":{"line":9,"column":62},"end":{"line":9,"column":68}}],"line":9},"1":{"loc":{"start":{"line":14,"column":4},"end":{"line":19,"column":5}},"type":"if","locations":[{"start":{"line":14,"column":4},"end":{"line":19,"column":5}},{"start":{"line":14,"column":4},"end":{"line":19,"column":5}}],"line":14},"2":{"loc":{"start":{"line":21,"column":4},"end":{"line":24,"column":5}},"type":"if","locations":[{"start":{"line":21,"column":4},"end":{"line":24,"column":5}},{"start":{"line":21,"column":4},"end":{"line":24,"column":5}}],"line":21},"3":{"loc":{"start":{"line":27,"column":25},"end":{"line":27,"column":34}},"type":"default-arg","locations":[{"start":{"line":27,"column":32},"end":{"line":27,"column":34}}],"line":27},"4":{"loc":{"start":{"line":31,"column":25},"end":{"line":31,"column":34}},"type":"default-arg","locations":[{"start":{"line":31,"column":32},"end":{"line":31,"column":34}}],"line":31}},"s":{"0":2,"1":2,"2":16,"3":16,"4":0,"5":0,"6":16,"7":16,"8":16,"9":9,"10":7},"f":{"0":16,"1":9,"2":7},"b":{"0":[16],"1":[16,0],"2":[16,0],"3":[1],"4":[7]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"a0e9cf61adbb07a7ceaaf34ab1b678f5693254fd"} -,"/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/globalEventListener.js": {"path":"/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/globalEventListener.js","statementMap":{"0":{"start":{"line":6,"column":8},"end":{"line":6,"column":28}},"1":{"start":{"line":8,"column":8},"end":{"line":11,"column":9}},"2":{"start":{"line":9,"column":12},"end":{"line":9,"column":69}},"3":{"start":{"line":10,"column":12},"end":{"line":10,"column":69}},"4":{"start":{"line":15,"column":8},"end":{"line":17,"column":9}},"5":{"start":{"line":16,"column":12},"end":{"line":16,"column":79}},"6":{"start":{"line":16,"column":48},"end":{"line":16,"column":79}},"7":{"start":{"line":21,"column":8},"end":{"line":23,"column":9}},"8":{"start":{"line":22,"column":12},"end":{"line":22,"column":79}},"9":{"start":{"line":22,"column":48},"end":{"line":22,"column":79}},"10":{"start":{"line":27,"column":19},"end":{"line":27,"column":29}},"11":{"start":{"line":29,"column":8},"end":{"line":32,"column":10}},"12":{"start":{"line":34,"column":8},"end":{"line":34,"column":18}},"13":{"start":{"line":38,"column":8},"end":{"line":40,"column":9}},"14":{"start":{"line":39,"column":12},"end":{"line":39,"column":38}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":18},"end":{"line":12,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":14,"column":22},"end":{"line":14,"column":23}},"loc":{"start":{"line":14,"column":33},"end":{"line":18,"column":5}},"line":14},"2":{"name":"(anonymous_2)","decl":{"start":{"line":20,"column":22},"end":{"line":20,"column":23}},"loc":{"start":{"line":20,"column":33},"end":{"line":24,"column":5}},"line":20},"3":{"name":"(anonymous_3)","decl":{"start":{"line":26,"column":15},"end":{"line":26,"column":16}},"loc":{"start":{"line":26,"column":47},"end":{"line":35,"column":5}},"line":26},"4":{"name":"(anonymous_4)","decl":{"start":{"line":37,"column":17},"end":{"line":37,"column":18}},"loc":{"start":{"line":37,"column":25},"end":{"line":41,"column":5}},"line":37}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":8},"end":{"line":11,"column":9}},"type":"if","locations":[{"start":{"line":8,"column":8},"end":{"line":11,"column":9}},{"start":{"line":8,"column":8},"end":{"line":11,"column":9}}],"line":8},"1":{"loc":{"start":{"line":16,"column":12},"end":{"line":16,"column":79}},"type":"if","locations":[{"start":{"line":16,"column":12},"end":{"line":16,"column":79}},{"start":{"line":16,"column":12},"end":{"line":16,"column":79}}],"line":16},"2":{"loc":{"start":{"line":22,"column":12},"end":{"line":22,"column":79}},"type":"if","locations":[{"start":{"line":22,"column":12},"end":{"line":22,"column":79}},{"start":{"line":22,"column":12},"end":{"line":22,"column":79}}],"line":22},"3":{"loc":{"start":{"line":38,"column":8},"end":{"line":40,"column":9}},"type":"if","locations":[{"start":{"line":38,"column":8},"end":{"line":40,"column":9}},{"start":{"line":38,"column":8},"end":{"line":40,"column":9}}],"line":38},"4":{"loc":{"start":{"line":38,"column":12},"end":{"line":38,"column":36}},"type":"binary-expr","locations":[{"start":{"line":38,"column":12},"end":{"line":38,"column":14}},{"start":{"line":38,"column":18},"end":{"line":38,"column":36}}],"line":38}},"s":{"0":1,"1":1,"2":1,"3":1,"4":8,"5":8,"6":8,"7":6,"8":6,"9":6,"10":7,"11":7,"12":7,"13":7,"14":7},"f":{"0":1,"1":8,"2":6,"3":7,"4":7},"b":{"0":[1,0],"1":[8,0],"2":[6,0],"3":[7,0],"4":[7,7]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"8591ea7ef166f4b12be01f40b6527972bae5f857"} -,"/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/helpers.js": {"path":"/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/helpers.js","statementMap":{"0":{"start":{"line":2,"column":4},"end":{"line":2,"column":57}},"1":{"start":{"line":6,"column":4},"end":{"line":6,"column":59}},"2":{"start":{"line":10,"column":4},"end":{"line":10,"column":51}},"3":{"start":{"line":13,"column":26},"end":{"line":23,"column":1}},"4":{"start":{"line":25,"column":21},"end":{"line":25,"column":23}},"5":{"start":{"line":27,"column":25},"end":{"line":29,"column":1}}},"fnMap":{"0":{"name":"callIfExists","decl":{"start":{"line":1,"column":16},"end":{"line":1,"column":28}},"loc":{"start":{"line":1,"column":44},"end":{"line":3,"column":1}},"line":1},"1":{"name":"hasOwnProp","decl":{"start":{"line":5,"column":16},"end":{"line":5,"column":26}},"loc":{"start":{"line":5,"column":38},"end":{"line":7,"column":1}},"line":5},"2":{"name":"uniqueId","decl":{"start":{"line":9,"column":16},"end":{"line":9,"column":24}},"loc":{"start":{"line":9,"column":27},"end":{"line":11,"column":1}},"line":9}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":11},"end":{"line":2,"column":56}},"type":"binary-expr","locations":[{"start":{"line":2,"column":12},"end":{"line":2,"column":38}},{"start":{"line":2,"column":43},"end":{"line":2,"column":56}}],"line":2},"1":{"loc":{"start":{"line":28,"column":2},"end":{"line":28,"column":83}},"type":"binary-expr","locations":[{"start":{"line":28,"column":2},"end":{"line":28,"column":31}},{"start":{"line":28,"column":35},"end":{"line":28,"column":50}},{"start":{"line":28,"column":54},"end":{"line":28,"column":83}}],"line":28}},"s":{"0":12,"1":14,"2":7,"3":2,"4":2,"5":2},"f":{"0":12,"1":14,"2":7},"b":{"0":[12,12],"1":[2,2,2]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"bf0e7fbfc7bb48f8d8a200b2d351ed8fb2186e36"} -} diff --git a/coverage/lcov-report/AbstractMenu.js.html b/coverage/lcov-report/AbstractMenu.js.html deleted file mode 100644 index 4811de53..00000000 --- a/coverage/lcov-report/AbstractMenu.js.html +++ /dev/null @@ -1,522 +0,0 @@ - - - - Code coverage report for AbstractMenu.js - - - - - - - -
    -
    -

    - All files AbstractMenu.js -

    -
    -
    - 23.88% - Statements - 16/67 -
    -
    - 15.69% - Branches - 8/51 -
    -
    - 33.33% - Functions - 4/12 -
    -
    - 25% - Lines - 16/64 -
    -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152  -  -  -  -  -  -  -  -  -  -  -7x -  -7x -7x -  -  -  -  -  -  -  -  -2x -  -  -  -2x -  -  -1x -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -1x -1x -  -  -1x -  -  -  -1x -  -  -  -  -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -18x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
    import React, { Component } from 'react';
    -import PropTypes from 'prop-types';
    - 
    -import MenuItem from './MenuItem';
    - 
    -export default class AbstractMenu extends Component {
    -    static propTypes = {
    -        children: PropTypes.node.isRequired
    -    };
    - 
    -    constructor(props) {
    -        super(props);
    - 
    -        this.seletedItemRef = null;
    -        this.state = {
    -            selectedItem: null,
    -            forceSubMenuOpen: false
    -        };
    -    }
    - 
    -    handleKeyNavigation = (e) => {
    -        // check for isVisible strictly here as it might be undefined when this code executes in the context of SubMenu
    -        // but we only need to check when it runs in the ContextMenu context
    -        Iif (this.state.isVisible === false) {
    -            return;
    -        }
    - 
    -        switch (e.keyCode) {
    -            case 37: // left arrow
    -            case 27: // escape
    -                e.preventDefault();
    -                this.hideMenu(e);
    -                break;
    -            case 38: // up arrow
    -                e.preventDefault();
    -                this.selectChildren(true);
    -                break;
    -            case 40: // down arrow
    -                e.preventDefault();
    -                this.selectChildren(false);
    -                break;
    -            case 39: // right arrow
    -                this.tryToOpenSubMenu(e);
    -                break;
    -            case 13: // enter
    -                e.preventDefault();
    -                this.tryToOpenSubMenu(e);
    -                {
    -                    // determine the selected item is disabled or not
    -                    const disabled = this.seletedItemRef &&
    -                        this.seletedItemRef.props &&
    -                        this.seletedItemRef.props.disabled;
    - 
    -                    Iif (this.seletedItemRef &&
    -                        this.seletedItemRef.ref instanceof HTMLElement &&
    -                        !disabled) {
    -                        this.seletedItemRef.ref.click();
    -                    } else {
    -                        this.hideMenu(e);
    -                    }
    -                }
    -                break;
    -            default:
    -                // do nothing
    -        }
    -    }
    - 
    -    handleForceClose = () => {
    -        this.setState({ forceSubMenuOpen: false });
    -    }
    - 
    -    tryToOpenSubMenu = (e) => {
    -        Iif (this.state.selectedItem && this.state.selectedItem.type === this.getSubMenuType()) {
    -            e.preventDefault();
    -            this.setState({ forceSubMenuOpen: true });
    -        }
    -    }
    - 
    -    selectChildren = (forward) => {
    -        const { selectedItem } = this.state;
    -        const children = [];
    -        const childCollector = (child) => {
    -            // child can be empty in case you do conditional rendering of components, in which
    -            // case it should not be accounted for as a real child
    -            if (!child) {
    -                return;
    -            }
    - 
    -            if ([MenuItem, this.getSubMenuType()].indexOf(child.type) < 0) {
    -                // Maybe the MenuItem or SubMenu is capsuled in a wrapper div or something else
    -                React.Children.forEach(child.props.children, childCollector);
    -            } else if (!child.props.divider) {
    -                children.push(child);
    -            }
    -        };
    -        React.Children.forEach(this.props.children, childCollector);
    -        const currentIndex = children.indexOf(selectedItem);
    -        if (currentIndex < 0) {
    -            this.setState({
    -                selectedItem: forward ? children[children.length - 1] : children[0],
    -                forceSubMenuOpen: false
    -            });
    -        } else if (forward) {
    -            this.setState({
    -                selectedItem: children[currentIndex - 1 < 0 ? children.length - 1 : currentIndex - 1],
    -                forceSubMenuOpen: false
    -            });
    -        } else {
    -            this.setState({
    -                selectedItem: children[currentIndex + 1 < children.length ? currentIndex + 1 : 0],
    -                forceSubMenuOpen: false
    -            });
    -        }
    -    }
    - 
    -    onChildMouseMove = (child) => {
    -        if (this.state.selectedItem !== child) {
    -            this.setState({ selectedItem: child, forceSubMenuOpen: false });
    -        }
    -    }
    - 
    -    onChildMouseLeave = () => {
    -        this.setState({ selectedItem: null, forceSubMenuOpen: false });
    -    }
    - 
    -    renderChildren = children => React.Children.map(children, (child) => {
    -        const props = {};
    -        if (!React.isValidElement(child)) return child;
    -        if ([MenuItem, this.getSubMenuType()].indexOf(child.type) < 0) {
    -            // Maybe the MenuItem or SubMenu is capsuled in a wrapper div or something else
    -            props.children = this.renderChildren(child.props.children);
    -            return React.cloneElement(child, props);
    -        }
    -        props.onMouseLeave = this.onChildMouseLeave.bind(this);
    -        if (child.type === this.getSubMenuType()) {
    -            // special props for SubMenu only
    -            props.forceOpen = this.state.forceSubMenuOpen && (this.state.selectedItem === child);
    -            props.forceClose = this.handleForceClose;
    -            props.parentKeyNavigationHandler = this.handleKeyNavigation;
    -        }
    -        if (!child.props.divider && this.state.selectedItem === child) {
    -            // special props for selected item only
    -            props.selected = true;
    -            props.ref = (ref) => { this.seletedItemRef = ref; };
    -            return React.cloneElement(child, props);
    -        }
    -        // onMouseMove is only needed for non selected items
    -        props.onMouseMove = () => this.onChildMouseMove(child);
    -        return React.cloneElement(child, props);
    -    });
    -}
    - 
    -
    -
    - - - - - - - - diff --git a/coverage/lcov-report/ContextMenu.js.html b/coverage/lcov-report/ContextMenu.js.html deleted file mode 100644 index e4c6d0ec..00000000 --- a/coverage/lcov-report/ContextMenu.js.html +++ /dev/null @@ -1,684 +0,0 @@ - - - - Code coverage report for ContextMenu.js - - - - - - - -
    -
    -

    - All files ContextMenu.js -

    -
    -
    - 63.29% - Statements - 50/79 -
    -
    - 41.3% - Branches - 19/46 -
    -
    - 72.22% - Functions - 13/18 -
    -
    - 64.38% - Lines - 47/73 -
    -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -5x -  -  -  -  -7x -  -7x -  -  -  -  -  -  -  -  -  -  -  -7x -  -  -  -11x -6x -  -6x -  -  -  -  -  -  -  -  -  -  -  -  -  -5x -5x -5x -  -  -  -  -7x -7x -  -  -7x -  -  -  -6x -6x -6x -6x -6x -6x -  -  -  -12x -12x -12x -12x -12x -12x -  -  -  -8x -  -6x -  -6x -6x -6x -  -  -  -6x -5x -5x -5x -  -  -  -  -1x -  -  -  -1x -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -2x -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -14x -  -  -  -18x -18x -18x -  -  -  -  -18x -  -  -  -18x -  -  -  -  -  -  -  -  - 
    import React from 'react';
    -import PropTypes from 'prop-types';
    -import cx from 'classnames';
    -import assign from 'object-assign';
    - 
    -import listener from './globalEventListener';
    -import AbstractMenu from './AbstractMenu';
    -import SubMenu from './SubMenu';
    -import { hideMenu } from './actions';
    -import { cssClasses, callIfExists, store } from './helpers';
    - 
    -export default class ContextMenu extends AbstractMenu {
    -    static propTypes = {
    -        id: PropTypes.string.isRequired,
    -        children: PropTypes.node.isRequired,
    -        data: PropTypes.object,
    -        className: PropTypes.string,
    -        hideOnLeave: PropTypes.bool,
    -        onHide: PropTypes.func,
    -        onMouseLeave: PropTypes.func,
    -        onShow: PropTypes.func,
    -        style: PropTypes.object
    -    };
    - 
    -    static defaultProps = {
    -        className: '',
    -        data: {},
    -        hideOnLeave: false,
    -        onHide() { return null; },
    -        onMouseLeave() { return null; },
    -        onShow() { return null; },
    -        style: {}
    -    };
    - 
    -    constructor(props) {
    -        super(props);
    - 
    -        this.state = assign({}, this.state, {
    -            x: 0,
    -            y: 0,
    -            isVisible: false
    -        });
    -    }
    - 
    -    getSubMenuType() { // eslint-disable-line class-methods-use-this
    -        return SubMenu;
    -    }
    - 
    -    componentDidMount() {
    -        this.listenId = listener.register(this.handleShow, this.handleHide);
    -    }
    - 
    -    componentDidUpdate() {
    -        if (this.state.isVisible) {
    -            const wrapper = window.requestAnimationFrame || setTimeout;
    - 
    -            wrapper(() => {
    -                const { x, y } = this.state;
    - 
    -                const { top, left } = this.getMenuPosition(x, y);
    - 
    -                wrapper(() => {
    -                    if (!this.menu) return;
    -                    this.menu.style.top = `${top}px`;
    -                    this.menu.style.left = `${left}px`;
    -                    this.menu.style.opacity = 1;
    -                    this.menu.style.pointerEvents = 'auto';
    -                });
    -            });
    -        } else {
    -            Iif (!this.menu) return;
    -            this.menu.style.opacity = 0;
    -            this.menu.style.pointerEvents = 'none';
    -        }
    -    }
    - 
    -    componentWillUnmount() {
    -        Eif (this.listenId) {
    -            listener.unregister(this.listenId);
    -        }
    - 
    -        this.unregisterHandlers();
    -    }
    - 
    -    registerHandlers = () => {
    -        document.addEventListener('mousedown', this.handleOutsideClick);
    -        document.addEventListener('touchstart', this.handleOutsideClick);
    -        document.addEventListener('scroll', this.handleHide);
    -        document.addEventListener('contextmenu', this.handleHide);
    -        document.addEventListener('keydown', this.handleKeyNavigation);
    -        window.addEventListener('resize', this.handleHide);
    -    }
    - 
    -    unregisterHandlers = () => {
    -        document.removeEventListener('mousedown', this.handleOutsideClick);
    -        document.removeEventListener('touchstart', this.handleOutsideClick);
    -        document.removeEventListener('scroll', this.handleHide);
    -        document.removeEventListener('contextmenu', this.handleHide);
    -        document.removeEventListener('keydown', this.handleKeyNavigation);
    -        window.removeEventListener('resize', this.handleHide);
    -    }
    - 
    -    handleShow = (e) => {
    -        if (e.detail.id !== this.props.id || this.state.isVisible) return;
    - 
    -        const { x, y } = e.detail.position;
    - 
    -        this.setState({ isVisible: true, x, y });
    -        this.registerHandlers();
    -        callIfExists(this.props.onShow, e);
    -    }
    - 
    -    handleHide = (e) => {
    -        if (this.state.isVisible && (!e.detail || !e.detail.id || e.detail.id === this.props.id)) {
    -            this.unregisterHandlers();
    -            this.setState({ isVisible: false, selectedItem: null, forceSubMenuOpen: false });
    -            callIfExists(this.props.onHide, e);
    -        }
    -    }
    - 
    -    handleOutsideClick = (e) => {
    -        Eif (!this.menu.contains(e.target)) hideMenu();
    -    }
    - 
    -    handleMouseLeave = (event) => {
    -        event.preventDefault();
    - 
    -        callIfExists(
    -            this.props.onMouseLeave,
    -            event,
    -            assign({}, this.props.data, store.data),
    -            store.target
    -        );
    - 
    -        Eif (this.props.hideOnLeave) hideMenu();
    -    }
    - 
    -    handleContextMenu = (e) => {
    -        if (process.env.NODE_ENV === 'production') {
    -            e.preventDefault();
    -        }
    -        this.handleHide(e);
    -    }
    - 
    -    hideMenu = (e) => {
    -        Eif (e.keyCode === 27 || e.keyCode === 13) { // ECS or enter
    -            hideMenu();
    -        }
    -    }
    - 
    -    getMenuPosition = (x = 0, y = 0) => {
    -        let menuStyles = {
    -            top: y,
    -            left: x
    -        };
    - 
    -        if (!this.menu) return menuStyles;
    - 
    -        const { innerWidth, innerHeight } = window;
    -        const rect = this.menu.getBoundingClientRect();
    - 
    -        if (y + rect.height > innerHeight) {
    -            menuStyles.top -= rect.height;
    -        }
    - 
    -        if (x + rect.width > innerWidth) {
    -            menuStyles.left -= rect.width;
    -        }
    - 
    -        if (menuStyles.top < 0) {
    -            menuStyles.top = rect.height < innerHeight ? (innerHeight - rect.height) / 2 : 0;
    -        }
    - 
    -        if (menuStyles.left < 0) {
    -            menuStyles.left = rect.width < innerWidth ? (innerWidth - rect.width) / 2 : 0;
    -        }
    - 
    -        return menuStyles;
    -    }
    - 
    -    menuRef = (c) => {
    -        this.menu = c;
    -    }
    - 
    -    render() {
    -        const { children, className, style } = this.props;
    -        const { isVisible } = this.state;
    -        const inlineStyle = assign(
    -          {},
    -          style,
    -          { position: 'fixed', opacity: 0, pointerEvents: 'none' }
    -        );
    -        const menuClassnames = cx(cssClasses.menu, className, {
    -            [cssClasses.menuVisible]: isVisible
    -        });
    - 
    -        return (
    -            <nav
    -                role='menu' tabIndex='-1' ref={this.menuRef} style={inlineStyle} className={menuClassnames}
    -                onContextMenu={this.handleContextMenu} onMouseLeave={this.handleMouseLeave}>
    -                {this.renderChildren(children)}
    -            </nav>
    -        );
    -    }
    -}
    - 
    -
    -
    - - - - - - - - diff --git a/coverage/lcov-report/MenuItem.js.html b/coverage/lcov-report/MenuItem.js.html deleted file mode 100644 index 066429b6..00000000 --- a/coverage/lcov-report/MenuItem.js.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - Code coverage report for MenuItem.js - - - - - - - -
    -
    -

    - All files MenuItem.js -

    -
    -
    - 0% - Statements - 0/14 -
    -
    - 0% - Branches - 0/12 -
    -
    - 0% - Functions - 0/5 -
    -
    - 0% - Lines - 0/12 -
    -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
    import React, { Component } from 'react';
    -import PropTypes from 'prop-types';
    -import cx from 'classnames';
    -import assign from 'object-assign';
    - 
    -import { hideMenu } from './actions';
    -import { callIfExists, cssClasses, store } from './helpers';
    - 
    -export default class MenuItem extends Component {
    -    static propTypes = {
    -        children: PropTypes.node,
    -        attributes: PropTypes.object,
    -        data: PropTypes.object,
    -        disabled: PropTypes.bool,
    -        divider: PropTypes.bool,
    -        preventClose: PropTypes.bool,
    -        onClick: PropTypes.func,
    -        selected: PropTypes.bool,
    -        onMouseMove: PropTypes.func,
    -        onMouseLeave: PropTypes.func
    -    };
    - 
    -    static defaultProps = {
    -        disabled: false,
    -        data: {},
    -        divider: false,
    -        attributes: {},
    -        preventClose: false,
    -        onClick() { return null; },
    -        children: null,
    -        selected: false,
    -        onMouseMove: () => null,
    -        onMouseLeave: () => null
    -    };
    - 
    -    handleClick = (event) => {
    -        event.preventDefault();
    - 
    -        if (this.props.disabled || this.props.divider) return;
    - 
    -        callIfExists(
    -            this.props.onClick,
    -            event,
    -            assign({}, this.props.data, store.data),
    -            store.target
    -        );
    - 
    -        if (this.props.preventClose) return;
    - 
    -        hideMenu();
    -    }
    - 
    -    render() {
    -        const { disabled, divider, children, attributes, selected } = this.props;
    -        const menuItemClassNames = cx(cssClasses.menuItem, attributes.className, {
    -            [cx(cssClasses.menuItemDisabled, attributes.disabledClassName)]: disabled,
    -            [cx(cssClasses.menuItemDivider, attributes.dividerClassName)]: divider,
    -            [cx(cssClasses.menuItemSelected, attributes.selectedClassName)]: selected
    -        });
    - 
    -        return (
    -            <div
    -                {...attributes} className={menuItemClassNames}
    -                role='menuitem' tabIndex='-1' aria-disabled={disabled ? 'true' : 'false'}
    -                aria-orientation={divider ? 'horizontal' : null}
    -                ref={(ref) => { this.ref = ref; }}
    -                onMouseMove={this.props.onMouseMove} onMouseLeave={this.props.onMouseLeave}
    -                onTouchEnd={this.handleClick} onClick={this.handleClick}>
    -                {divider ? null : children}
    -            </div>
    -        );
    -    }
    -}
    - 
    -
    -
    - - - - - - - - diff --git a/coverage/lcov-report/SubMenu.js.html b/coverage/lcov-report/SubMenu.js.html deleted file mode 100644 index c7cc95ac..00000000 --- a/coverage/lcov-report/SubMenu.js.html +++ /dev/null @@ -1,867 +0,0 @@ - - - - Code coverage report for SubMenu.js - - - - - - - -
    -
    -

    - All files SubMenu.js -

    -
    -
    - 0% - Statements - 0/102 -
    -
    - 0% - Branches - 0/62 -
    -
    - 0% - Functions - 0/26 -
    -
    - 0% - Lines - 0/88 -
    -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
    import React from 'react';
    -import PropTypes from 'prop-types';
    -import cx from 'classnames';
    -import assign from 'object-assign';
    - 
    -import AbstractMenu from './AbstractMenu';
    -import { callIfExists, cssClasses, hasOwnProp, store } from './helpers';
    -import listener from './globalEventListener';
    - 
    -export default class SubMenu extends AbstractMenu {
    -    static propTypes = {
    -        children: PropTypes.node.isRequired,
    -        attributes: PropTypes.object,
    -        title: PropTypes.node.isRequired,
    -        className: PropTypes.string,
    -        disabled: PropTypes.bool,
    -        hoverDelay: PropTypes.number,
    -        rtl: PropTypes.bool,
    -        selected: PropTypes.bool,
    -        onMouseMove: PropTypes.func,
    -        onMouseOut: PropTypes.func,
    -        forceOpen: PropTypes.bool,
    -        forceClose: PropTypes.func,
    -        parentKeyNavigationHandler: PropTypes.func
    -    };
    - 
    -    static defaultProps = {
    -        disabled: false,
    -        hoverDelay: 500,
    -        attributes: {},
    -        className: '',
    -        rtl: false,
    -        selected: false,
    -        onMouseMove: () => null,
    -        onMouseOut: () => null,
    -        forceOpen: false,
    -        forceClose: () => null,
    -        parentKeyNavigationHandler: () => null
    -    };
    - 
    -    constructor(props) {
    -        super(props);
    - 
    -        this.state = assign({}, this.state, {
    -            visible: false
    -        });
    -    }
    - 
    -    componentDidMount() {
    -        this.listenId = listener.register(() => {}, this.hideMenu);
    -    }
    - 
    -    getSubMenuType() { // eslint-disable-line class-methods-use-this
    -        return SubMenu;
    -    }
    - 
    -    shouldComponentUpdate(nextProps, nextState) {
    -        this.isVisibilityChange = (this.state.visible !== nextState.visible ||
    -                                  this.props.forceOpen !== nextProps.forceOpen) &&
    -                                  !(this.state.visible && nextProps.forceOpen) &&
    -                                  !(this.props.forceOpen && nextState.visible);
    -        return true;
    -    }
    - 
    -    componentDidUpdate() {
    -        if (!this.isVisibilityChange) return;
    -        if (this.props.forceOpen || this.state.visible) {
    -            const wrapper = window.requestAnimationFrame || setTimeout;
    -            wrapper(() => {
    -                const styles = this.props.rtl
    -                                ? this.getRTLMenuPosition()
    -                                : this.getMenuPosition();
    - 
    -                this.subMenu.style.removeProperty('top');
    -                this.subMenu.style.removeProperty('bottom');
    -                this.subMenu.style.removeProperty('left');
    -                this.subMenu.style.removeProperty('right');
    - 
    -                if (hasOwnProp(styles, 'top')) this.subMenu.style.top = styles.top;
    -                if (hasOwnProp(styles, 'left')) this.subMenu.style.left = styles.left;
    -                if (hasOwnProp(styles, 'bottom')) this.subMenu.style.bottom = styles.bottom;
    -                if (hasOwnProp(styles, 'right')) this.subMenu.style.right = styles.right;
    -                this.subMenu.classList.add(cssClasses.menuVisible);
    - 
    -                this.registerHandlers();
    -                this.setState({ selectedItem: null });
    -            });
    -        } else {
    -            const cleanup = () => {
    -                this.subMenu.removeEventListener('transitionend', cleanup);
    -                this.subMenu.style.removeProperty('bottom');
    -                this.subMenu.style.removeProperty('right');
    -                this.subMenu.style.top = 0;
    -                this.subMenu.style.left = '100%';
    -                this.unregisterHandlers();
    -            };
    -            this.subMenu.addEventListener('transitionend', cleanup);
    -            this.subMenu.classList.remove(cssClasses.menuVisible);
    -        }
    -    }
    - 
    -    componentWillUnmount() {
    -        if (this.listenId) {
    -            listener.unregister(this.listenId);
    -        }
    - 
    -        if (this.opentimer) clearTimeout(this.opentimer);
    - 
    -        if (this.closetimer) clearTimeout(this.closetimer);
    - 
    -        this.unregisterHandlers(true);
    -    }
    - 
    -    getMenuPosition = () => {
    -        const { innerWidth, innerHeight } = window;
    -        const rect = this.subMenu.getBoundingClientRect();
    -        const position = {};
    - 
    -        if (rect.bottom > innerHeight) {
    -            position.bottom = 0;
    -        } else {
    -            position.top = 0;
    -        }
    - 
    -        if (rect.right < innerWidth) {
    -            position.left = '100%';
    -        } else {
    -            position.right = '100%';
    -        }
    - 
    -        return position;
    -    }
    - 
    -    getRTLMenuPosition = () => {
    -        const { innerHeight } = window;
    -        const rect = this.subMenu.getBoundingClientRect();
    -        const position = {};
    - 
    -        if (rect.bottom > innerHeight) {
    -            position.bottom = 0;
    -        } else {
    -            position.top = 0;
    -        }
    - 
    -        if (rect.left < 0) {
    -            position.left = '100%';
    -        } else {
    -            position.right = '100%';
    -        }
    - 
    -        return position;
    -    }
    - 
    -    hideMenu = (e) => {
    -        // avoid closing submenus of a different menu tree
    -        if (e.detail && e.detail.id && this.menu && e.detail.id !== this.menu.id) {
    -            return;
    -        }
    - 
    -        if (this.props.forceOpen) {
    -            this.props.forceClose();
    -        }
    -        this.setState({ visible: false, selectedItem: null });
    -        this.unregisterHandlers();
    -    };
    - 
    -    handleClick = (event) => {
    -        event.preventDefault();
    - 
    -        if (this.props.disabled) return;
    - 
    -        callIfExists(
    -            this.props.onClick,
    -            event,
    -            assign({}, this.props.data, store.data),
    -            store.target
    -        );
    -    }
    - 
    -    handleMouseEnter = () => {
    -        if (this.closetimer) clearTimeout(this.closetimer);
    - 
    -        if (this.props.disabled || this.state.visible) return;
    - 
    -        this.opentimer = setTimeout(() => this.setState({
    -            visible: true,
    -            selectedItem: null
    -        }), this.props.hoverDelay);
    -    }
    - 
    -    handleMouseLeave = () => {
    -        if (this.opentimer) clearTimeout(this.opentimer);
    - 
    -        if (!this.state.visible) return;
    - 
    -        this.closetimer = setTimeout(() => this.setState({
    -            visible: false,
    -            selectedItem: null
    -        }), this.props.hoverDelay);
    -    }
    - 
    -    menuRef = (c) => {
    -        this.menu = c;
    -    }
    - 
    -    subMenuRef = (c) => {
    -        this.subMenu = c;
    -    }
    - 
    -    registerHandlers = () => {
    -        document.removeEventListener('keydown', this.props.parentKeyNavigationHandler);
    -        document.addEventListener('keydown', this.handleKeyNavigation);
    -    }
    - 
    -    unregisterHandlers = (dismounting) => {
    -        document.removeEventListener('keydown', this.handleKeyNavigation);
    -        if (!dismounting) {
    -            document.addEventListener('keydown', this.props.parentKeyNavigationHandler);
    -        }
    -    }
    - 
    -    render() {
    -        const { children, attributes, disabled, title, selected } = this.props;
    -        const { visible } = this.state;
    -        const menuProps = {
    -            ref: this.menuRef,
    -            onMouseEnter: this.handleMouseEnter,
    -            onMouseLeave: this.handleMouseLeave,
    -            className: cx(cssClasses.menuItem, cssClasses.subMenu, attributes.listClassName),
    -            style: {
    -                position: 'relative'
    -            }
    -        };
    -        const menuItemProps = {
    -            className: cx(cssClasses.menuItem, attributes.className, {
    -                [cx(cssClasses.menuItemDisabled, attributes.disabledClassName)]: disabled,
    -                [cx(cssClasses.menuItemActive, attributes.visibleClassName)]: visible,
    -                [cx(cssClasses.menuItemSelected, attributes.selectedClassName)]: selected
    -            }),
    -            onMouseMove: this.props.onMouseMove,
    -            onMouseOut: this.props.onMouseOut,
    -            onClick: this.handleClick
    -        };
    -        const subMenuProps = {
    -            ref: this.subMenuRef,
    -            style: {
    -                position: 'absolute',
    -                transition: 'opacity 1ms', // trigger transitionend event
    -                top: 0,
    -                left: '100%'
    -            },
    -            className: cx(cssClasses.menu, this.props.className)
    -        };
    - 
    -        return (
    -            <nav {...menuProps} role='menuitem' tabIndex='-1' aria-haspopup='true'>
    -                <div {...attributes} {...menuItemProps}>
    -                    {title}
    -                </div>
    -                <nav {...subMenuProps} role='menu' tabIndex='-1'>
    -                    {this.renderChildren(children)}
    -                </nav>
    -            </nav>
    -        );
    -    }
    -}
    - 
    -
    -
    - - - - - - - - diff --git a/coverage/lcov-report/actions.js.html b/coverage/lcov-report/actions.js.html deleted file mode 100644 index 1b78dfe8..00000000 --- a/coverage/lcov-report/actions.js.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - Code coverage report for actions.js - - - - - - - -
    -
    -

    - All files actions.js -

    -
    -
    - 81.82% - Statements - 9/11 -
    -
    - 71.43% - Branches - 5/7 -
    -
    - 100% - Functions - 3/3 -
    -
    - 81.82% - Lines - 9/11 -
    -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34  -  -  -  -2x -2x -  -  -  -  -  -  -  -16x -16x -  -  -  -  -  -16x -16x -16x -  -  -  -  -9x -  -  -  -7x -  - 
    import assign from 'object-assign';
    - 
    -import { store } from './helpers';
    - 
    -export const MENU_SHOW = 'REACT_CONTEXTMENU_SHOW';
    -export const MENU_HIDE = 'REACT_CONTEXTMENU_HIDE';
    - 
    - 
    -export function dispatchGlobalEvent(eventName, opts, target = window) {
    -  // Compatibale with IE
    -  // @see http://stackoverflow.com/questions/26596123/internet-explorer-9-10-11-event-constructor-doesnt-work
    -    let event;
    - 
    -    Eif (typeof window.CustomEvent === 'function') {
    -        event = new window.CustomEvent(eventName, { detail: opts });
    -    } else {
    -        event = document.createEvent('CustomEvent');
    -        event.initCustomEvent(eventName, false, true, opts);
    -    }
    - 
    -    Eif (target) {
    -        target.dispatchEvent(event);
    -        assign(store, opts);
    -    }
    -}
    - 
    -export function showMenu(opts = {}, target) {
    -    dispatchGlobalEvent(MENU_SHOW, assign({}, opts, { type: MENU_SHOW }), target);
    -}
    - 
    -export function hideMenu(opts = {}, target) {
    -    dispatchGlobalEvent(MENU_HIDE, assign({}, opts, { type: MENU_HIDE }), target);
    -}
    - 
    -
    -
    - - - - - - - - diff --git a/coverage/lcov-report/base.css b/coverage/lcov-report/base.css deleted file mode 100644 index 7090209c..00000000 --- a/coverage/lcov-report/base.css +++ /dev/null @@ -1,223 +0,0 @@ -body, html { - margin:0; padding: 0; - height: 100%; -} -body { - font-family: Helvetica Neue, Helvetica, Arial; - font-size: 14px; - color:#333; -} -.small { font-size: 12px; } -*, *:after, *:before { - -webkit-box-sizing:border-box; - -moz-box-sizing:border-box; - box-sizing:border-box; - } -h1 { font-size: 20px; margin: 0;} -h2 { font-size: 14px; } -pre { - font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; - margin: 0; - padding: 0; - -moz-tab-size: 2; - -o-tab-size: 2; - tab-size: 2; -} -a { color:#0074D9; text-decoration:none; } -a:hover { text-decoration:underline; } -.strong { font-weight: bold; } -.space-top1 { padding: 10px 0 0 0; } -.pad2y { padding: 20px 0; } -.pad1y { padding: 10px 0; } -.pad2x { padding: 0 20px; } -.pad2 { padding: 20px; } -.pad1 { padding: 10px; } -.space-left2 { padding-left:55px; } -.space-right2 { padding-right:20px; } -.center { text-align:center; } -.clearfix { display:block; } -.clearfix:after { - content:''; - display:block; - height:0; - clear:both; - visibility:hidden; - } -.fl { float: left; } -@media only screen and (max-width:640px) { - .col3 { width:100%; max-width:100%; } - .hide-mobile { display:none!important; } -} - -.quiet { - color: #7f7f7f; - color: rgba(0,0,0,0.5); -} -.quiet a { opacity: 0.7; } - -.fraction { - font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; - font-size: 10px; - color: #555; - background: #E8E8E8; - padding: 4px 5px; - border-radius: 3px; - vertical-align: middle; -} - -div.path a:link, div.path a:visited { color: #333; } -table.coverage { - border-collapse: collapse; - margin: 10px 0 0 0; - padding: 0; -} - -table.coverage td { - margin: 0; - padding: 0; - vertical-align: top; -} -table.coverage td.line-count { - text-align: right; - padding: 0 5px 0 20px; -} -table.coverage td.line-coverage { - text-align: right; - padding-right: 10px; - min-width:20px; -} - -table.coverage td span.cline-any { - display: inline-block; - padding: 0 5px; - width: 100%; -} -.missing-if-branch { - display: inline-block; - margin-right: 5px; - border-radius: 3px; - position: relative; - padding: 0 4px; - background: #333; - color: yellow; -} - -.skip-if-branch { - display: none; - margin-right: 10px; - position: relative; - padding: 0 4px; - background: #ccc; - color: white; -} -.missing-if-branch .typ, .skip-if-branch .typ { - color: inherit !important; -} -.coverage-summary { - border-collapse: collapse; - width: 100%; -} -.coverage-summary tr { border-bottom: 1px solid #bbb; } -.keyline-all { border: 1px solid #ddd; } -.coverage-summary td, .coverage-summary th { padding: 10px; } -.coverage-summary tbody { border: 1px solid #bbb; } -.coverage-summary td { border-right: 1px solid #bbb; } -.coverage-summary td:last-child { border-right: none; } -.coverage-summary th { - text-align: left; - font-weight: normal; - white-space: nowrap; -} -.coverage-summary th.file { border-right: none !important; } -.coverage-summary th.pct { } -.coverage-summary th.pic, -.coverage-summary th.abs, -.coverage-summary td.pct, -.coverage-summary td.abs { text-align: right; } -.coverage-summary td.file { white-space: nowrap; } -.coverage-summary td.pic { min-width: 120px !important; } -.coverage-summary tfoot td { } - -.coverage-summary .sorter { - height: 10px; - width: 7px; - display: inline-block; - margin-left: 0.5em; - background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; -} -.coverage-summary .sorted .sorter { - background-position: 0 -20px; -} -.coverage-summary .sorted-desc .sorter { - background-position: 0 -10px; -} -.status-line { height: 10px; } -/* yellow */ -.cbranch-no { background: yellow !important; color: #111; } -/* dark red */ -.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } -.low .chart { border:1px solid #C21F39 } -.highlighted, -.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ - background: #C21F39 !important; -} -/* medium red */ -.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } -/* light red */ -.low, .cline-no { background:#FCE1E5 } -/* light green */ -.high, .cline-yes { background:rgb(230,245,208) } -/* medium green */ -.cstat-yes { background:rgb(161,215,106) } -/* dark green */ -.status-line.high, .high .cover-fill { background:rgb(77,146,33) } -.high .chart { border:1px solid rgb(77,146,33) } - -.medium .chart { border:1px solid #666; } -.medium .cover-fill { background: #666; } - -.cstat-skip { background: #ddd; color: #111; } -.fstat-skip { background: #ddd; color: #111 !important; } -.cbranch-skip { background: #ddd !important; color: #111; } - -span.cline-neutral { background: #eaeaea; } -.medium { background: #eaeaea; } - -.coverage-summary td.empty { - opacity: .5; - padding-top: 4px; - padding-bottom: 4px; - line-height: 1; - color: #888; -} - -.cover-fill, .cover-empty { - display:inline-block; - height: 12px; -} -.chart { - line-height: 0; -} -.cover-empty { - background: white; -} -.cover-full { - border-right: none !important; -} -pre.prettyprint { - border: none !important; - padding: 0 !important; - margin: 0 !important; -} -.com { color: #999 !important; } -.ignore-none { color: #999; font-weight: normal; } - -.wrapper { - min-height: 100%; - height: auto !important; - height: 100%; - margin: 0 auto -48px; -} -.footer, .push { - height: 48px; -} diff --git a/coverage/lcov-report/block-navigation.js b/coverage/lcov-report/block-navigation.js deleted file mode 100644 index 0c719038..00000000 --- a/coverage/lcov-report/block-navigation.js +++ /dev/null @@ -1,63 +0,0 @@ -var jumpToCode = (function init () { - // Classes of code we would like to highlight - var missingCoverageClasses = [ '.cbranch-no', '.cstat-no', '.fstat-no' ]; - - // We don't want to select elements that are direct descendants of another match - var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` - - // Selecter that finds elements on the page to which we can jump - var selector = notSelector + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` - - // The NodeList of matching elements - var missingCoverageElements = document.querySelectorAll(selector); - - var currentIndex; - - function toggleClass(index) { - missingCoverageElements.item(currentIndex).classList.remove('highlighted'); - missingCoverageElements.item(index).classList.add('highlighted'); - } - - function makeCurrent(index) { - toggleClass(index); - currentIndex = index; - missingCoverageElements.item(index) - .scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' }); - } - - function goToPrevious() { - var nextIndex = 0; - if (typeof currentIndex !== 'number' || currentIndex === 0) { - nextIndex = missingCoverageElements.length - 1; - } else if (missingCoverageElements.length > 1) { - nextIndex = currentIndex - 1; - } - - makeCurrent(nextIndex); - } - - function goToNext() { - var nextIndex = 0; - - if (typeof currentIndex === 'number' && currentIndex < (missingCoverageElements.length - 1)) { - nextIndex = currentIndex + 1; - } - - makeCurrent(nextIndex); - } - - return function jump(event) { - switch (event.which) { - case 78: // n - case 74: // j - goToNext(); - break; - case 66: // b - case 75: // k - case 80: // p - goToPrevious(); - break; - } - }; -}()); -window.addEventListener('keydown', jumpToCode); diff --git a/coverage/lcov-report/globalEventListener.js.html b/coverage/lcov-report/globalEventListener.js.html deleted file mode 100644 index d2154716..00000000 --- a/coverage/lcov-report/globalEventListener.js.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - Code coverage report for globalEventListener.js - - - - - - - -
    -
    -

    - All files globalEventListener.js -

    -
    -
    - 100% - Statements - 15/15 -
    -
    - 60% - Branches - 6/10 -
    -
    - 100% - Functions - 5/5 -
    -
    - 100% - Lines - 13/13 -
    -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45  -  -  -  -  -1x -  -1x -1x -1x -  -  -  -  -8x -8x -  -  -  -  -6x -6x -  -  -  -  -7x -  -7x -  -  -  -  -7x -  -  -  -7x -7x -  -  -  -  -  - 
    import { MENU_SHOW, MENU_HIDE } from './actions';
    -import { uniqueId, hasOwnProp, canUseDOM } from './helpers';
    - 
    -class GlobalEventListener {
    -    constructor() {
    -        this.callbacks = {};
    - 
    -        Eif (canUseDOM) {
    -            window.addEventListener(MENU_SHOW, this.handleShowEvent);
    -            window.addEventListener(MENU_HIDE, this.handleHideEvent);
    -        }
    -    }
    - 
    -    handleShowEvent = (event) => {
    -        for (const id in this.callbacks) {
    -            Eif (hasOwnProp(this.callbacks, id)) this.callbacks[id].show(event);
    -        }
    -    }
    - 
    -    handleHideEvent = (event) => {
    -        for (const id in this.callbacks) {
    -            Eif (hasOwnProp(this.callbacks, id)) this.callbacks[id].hide(event);
    -        }
    -    }
    - 
    -    register = (showCallback, hideCallback) => {
    -        const id = uniqueId();
    - 
    -        this.callbacks[id] = {
    -            show: showCallback,
    -            hide: hideCallback
    -        };
    - 
    -        return id;
    -    }
    - 
    -    unregister = (id) => {
    -        Eif (id && this.callbacks[id]) {
    -            delete this.callbacks[id];
    -        }
    -    }
    -}
    - 
    -export default new GlobalEventListener();
    - 
    -
    -
    - - - - - - - - diff --git a/coverage/lcov-report/helpers.js.html b/coverage/lcov-report/helpers.js.html deleted file mode 100644 index 84c765be..00000000 --- a/coverage/lcov-report/helpers.js.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - Code coverage report for helpers.js - - - - - - - -
    -
    -

    - All files helpers.js -

    -
    -
    - 100% - Statements - 6/6 -
    -
    - 100% - Branches - 5/5 -
    -
    - 100% - Functions - 3/3 -
    -
    - 100% - Lines - 6/6 -
    -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    
    -
    -
    1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30  -12x -  -  -  -14x -  -  -  -7x -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -2x -  -2x -  -  - 
    export function callIfExists(func, ...args) {
    -    return (typeof func === 'function') && func(...args);
    -}
    - 
    -export function hasOwnProp(obj, prop) {
    -    return Object.prototype.hasOwnProperty.call(obj, prop);
    -}
    - 
    -export function uniqueId() {
    -    return Math.random().toString(36).substring(7);
    -}
    - 
    -export const cssClasses = {
    -    menu: 'react-contextmenu',
    -    menuVisible: 'react-contextmenu--visible',
    -    menuWrapper: 'react-contextmenu-wrapper',
    -    menuItem: 'react-contextmenu-item',
    -    menuItemActive: 'react-contextmenu-item--active',
    -    menuItemDisabled: 'react-contextmenu-item--disabled',
    -    menuItemDivider: 'react-contextmenu-item--divider',
    -    menuItemSelected: 'react-contextmenu-item--selected',
    -    subMenu: 'react-contextmenu-submenu'
    -};
    - 
    -export const store = {};
    - 
    -export const canUseDOM = Boolean(
    -  typeof window !== 'undefined' && window.document && window.document.createElement
    -);
    - 
    -
    -
    - - - - - - - - diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html deleted file mode 100644 index 39b90315..00000000 --- a/coverage/lcov-report/index.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - Code coverage report for All files - - - - - - - -
    -
    -

    - All files -

    -
    -
    - 32.65% - Statements - 96/294 -
    -
    - 22.28% - Branches - 43/193 -
    -
    - 38.89% - Functions - 28/72 -
    -
    - 34.08% - Lines - 91/267 -
    -
    -

    - Press n or j to go to the next uncovered block, b, p or k for the previous block. -

    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FileStatementsBranchesFunctionsLines
    AbstractMenu.js
    23.88%16/6715.69%8/5133.33%4/1225%16/64
    ContextMenu.js
    63.29%50/7941.3%19/4672.22%13/1864.38%47/73
    MenuItem.js
    0%0/140%0/120%0/50%0/12
    SubMenu.js
    0%0/1020%0/620%0/260%0/88
    actions.js
    81.82%9/1171.43%5/7100%3/381.82%9/11
    globalEventListener.js
    100%15/1560%6/10100%5/5100%13/13
    helpers.js
    100%6/6100%5/5100%3/3100%6/6
    -
    -
    - - - - - - - - diff --git a/coverage/lcov-report/prettify.css b/coverage/lcov-report/prettify.css deleted file mode 100644 index b317a7cd..00000000 --- a/coverage/lcov-report/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/lcov-report/prettify.js b/coverage/lcov-report/prettify.js deleted file mode 100644 index ef51e038..00000000 --- a/coverage/lcov-report/prettify.js +++ /dev/null @@ -1 +0,0 @@ -window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/lcov-report/sort-arrow-sprite.png b/coverage/lcov-report/sort-arrow-sprite.png deleted file mode 100644 index 03f704a609c6fd0dbfdac63466a7d7c958b5cbf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jii$m5978H@?Fn+^JD|Y9yzj{W`447Gxa{7*dM7nnnD-Lb z6^}Hx2)'; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll('td'), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute('data-value'); - if (col.type === 'number') { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll('tr'), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function (a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector('.coverage-summary tbody'), - rowNodes = tableBody.querySelectorAll('tr'), - rows = [], - i; - - if (desc) { - finalSorter = function (a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted'; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function () { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i =0 ; i < cols.length; i += 1) { - if (cols[i].sortable) { - // add the click event handler on the th so users - // dont have to click on those tiny arrows - el = getNthColumn(i).querySelector('.sorter').parentElement; - if (el.addEventListener) { - el.addEventListener('click', ithSorter(i)); - } else { - el.attachEvent('onclick', ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function () { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(cols); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener('load', addSorting); diff --git a/coverage/lcov.info b/coverage/lcov.info deleted file mode 100644 index 2c99890a..00000000 --- a/coverage/lcov.info +++ /dev/null @@ -1,667 +0,0 @@ -TN: -SF:/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/AbstractMenu.js -FN:11,(anonymous_0) -FN:21,(anonymous_1) -FN:68,(anonymous_2) -FN:72,(anonymous_3) -FN:79,(anonymous_4) -FN:82,(anonymous_5) -FN:116,(anonymous_6) -FN:122,(anonymous_7) -FN:126,(anonymous_8) -FN:126,(anonymous_9) -FN:144,(anonymous_10) -FN:148,(anonymous_11) -FNF:12 -FNH:4 -FNDA:7,(anonymous_0) -FNDA:2,(anonymous_1) -FNDA:0,(anonymous_2) -FNDA:1,(anonymous_3) -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:18,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -DA:12,7 -DA:14,7 -DA:15,7 -DA:24,2 -DA:25,0 -DA:28,2 -DA:31,1 -DA:32,1 -DA:33,1 -DA:35,0 -DA:36,0 -DA:37,0 -DA:39,0 -DA:40,0 -DA:41,0 -DA:43,0 -DA:44,0 -DA:46,1 -DA:47,1 -DA:50,1 -DA:54,1 -DA:57,0 -DA:59,1 -DA:62,1 -DA:69,0 -DA:73,1 -DA:74,0 -DA:75,0 -DA:80,0 -DA:81,0 -DA:82,0 -DA:85,0 -DA:86,0 -DA:89,0 -DA:91,0 -DA:92,0 -DA:93,0 -DA:96,0 -DA:97,0 -DA:98,0 -DA:99,0 -DA:103,0 -DA:104,0 -DA:109,0 -DA:117,0 -DA:118,0 -DA:123,0 -DA:126,18 -DA:127,0 -DA:128,0 -DA:129,0 -DA:131,0 -DA:132,0 -DA:134,0 -DA:135,0 -DA:137,0 -DA:138,0 -DA:139,0 -DA:141,0 -DA:143,0 -DA:144,0 -DA:145,0 -DA:148,0 -DA:149,0 -LF:64 -LH:16 -BRDA:24,0,0,0 -BRDA:24,0,1,2 -BRDA:28,1,0,0 -BRDA:28,1,1,1 -BRDA:28,1,2,0 -BRDA:28,1,3,0 -BRDA:28,1,4,0 -BRDA:28,1,5,1 -BRDA:28,1,6,0 -BRDA:50,2,0,1 -BRDA:50,2,1,0 -BRDA:50,2,2,0 -BRDA:54,3,0,0 -BRDA:54,3,1,1 -BRDA:54,4,0,1 -BRDA:54,4,1,0 -BRDA:54,4,2,0 -BRDA:73,5,0,0 -BRDA:73,5,1,1 -BRDA:73,6,0,1 -BRDA:73,6,1,0 -BRDA:85,7,0,0 -BRDA:85,7,1,0 -BRDA:89,8,0,0 -BRDA:89,8,1,0 -BRDA:92,9,0,0 -BRDA:92,9,1,0 -BRDA:98,10,0,0 -BRDA:98,10,1,0 -BRDA:100,11,0,0 -BRDA:100,11,1,0 -BRDA:103,12,0,0 -BRDA:103,12,1,0 -BRDA:105,13,0,0 -BRDA:105,13,1,0 -BRDA:110,14,0,0 -BRDA:110,14,1,0 -BRDA:117,15,0,0 -BRDA:117,15,1,0 -BRDA:128,16,0,0 -BRDA:128,16,1,0 -BRDA:129,17,0,0 -BRDA:129,17,1,0 -BRDA:135,18,0,0 -BRDA:135,18,1,0 -BRDA:137,19,0,0 -BRDA:137,19,1,0 -BRDA:141,20,0,0 -BRDA:141,20,1,0 -BRDA:141,21,0,0 -BRDA:141,21,1,0 -BRF:51 -BRH:8 -end_of_record -TN: -SF:/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/ContextMenu.js -FN:35,(anonymous_0) -FN:45,(anonymous_1) -FN:49,(anonymous_2) -FN:53,(anonymous_3) -FN:57,(anonymous_4) -FN:62,(anonymous_5) -FN:77,(anonymous_6) -FN:85,(anonymous_7) -FN:94,(anonymous_8) -FN:103,(anonymous_9) -FN:113,(anonymous_10) -FN:121,(anonymous_11) -FN:125,(anonymous_12) -FN:138,(anonymous_13) -FN:145,(anonymous_14) -FN:151,(anonymous_15) -FN:181,(anonymous_16) -FN:185,(anonymous_17) -FNF:18 -FNH:13 -FNDA:7,(anonymous_0) -FNDA:0,(anonymous_1) -FNDA:7,(anonymous_2) -FNDA:11,(anonymous_3) -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:7,(anonymous_6) -FNDA:6,(anonymous_7) -FNDA:12,(anonymous_8) -FNDA:8,(anonymous_9) -FNDA:6,(anonymous_10) -FNDA:1,(anonymous_11) -FNDA:1,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:2,(anonymous_14) -FNDA:0,(anonymous_15) -FNDA:14,(anonymous_16) -FNDA:18,(anonymous_17) -DA:29,1 -DA:30,0 -DA:31,5 -DA:36,7 -DA:38,7 -DA:46,0 -DA:50,7 -DA:54,11 -DA:55,6 -DA:57,6 -DA:58,0 -DA:60,0 -DA:62,0 -DA:63,0 -DA:64,0 -DA:65,0 -DA:66,0 -DA:67,0 -DA:71,5 -DA:72,5 -DA:73,5 -DA:78,7 -DA:79,7 -DA:82,7 -DA:86,6 -DA:87,6 -DA:88,6 -DA:89,6 -DA:90,6 -DA:91,6 -DA:95,12 -DA:96,12 -DA:97,12 -DA:98,12 -DA:99,12 -DA:100,12 -DA:104,8 -DA:106,6 -DA:108,6 -DA:109,6 -DA:110,6 -DA:114,6 -DA:115,5 -DA:116,5 -DA:117,5 -DA:122,1 -DA:126,1 -DA:128,1 -DA:135,1 -DA:139,0 -DA:140,0 -DA:142,0 -DA:146,2 -DA:147,2 -DA:152,0 -DA:157,0 -DA:159,0 -DA:160,0 -DA:162,0 -DA:163,0 -DA:166,0 -DA:167,0 -DA:170,0 -DA:171,0 -DA:174,0 -DA:175,0 -DA:178,0 -DA:182,14 -DA:186,18 -DA:187,18 -DA:188,18 -DA:193,18 -DA:197,18 -LF:73 -LH:47 -BRDA:54,0,0,6 -BRDA:54,0,1,5 -BRDA:55,1,0,6 -BRDA:55,1,1,0 -BRDA:63,2,0,0 -BRDA:63,2,1,0 -BRDA:71,3,0,0 -BRDA:71,3,1,5 -BRDA:78,4,0,7 -BRDA:78,4,1,0 -BRDA:104,5,0,2 -BRDA:104,5,1,6 -BRDA:104,6,0,8 -BRDA:104,6,1,7 -BRDA:114,7,0,5 -BRDA:114,7,1,1 -BRDA:114,8,0,6 -BRDA:114,8,1,5 -BRDA:114,8,2,5 -BRDA:114,8,3,0 -BRDA:122,9,0,1 -BRDA:122,9,1,0 -BRDA:135,10,0,1 -BRDA:135,10,1,0 -BRDA:139,11,0,0 -BRDA:139,11,1,0 -BRDA:146,12,0,2 -BRDA:146,12,1,0 -BRDA:146,13,0,2 -BRDA:146,13,1,1 -BRDA:151,14,0,0 -BRDA:151,15,0,0 -BRDA:157,16,0,0 -BRDA:157,16,1,0 -BRDA:162,17,0,0 -BRDA:162,17,1,0 -BRDA:166,18,0,0 -BRDA:166,18,1,0 -BRDA:170,19,0,0 -BRDA:170,19,1,0 -BRDA:171,20,0,0 -BRDA:171,20,1,0 -BRDA:174,21,0,0 -BRDA:174,21,1,0 -BRDA:175,22,0,0 -BRDA:175,22,1,0 -BRF:46 -BRH:19 -end_of_record -TN: -SF:/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/MenuItem.js -FN:32,(anonymous_0) -FN:33,(anonymous_1) -FN:36,(anonymous_2) -FN:53,(anonymous_3) -FN:66,(anonymous_4) -FNF:5 -FNH:0 -FNDA:0,(anonymous_0) -FNDA:0,(anonymous_1) -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -FNDA:0,(anonymous_4) -DA:29,0 -DA:32,0 -DA:33,0 -DA:37,0 -DA:39,0 -DA:41,0 -DA:48,0 -DA:50,0 -DA:54,0 -DA:55,0 -DA:61,0 -DA:66,0 -LF:12 -LH:0 -BRDA:39,0,0,0 -BRDA:39,0,1,0 -BRDA:39,1,0,0 -BRDA:39,1,1,0 -BRDA:48,2,0,0 -BRDA:48,2,1,0 -BRDA:64,3,0,0 -BRDA:64,3,1,0 -BRDA:65,4,0,0 -BRDA:65,4,1,0 -BRDA:69,5,0,0 -BRDA:69,5,1,0 -BRF:12 -BRH:0 -end_of_record -TN: -SF:/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/SubMenu.js -FN:34,(anonymous_0) -FN:35,(anonymous_1) -FN:37,(anonymous_2) -FN:38,(anonymous_3) -FN:41,(anonymous_4) -FN:49,(anonymous_5) -FN:50,(anonymous_6) -FN:53,(anonymous_7) -FN:57,(anonymous_8) -FN:65,(anonymous_9) -FN:69,(anonymous_10) -FN:89,(anonymous_11) -FN:102,(anonymous_12) -FN:114,(anonymous_13) -FN:134,(anonymous_14) -FN:154,(anonymous_15) -FN:167,(anonymous_16) -FN:180,(anonymous_17) -FN:185,(anonymous_18) -FN:191,(anonymous_19) -FN:196,(anonymous_20) -FN:202,(anonymous_21) -FN:206,(anonymous_22) -FN:210,(anonymous_23) -FN:215,(anonymous_24) -FN:222,(anonymous_25) -FNF:26 -FNH:0 -FNDA:0,(anonymous_0) -FNDA:0,(anonymous_1) -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -FNDA:0,(anonymous_15) -FNDA:0,(anonymous_16) -FNDA:0,(anonymous_17) -FNDA:0,(anonymous_18) -FNDA:0,(anonymous_19) -FNDA:0,(anonymous_20) -FNDA:0,(anonymous_21) -FNDA:0,(anonymous_22) -FNDA:0,(anonymous_23) -FNDA:0,(anonymous_24) -FNDA:0,(anonymous_25) -DA:34,0 -DA:35,0 -DA:37,0 -DA:38,0 -DA:42,0 -DA:44,0 -DA:50,0 -DA:54,0 -DA:58,0 -DA:62,0 -DA:66,0 -DA:67,0 -DA:68,0 -DA:69,0 -DA:70,0 -DA:74,0 -DA:75,0 -DA:76,0 -DA:77,0 -DA:79,0 -DA:80,0 -DA:81,0 -DA:82,0 -DA:83,0 -DA:85,0 -DA:86,0 -DA:89,0 -DA:90,0 -DA:91,0 -DA:92,0 -DA:93,0 -DA:94,0 -DA:95,0 -DA:97,0 -DA:98,0 -DA:103,0 -DA:104,0 -DA:107,0 -DA:109,0 -DA:111,0 -DA:115,0 -DA:116,0 -DA:117,0 -DA:119,0 -DA:120,0 -DA:122,0 -DA:125,0 -DA:126,0 -DA:128,0 -DA:131,0 -DA:135,0 -DA:136,0 -DA:137,0 -DA:139,0 -DA:140,0 -DA:142,0 -DA:145,0 -DA:146,0 -DA:148,0 -DA:151,0 -DA:156,0 -DA:157,0 -DA:160,0 -DA:161,0 -DA:163,0 -DA:164,0 -DA:168,0 -DA:170,0 -DA:172,0 -DA:181,0 -DA:183,0 -DA:185,0 -DA:192,0 -DA:194,0 -DA:196,0 -DA:203,0 -DA:207,0 -DA:211,0 -DA:212,0 -DA:216,0 -DA:217,0 -DA:218,0 -DA:223,0 -DA:224,0 -DA:225,0 -DA:234,0 -DA:244,0 -DA:255,0 -LF:88 -LH:0 -BRDA:58,0,0,0 -BRDA:58,0,1,0 -BRDA:58,0,2,0 -BRDA:58,0,3,0 -BRDA:60,1,0,0 -BRDA:60,1,1,0 -BRDA:61,2,0,0 -BRDA:61,2,1,0 -BRDA:66,3,0,0 -BRDA:66,3,1,0 -BRDA:67,4,0,0 -BRDA:67,4,1,0 -BRDA:67,5,0,0 -BRDA:67,5,1,0 -BRDA:68,6,0,0 -BRDA:68,6,1,0 -BRDA:70,7,0,0 -BRDA:70,7,1,0 -BRDA:79,8,0,0 -BRDA:79,8,1,0 -BRDA:80,9,0,0 -BRDA:80,9,1,0 -BRDA:81,10,0,0 -BRDA:81,10,1,0 -BRDA:82,11,0,0 -BRDA:82,11,1,0 -BRDA:103,12,0,0 -BRDA:103,12,1,0 -BRDA:107,13,0,0 -BRDA:107,13,1,0 -BRDA:109,14,0,0 -BRDA:109,14,1,0 -BRDA:119,15,0,0 -BRDA:119,15,1,0 -BRDA:125,16,0,0 -BRDA:125,16,1,0 -BRDA:139,17,0,0 -BRDA:139,17,1,0 -BRDA:145,18,0,0 -BRDA:145,18,1,0 -BRDA:156,19,0,0 -BRDA:156,19,1,0 -BRDA:156,20,0,0 -BRDA:156,20,1,0 -BRDA:156,20,2,0 -BRDA:156,20,3,0 -BRDA:160,21,0,0 -BRDA:160,21,1,0 -BRDA:170,22,0,0 -BRDA:170,22,1,0 -BRDA:181,23,0,0 -BRDA:181,23,1,0 -BRDA:183,24,0,0 -BRDA:183,24,1,0 -BRDA:183,25,0,0 -BRDA:183,25,1,0 -BRDA:192,26,0,0 -BRDA:192,26,1,0 -BRDA:194,27,0,0 -BRDA:194,27,1,0 -BRDA:217,28,0,0 -BRDA:217,28,1,0 -BRF:62 -BRH:0 -end_of_record -TN: -SF:/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/actions.js -FN:9,dispatchGlobalEvent -FN:27,showMenu -FN:31,hideMenu -FNF:3 -FNH:3 -FNDA:16,dispatchGlobalEvent -FNDA:9,showMenu -FNDA:7,hideMenu -DA:5,2 -DA:6,2 -DA:14,16 -DA:15,16 -DA:17,0 -DA:18,0 -DA:21,16 -DA:22,16 -DA:23,16 -DA:28,9 -DA:32,7 -LF:11 -LH:9 -BRDA:9,0,0,16 -BRDA:14,1,0,16 -BRDA:14,1,1,0 -BRDA:21,2,0,16 -BRDA:21,2,1,0 -BRDA:27,3,0,1 -BRDA:31,4,0,7 -BRF:7 -BRH:5 -end_of_record -TN: -SF:/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/globalEventListener.js -FN:5,(anonymous_0) -FN:14,(anonymous_1) -FN:20,(anonymous_2) -FN:26,(anonymous_3) -FN:37,(anonymous_4) -FNF:5 -FNH:5 -FNDA:1,(anonymous_0) -FNDA:8,(anonymous_1) -FNDA:6,(anonymous_2) -FNDA:7,(anonymous_3) -FNDA:7,(anonymous_4) -DA:6,1 -DA:8,1 -DA:9,1 -DA:10,1 -DA:15,8 -DA:16,8 -DA:21,6 -DA:22,6 -DA:27,7 -DA:29,7 -DA:34,7 -DA:38,7 -DA:39,7 -LF:13 -LH:13 -BRDA:8,0,0,1 -BRDA:8,0,1,0 -BRDA:16,1,0,8 -BRDA:16,1,1,0 -BRDA:22,2,0,6 -BRDA:22,2,1,0 -BRDA:38,3,0,7 -BRDA:38,3,1,0 -BRDA:38,4,0,7 -BRDA:38,4,1,7 -BRF:10 -BRH:6 -end_of_record -TN: -SF:/home/newISS/Documents/NewFramework/R&D/react-contextmenu/src/helpers.js -FN:1,callIfExists -FN:5,hasOwnProp -FN:9,uniqueId -FNF:3 -FNH:3 -FNDA:12,callIfExists -FNDA:14,hasOwnProp -FNDA:7,uniqueId -DA:2,12 -DA:6,14 -DA:10,7 -DA:13,2 -DA:25,2 -DA:27,2 -LF:6 -LH:6 -BRDA:2,0,0,12 -BRDA:2,0,1,12 -BRDA:28,1,0,2 -BRDA:28,1,1,2 -BRDA:28,1,2,2 -BRF:5 -BRH:5 -end_of_record diff --git a/dist/react-contextmenu.js b/dist/react-contextmenu.js deleted file mode 100644 index 4805f0f2..00000000 --- a/dist/react-contextmenu.js +++ /dev/null @@ -1,11 +0,0 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("react")):"function"==typeof define&&define.amd?define(["react"],t):"object"==typeof exports?exports.ReactContextMenu=t(require("react")):e.ReactContextMenu=t(e.React)}(this,function(e){return function(e){function t(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=11)}([function(t,n){t.exports=e},function(e,t,n){"use strict";function o(e){for(var t=arguments.length,n=Array(t>1?t-1:0),o=1;o2&&void 0!==arguments[2]?arguments[2]:window,o=void 0;"function"==typeof window.CustomEvent?o=new window.CustomEvent(e,{detail:t}):(o=document.createEvent("CustomEvent"),o.initCustomEvent(e,!1,!0,t)),n&&(n.dispatchEvent(o),u()(s.e,t))}function r(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];o(c,u()({},e,{type:c}),t)}function i(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];o(l,u()({},e,{type:l}),t)}n.d(t,"b",function(){return c}),n.d(t,"a",function(){return l}),t.d=r,t.c=i;var a=n(3),u=n.n(a),s=n(1),c="REACT_CONTEXTMENU_SHOW",l="REACT_CONTEXTMENU_HIDE"},function(e,t,n){var o,r;/*! - Copyright (c) 2017 Jed Watson. - Licensed under the MIT License (MIT), see - http://jedwatson.github.io/classnames -*/ -!function(){"use strict";function n(){for(var e=[],t=0;to?i.bottom=0:i.top=0,r.rightt?r.bottom=0:r.top=0,o.left<0?r.left="100%":r.right="100%",r},n.hideMenu=function(e){e.detail&&e.detail.id&&n.menu&&e.detail.id!==n.menu.id||(n.props.forceOpen&&n.props.forceClose(),n.setState({visible:!1,selectedItem:null}),n.unregisterHandlers())},n.handleClick=function(e){e.preventDefault(),n.props.disabled||Object(m.a)(n.props.onClick,e,h()({},n.props.data,m.e.data),m.e.target)},n.handleMouseEnter=function(){n.closetimer&&clearTimeout(n.closetimer),n.props.disabled||n.state.visible||(n.opentimer=setTimeout(function(){return n.setState({visible:!0,selectedItem:null})},n.props.hoverDelay))},n.handleMouseLeave=function(){n.opentimer&&clearTimeout(n.opentimer),n.state.visible&&(n.closetimer=setTimeout(function(){return n.setState({visible:!1,selectedItem:null})},n.props.hoverDelay))},n.menuRef=function(e){n.menu=e},n.subMenuRef=function(e){n.subMenu=e},n.registerHandlers=function(){document.removeEventListener("keydown",n.props.parentKeyNavigationHandler),document.addEventListener("keydown",n.handleKeyNavigation)},n.unregisterHandlers=function(e){document.removeEventListener("keydown",n.handleKeyNavigation),e||document.addEventListener("keydown",n.props.parentKeyNavigationHandler)},n.state=h()({},n.state,{visible:!1}),n}return a(t,e),O(t,[{key:"componentDidMount",value:function(){this.listenId=v.a.register(function(){},this.hideMenu)}},{key:"getSubMenuType",value:function(){return t}},{key:"shouldComponentUpdate",value:function(e,t){return this.isVisibilityChange=!(this.state.visible===t.visible&&this.props.forceOpen===e.forceOpen||this.state.visible&&e.forceOpen||this.props.forceOpen&&t.visible),!0}},{key:"componentDidUpdate",value:function(){var e=this;if(this.isVisibilityChange)if(this.props.forceOpen||this.state.visible){var t=window.requestAnimationFrame||setTimeout;t(function(){var t=e.props.rtl?e.getRTLMenuPosition():e.getMenuPosition();e.subMenu.style.removeProperty("top"),e.subMenu.style.removeProperty("bottom"),e.subMenu.style.removeProperty("left"),e.subMenu.style.removeProperty("right"),Object(m.d)(t,"top")&&(e.subMenu.style.top=t.top),Object(m.d)(t,"left")&&(e.subMenu.style.left=t.left),Object(m.d)(t,"bottom")&&(e.subMenu.style.bottom=t.bottom),Object(m.d)(t,"right")&&(e.subMenu.style.right=t.right),e.subMenu.classList.add(m.c.menuVisible),e.registerHandlers(),e.setState({selectedItem:null})})}else{var n=function t(){e.subMenu.removeEventListener("transitionend",t),e.subMenu.style.removeProperty("bottom"),e.subMenu.style.removeProperty("right"),e.subMenu.style.top=0,e.subMenu.style.left="100%",e.unregisterHandlers()};this.subMenu.addEventListener("transitionend",n),this.subMenu.classList.remove(m.c.menuVisible)}}},{key:"componentWillUnmount",value:function(){this.listenId&&v.a.unregister(this.listenId),this.opentimer&&clearTimeout(this.opentimer),this.closetimer&&clearTimeout(this.closetimer),this.unregisterHandlers(!0)}},{key:"render",value:function(){var e,t=this.props,n=t.children,r=t.attributes,i=t.disabled,a=t.title,u=t.selected,c=this.state.visible,l={ref:this.menuRef,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave,className:p()(m.c.menuItem,m.c.subMenu,r.listClassName),style:{position:"relative"}},d={className:p()(m.c.menuItem,r.className,(e={},o(e,p()(m.c.menuItemDisabled,r.disabledClassName),i),o(e,p()(m.c.menuItemActive,r.visibleClassName),c),o(e,p()(m.c.menuItemSelected,r.selectedClassName),u),e)),onMouseMove:this.props.onMouseMove,onMouseOut:this.props.onMouseOut,onClick:this.handleClick},f={ref:this.subMenuRef,style:{position:"absolute",transition:"opacity 1ms",top:0,left:"100%"},className:p()(m.c.menu,this.props.className)};return s.a.createElement("nav",y({},l,{role:"menuitem",tabIndex:"-1","aria-haspopup":"true"}),s.a.createElement("div",y({},r,d),a),s.a.createElement("nav",y({},f,{role:"menu",tabIndex:"-1"}),this.renderChildren(n)))}}]),t}(b.a);g.propTypes={children:l.a.node.isRequired,attributes:l.a.object,title:l.a.node.isRequired,className:l.a.string,disabled:l.a.bool,hoverDelay:l.a.number,rtl:l.a.bool,selected:l.a.bool,onMouseMove:l.a.func,onMouseOut:l.a.func,forceOpen:l.a.bool,forceClose:l.a.func,parentKeyNavigationHandler:l.a.func},g.defaultProps={disabled:!1,hoverDelay:500,attributes:{},className:"",rtl:!1,selected:!1,onMouseMove:function(){return null},onMouseOut:function(){return null},forceOpen:!1,forceClose:function(){return null},parentKeyNavigationHandler:function(){return null}},t.a=g},function(e,t,n){"use strict";function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(0),u=n.n(a),s=n(2),c=n.n(s),l=n(5),d=n.n(l),p=n(3),f=n.n(p),h=n(4),b=n(1),m=function(){function e(e,t){for(var n=0;n=0&&0===e.button&&(e.persist(),e.stopPropagation(),i.mouseDownTimeoutId=setTimeout(function(){return i.handleContextClick(e)},i.props.holdToDisplay)),Object(b.a)(i.props.attributes.onMouseDown,e)},i.handleMouseUp=function(e){0===e.button&&clearTimeout(i.mouseDownTimeoutId),Object(b.a)(i.props.attributes.onMouseUp,e)},i.handleMouseOut=function(e){0===e.button&&clearTimeout(i.mouseDownTimeoutId),Object(b.a)(i.props.attributes.onMouseOut,e)},i.handleTouchstart=function(e){i.touchHandled=!1,i.props.holdToDisplay>=0&&(e.persist(),e.stopPropagation(),i.touchstartTimeoutId=setTimeout(function(){i.handleContextClick(e),i.touchHandled=!0},i.props.holdToDisplay)),Object(b.a)(i.props.attributes.onTouchStart,e)},i.handleTouchEnd=function(e){i.touchHandled&&e.preventDefault(),clearTimeout(i.touchstartTimeoutId),Object(b.a)(i.props.attributes.onTouchEnd,e)},i.handleContextMenu=function(e){i.handleContextClick(e),Object(b.a)(i.props.attributes.onContextMenu,e)},i.handleContextClick=function(e){if(!i.props.disable){e.preventDefault(),e.stopPropagation();var t=e.clientX||e.touches&&e.touches[0].pageX,n=e.clientY||e.touches&&e.touches[0].pageY;i.props.posX&&(t-=i.props.posX),i.props.posY&&(n-=i.props.posY),Object(h.c)();var o=Object(b.a)(i.props.collect,i.props),r={position:{x:t,y:n},target:i.elem,id:i.props.id,data:o};o&&"function"==typeof o.then?o.then(function(e){r.data=e,Object(h.d)(r)}):Object(h.d)(r)}},i.elemRef=function(e){i.elem=e},a=n,r(i,a)}return i(t,e),m(t,[{key:"render",value:function(){var e=this.props,t=e.renderTag,n=e.attributes,o=e.children,r=f()({},n,{className:d()(b.c.menuWrapper,n.className),onContextMenu:this.handleContextMenu,onMouseDown:this.handleMouseDown,onMouseUp:this.handleMouseUp,onTouchStart:this.handleTouchstart,onTouchEnd:this.handleTouchEnd,onMouseOut:this.handleMouseOut,ref:this.elemRef});return u.a.createElement(t,r,o)}}]),t}(a.Component);v.propTypes={id:c.a.string.isRequired,children:c.a.node.isRequired,attributes:c.a.object,collect:c.a.func,disable:c.a.bool,holdToDisplay:c.a.number,posX:c.a.number,posY:c.a.number,renderTag:c.a.oneOfType([c.a.node,c.a.func])},v.defaultProps={attributes:{},collect:function(){return null},disable:!1,holdToDisplay:1e3,renderTag:"div",posX:0,posY:0},t.a=v},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n(12);n.d(t,"ContextMenu",function(){return o.a});var r=n(10);n.d(t,"ContextMenuTrigger",function(){return r.a});var i=n(8);n.d(t,"MenuItem",function(){return i.a});var a=n(9);n.d(t,"SubMenu",function(){return a.a});var u=n(15);n.d(t,"connectMenu",function(){return u.a});var s=n(4);n.d(t,"hideMenu",function(){return s.c}),n.d(t,"showMenu",function(){return s.d})},function(e,t,n){"use strict";function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var u=n(0),s=n.n(u),c=n(2),l=n.n(c),d=n(5),p=n.n(d),f=n(3),h=n.n(f),b=n(6),m=n(7),v=n(9),y=n(4),O=n(1),g=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o={top:t,left:e};if(!n.menu)return o;var r=window,i=r.innerWidth,a=r.innerHeight,u=n.menu.getBoundingClientRect();return t+u.height>a&&(o.top-=u.height),e+u.width>i&&(o.left-=u.width),o.top<0&&(o.top=u.height 0 && arguments[0] !== undefined ? arguments[0] : 0; - var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - - var menuStyles = { - top: y, - left: x - }; - - if (!_this.menu) return menuStyles; - - var _window = window, - innerWidth = _window.innerWidth, - innerHeight = _window.innerHeight; - - var rect = _this.menu.getBoundingClientRect(); - - if (y + rect.height > innerHeight) { - menuStyles.top -= rect.height; - } - - if (x + rect.width > innerWidth) { - menuStyles.left -= rect.width; - } - - if (menuStyles.top < 0) { - menuStyles.top = rect.height < innerHeight ? (innerHeight - rect.height) / 2 : 0; - } - - if (menuStyles.left < 0) { - menuStyles.left = rect.width < innerWidth ? (innerWidth - rect.width) / 2 : 0; - } - - return menuStyles; - }; - - _this.menuRef = function (c) { - _this.menu = c; - }; - - _this.state = assign({}, _this.state, { - x: 0, - y: 0, - isVisible: false - }); - return _this; - } - - _createClass(ContextMenu, [{ - key: 'getSubMenuType', - value: function getSubMenuType() { - // eslint-disable-line class-methods-use-this - return SubMenu; - } - }, { - key: 'componentDidMount', - value: function componentDidMount() { - this.listenId = listener.register(this.handleShow, this.handleHide); - } - }, { - key: 'componentDidUpdate', - value: function componentDidUpdate() { - var _this2 = this; - - if (this.state.isVisible) { - var wrapper = window.requestAnimationFrame || setTimeout; - - wrapper(function () { - var _state = _this2.state, - x = _state.x, - y = _state.y; - - var _getMenuPosition = _this2.getMenuPosition(x, y), - top = _getMenuPosition.top, - left = _getMenuPosition.left; - - wrapper(function () { - if (!_this2.menu) return; - _this2.menu.style.top = top + 'px'; - _this2.menu.style.left = left + 'px'; - _this2.menu.style.opacity = 1; - _this2.menu.style.pointerEvents = 'auto'; - }); - }); - } else { - if (!this.menu) return; - this.menu.style.opacity = 0; - this.menu.style.pointerEvents = 'none'; - } - } - }, { - key: 'componentWillUnmount', - value: function componentWillUnmount() { - if (this.listenId) { - listener.unregister(this.listenId); - } - - this.unregisterHandlers(); - } - }, { - key: 'render', - value: function render() { - var _props = this.props, - children = _props.children, - className = _props.className, - style = _props.style; - var isVisible = this.state.isVisible; - - var inlineStyle = assign({}, style, { position: 'fixed', opacity: 0, pointerEvents: 'none' }); - var menuClassnames = cx(cssClasses.menu, className, _defineProperty({}, cssClasses.menuVisible, isVisible)); - - return React.createElement( - 'nav', - { - role: 'menu', tabIndex: '-1', ref: this.menuRef, style: inlineStyle, className: menuClassnames, - onContextMenu: this.handleContextMenu, onMouseLeave: this.handleMouseLeave }, - this.renderChildren(children) - ); - } - }]); - - return ContextMenu; -}(AbstractMenu); - -ContextMenu.propTypes = { - id: PropTypes.string.isRequired, - children: PropTypes.node.isRequired, - data: PropTypes.object, - className: PropTypes.string, - hideOnLeave: PropTypes.bool, - onHide: PropTypes.func, - onMouseLeave: PropTypes.func, - onShow: PropTypes.func, - style: PropTypes.object -}; -ContextMenu.defaultProps = { - className: '', - data: {}, - hideOnLeave: false, - onHide: function onHide() { - return null; - }, - onMouseLeave: function onMouseLeave() { - return null; - }, - onShow: function onShow() { - return null; - }, - - style: {} -}; -export default ContextMenu; \ No newline at end of file diff --git a/es6/ContextMenuTrigger.js b/es6/ContextMenuTrigger.js deleted file mode 100644 index 264bc710..00000000 --- a/es6/ContextMenuTrigger.js +++ /dev/null @@ -1,161 +0,0 @@ -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import cx from 'classnames'; -import assign from 'object-assign'; - -import { showMenu, hideMenu } from './actions'; -import { callIfExists, cssClasses } from './helpers'; - -var ContextMenuTrigger = function (_Component) { - _inherits(ContextMenuTrigger, _Component); - - function ContextMenuTrigger() { - var _ref; - - var _temp, _this, _ret; - - _classCallCheck(this, ContextMenuTrigger); - - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = ContextMenuTrigger.__proto__ || Object.getPrototypeOf(ContextMenuTrigger)).call.apply(_ref, [this].concat(args))), _this), _this.touchHandled = false, _this.handleMouseDown = function (event) { - if (_this.props.holdToDisplay >= 0 && event.button === 0) { - event.persist(); - event.stopPropagation(); - - _this.mouseDownTimeoutId = setTimeout(function () { - return _this.handleContextClick(event); - }, _this.props.holdToDisplay); - } - callIfExists(_this.props.attributes.onMouseDown, event); - }, _this.handleMouseUp = function (event) { - if (event.button === 0) { - clearTimeout(_this.mouseDownTimeoutId); - } - callIfExists(_this.props.attributes.onMouseUp, event); - }, _this.handleMouseOut = function (event) { - if (event.button === 0) { - clearTimeout(_this.mouseDownTimeoutId); - } - callIfExists(_this.props.attributes.onMouseOut, event); - }, _this.handleTouchstart = function (event) { - _this.touchHandled = false; - - if (_this.props.holdToDisplay >= 0) { - event.persist(); - event.stopPropagation(); - - _this.touchstartTimeoutId = setTimeout(function () { - _this.handleContextClick(event); - _this.touchHandled = true; - }, _this.props.holdToDisplay); - } - callIfExists(_this.props.attributes.onTouchStart, event); - }, _this.handleTouchEnd = function (event) { - if (_this.touchHandled) { - event.preventDefault(); - } - clearTimeout(_this.touchstartTimeoutId); - callIfExists(_this.props.attributes.onTouchEnd, event); - }, _this.handleContextMenu = function (event) { - _this.handleContextClick(event); - callIfExists(_this.props.attributes.onContextMenu, event); - }, _this.handleContextClick = function (event) { - if (_this.props.disable) return; - - event.preventDefault(); - event.stopPropagation(); - - var x = event.clientX || event.touches && event.touches[0].pageX; - var y = event.clientY || event.touches && event.touches[0].pageY; - - if (_this.props.posX) { - x -= _this.props.posX; - } - if (_this.props.posY) { - y -= _this.props.posY; - } - - hideMenu(); - - var data = callIfExists(_this.props.collect, _this.props); - var showMenuConfig = { - position: { x: x, y: y }, - target: _this.elem, - id: _this.props.id, - data: data - }; - if (data && typeof data.then === 'function') { - // it's promise - data.then(function (resp) { - showMenuConfig.data = resp; - showMenu(showMenuConfig); - }); - } else { - showMenu(showMenuConfig); - } - }, _this.elemRef = function (c) { - _this.elem = c; - }, _temp), _possibleConstructorReturn(_this, _ret); - } - - _createClass(ContextMenuTrigger, [{ - key: 'render', - value: function render() { - var _props = this.props, - renderTag = _props.renderTag, - attributes = _props.attributes, - children = _props.children; - - var newAttrs = assign({}, attributes, { - className: cx(cssClasses.menuWrapper, attributes.className), - onContextMenu: this.handleContextMenu, - onMouseDown: this.handleMouseDown, - onMouseUp: this.handleMouseUp, - onTouchStart: this.handleTouchstart, - onTouchEnd: this.handleTouchEnd, - onMouseOut: this.handleMouseOut, - ref: this.elemRef - }); - - return React.createElement(renderTag, newAttrs, children); - } - }]); - - return ContextMenuTrigger; -}(Component); - -ContextMenuTrigger.propTypes = { - id: PropTypes.string.isRequired, - children: PropTypes.node.isRequired, - attributes: PropTypes.object, - collect: PropTypes.func, - disable: PropTypes.bool, - holdToDisplay: PropTypes.number, - posX: PropTypes.number, - posY: PropTypes.number, - renderTag: PropTypes.oneOfType([PropTypes.node, PropTypes.func]) -}; -ContextMenuTrigger.defaultProps = { - attributes: {}, - collect: function collect() { - return null; - }, - - disable: false, - holdToDisplay: 1000, - renderTag: 'div', - posX: 0, - posY: 0 -}; -export default ContextMenuTrigger; \ No newline at end of file diff --git a/es6/MenuItem.js b/es6/MenuItem.js deleted file mode 100644 index 5e1836d7..00000000 --- a/es6/MenuItem.js +++ /dev/null @@ -1,112 +0,0 @@ -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import cx from 'classnames'; -import assign from 'object-assign'; - -import { hideMenu } from './actions'; -import { callIfExists, cssClasses, store } from './helpers'; - -var MenuItem = function (_Component) { - _inherits(MenuItem, _Component); - - function MenuItem() { - var _ref; - - var _temp, _this, _ret; - - _classCallCheck(this, MenuItem); - - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = MenuItem.__proto__ || Object.getPrototypeOf(MenuItem)).call.apply(_ref, [this].concat(args))), _this), _this.handleClick = function (event) { - event.preventDefault(); - - if (_this.props.disabled || _this.props.divider) return; - - callIfExists(_this.props.onClick, event, assign({}, _this.props.data, store.data), store.target); - - if (_this.props.preventClose) return; - - hideMenu(); - }, _temp), _possibleConstructorReturn(_this, _ret); - } - - _createClass(MenuItem, [{ - key: 'render', - value: function render() { - var _cx, - _this2 = this; - - var _props = this.props, - disabled = _props.disabled, - divider = _props.divider, - children = _props.children, - attributes = _props.attributes, - selected = _props.selected; - - var menuItemClassNames = cx(cssClasses.menuItem, attributes.className, (_cx = {}, _defineProperty(_cx, cx(cssClasses.menuItemDisabled, attributes.disabledClassName), disabled), _defineProperty(_cx, cx(cssClasses.menuItemDivider, attributes.dividerClassName), divider), _defineProperty(_cx, cx(cssClasses.menuItemSelected, attributes.selectedClassName), selected), _cx)); - - return React.createElement( - 'div', - _extends({}, attributes, { className: menuItemClassNames, - role: 'menuitem', tabIndex: '-1', 'aria-disabled': disabled ? 'true' : 'false', - 'aria-orientation': divider ? 'horizontal' : null, - ref: function ref(_ref2) { - _this2.ref = _ref2; - }, - onMouseMove: this.props.onMouseMove, onMouseLeave: this.props.onMouseLeave, - onTouchEnd: this.handleClick, onClick: this.handleClick }), - divider ? null : children - ); - } - }]); - - return MenuItem; -}(Component); - -MenuItem.propTypes = { - children: PropTypes.node, - attributes: PropTypes.object, - data: PropTypes.object, - disabled: PropTypes.bool, - divider: PropTypes.bool, - preventClose: PropTypes.bool, - onClick: PropTypes.func, - selected: PropTypes.bool, - onMouseMove: PropTypes.func, - onMouseLeave: PropTypes.func -}; -MenuItem.defaultProps = { - disabled: false, - data: {}, - divider: false, - attributes: {}, - preventClose: false, - onClick: function onClick() { - return null; - }, - - children: null, - selected: false, - onMouseMove: function onMouseMove() { - return null; - }, - onMouseLeave: function onMouseLeave() { - return null; - } -}; -export default MenuItem; \ No newline at end of file diff --git a/es6/SubMenu.js b/es6/SubMenu.js deleted file mode 100644 index 39f87326..00000000 --- a/es6/SubMenu.js +++ /dev/null @@ -1,311 +0,0 @@ -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -import React from 'react'; -import PropTypes from 'prop-types'; -import cx from 'classnames'; -import assign from 'object-assign'; - -import AbstractMenu from './AbstractMenu'; -import { callIfExists, cssClasses, hasOwnProp, store } from './helpers'; -import listener from './globalEventListener'; - -var SubMenu = function (_AbstractMenu) { - _inherits(SubMenu, _AbstractMenu); - - function SubMenu(props) { - _classCallCheck(this, SubMenu); - - var _this = _possibleConstructorReturn(this, (SubMenu.__proto__ || Object.getPrototypeOf(SubMenu)).call(this, props)); - - _this.getMenuPosition = function () { - var _window = window, - innerWidth = _window.innerWidth, - innerHeight = _window.innerHeight; - - var rect = _this.subMenu.getBoundingClientRect(); - var position = {}; - - if (rect.bottom > innerHeight) { - position.bottom = 0; - } else { - position.top = 0; - } - - if (rect.right < innerWidth) { - position.left = '100%'; - } else { - position.right = '100%'; - } - - return position; - }; - - _this.getRTLMenuPosition = function () { - var _window2 = window, - innerHeight = _window2.innerHeight; - - var rect = _this.subMenu.getBoundingClientRect(); - var position = {}; - - if (rect.bottom > innerHeight) { - position.bottom = 0; - } else { - position.top = 0; - } - - if (rect.left < 0) { - position.left = '100%'; - } else { - position.right = '100%'; - } - - return position; - }; - - _this.hideMenu = function (e) { - // avoid closing submenus of a different menu tree - if (e.detail && e.detail.id && _this.menu && e.detail.id !== _this.menu.id) { - return; - } - - if (_this.props.forceOpen) { - _this.props.forceClose(); - } - _this.setState({ visible: false, selectedItem: null }); - _this.unregisterHandlers(); - }; - - _this.handleClick = function (event) { - event.preventDefault(); - - if (_this.props.disabled) return; - - callIfExists(_this.props.onClick, event, assign({}, _this.props.data, store.data), store.target); - }; - - _this.handleMouseEnter = function () { - if (_this.closetimer) clearTimeout(_this.closetimer); - - if (_this.props.disabled || _this.state.visible) return; - - _this.opentimer = setTimeout(function () { - return _this.setState({ - visible: true, - selectedItem: null - }); - }, _this.props.hoverDelay); - }; - - _this.handleMouseLeave = function () { - if (_this.opentimer) clearTimeout(_this.opentimer); - - if (!_this.state.visible) return; - - _this.closetimer = setTimeout(function () { - return _this.setState({ - visible: false, - selectedItem: null - }); - }, _this.props.hoverDelay); - }; - - _this.menuRef = function (c) { - _this.menu = c; - }; - - _this.subMenuRef = function (c) { - _this.subMenu = c; - }; - - _this.registerHandlers = function () { - document.removeEventListener('keydown', _this.props.parentKeyNavigationHandler); - document.addEventListener('keydown', _this.handleKeyNavigation); - }; - - _this.unregisterHandlers = function (dismounting) { - document.removeEventListener('keydown', _this.handleKeyNavigation); - if (!dismounting) { - document.addEventListener('keydown', _this.props.parentKeyNavigationHandler); - } - }; - - _this.state = assign({}, _this.state, { - visible: false - }); - return _this; - } - - _createClass(SubMenu, [{ - key: 'componentDidMount', - value: function componentDidMount() { - this.listenId = listener.register(function () {}, this.hideMenu); - } - }, { - key: 'getSubMenuType', - value: function getSubMenuType() { - // eslint-disable-line class-methods-use-this - return SubMenu; - } - }, { - key: 'shouldComponentUpdate', - value: function shouldComponentUpdate(nextProps, nextState) { - this.isVisibilityChange = (this.state.visible !== nextState.visible || this.props.forceOpen !== nextProps.forceOpen) && !(this.state.visible && nextProps.forceOpen) && !(this.props.forceOpen && nextState.visible); - return true; - } - }, { - key: 'componentDidUpdate', - value: function componentDidUpdate() { - var _this2 = this; - - if (!this.isVisibilityChange) return; - if (this.props.forceOpen || this.state.visible) { - var wrapper = window.requestAnimationFrame || setTimeout; - wrapper(function () { - var styles = _this2.props.rtl ? _this2.getRTLMenuPosition() : _this2.getMenuPosition(); - - _this2.subMenu.style.removeProperty('top'); - _this2.subMenu.style.removeProperty('bottom'); - _this2.subMenu.style.removeProperty('left'); - _this2.subMenu.style.removeProperty('right'); - - if (hasOwnProp(styles, 'top')) _this2.subMenu.style.top = styles.top; - if (hasOwnProp(styles, 'left')) _this2.subMenu.style.left = styles.left; - if (hasOwnProp(styles, 'bottom')) _this2.subMenu.style.bottom = styles.bottom; - if (hasOwnProp(styles, 'right')) _this2.subMenu.style.right = styles.right; - _this2.subMenu.classList.add(cssClasses.menuVisible); - - _this2.registerHandlers(); - _this2.setState({ selectedItem: null }); - }); - } else { - var cleanup = function cleanup() { - _this2.subMenu.removeEventListener('transitionend', cleanup); - _this2.subMenu.style.removeProperty('bottom'); - _this2.subMenu.style.removeProperty('right'); - _this2.subMenu.style.top = 0; - _this2.subMenu.style.left = '100%'; - _this2.unregisterHandlers(); - }; - this.subMenu.addEventListener('transitionend', cleanup); - this.subMenu.classList.remove(cssClasses.menuVisible); - } - } - }, { - key: 'componentWillUnmount', - value: function componentWillUnmount() { - if (this.listenId) { - listener.unregister(this.listenId); - } - - if (this.opentimer) clearTimeout(this.opentimer); - - if (this.closetimer) clearTimeout(this.closetimer); - - this.unregisterHandlers(true); - } - }, { - key: 'render', - value: function render() { - var _cx; - - var _props = this.props, - children = _props.children, - attributes = _props.attributes, - disabled = _props.disabled, - title = _props.title, - selected = _props.selected; - var visible = this.state.visible; - - var menuProps = { - ref: this.menuRef, - onMouseEnter: this.handleMouseEnter, - onMouseLeave: this.handleMouseLeave, - className: cx(cssClasses.menuItem, cssClasses.subMenu, attributes.listClassName), - style: { - position: 'relative' - } - }; - var menuItemProps = { - className: cx(cssClasses.menuItem, attributes.className, (_cx = {}, _defineProperty(_cx, cx(cssClasses.menuItemDisabled, attributes.disabledClassName), disabled), _defineProperty(_cx, cx(cssClasses.menuItemActive, attributes.visibleClassName), visible), _defineProperty(_cx, cx(cssClasses.menuItemSelected, attributes.selectedClassName), selected), _cx)), - onMouseMove: this.props.onMouseMove, - onMouseOut: this.props.onMouseOut, - onClick: this.handleClick - }; - var subMenuProps = { - ref: this.subMenuRef, - style: { - position: 'absolute', - transition: 'opacity 1ms', // trigger transitionend event - top: 0, - left: '100%' - }, - className: cx(cssClasses.menu, this.props.className) - }; - - return React.createElement( - 'nav', - _extends({}, menuProps, { role: 'menuitem', tabIndex: '-1', 'aria-haspopup': 'true' }), - React.createElement( - 'div', - _extends({}, attributes, menuItemProps), - title - ), - React.createElement( - 'nav', - _extends({}, subMenuProps, { role: 'menu', tabIndex: '-1' }), - this.renderChildren(children) - ) - ); - } - }]); - - return SubMenu; -}(AbstractMenu); - -SubMenu.propTypes = { - children: PropTypes.node.isRequired, - attributes: PropTypes.object, - title: PropTypes.node.isRequired, - className: PropTypes.string, - disabled: PropTypes.bool, - hoverDelay: PropTypes.number, - rtl: PropTypes.bool, - selected: PropTypes.bool, - onMouseMove: PropTypes.func, - onMouseOut: PropTypes.func, - forceOpen: PropTypes.bool, - forceClose: PropTypes.func, - parentKeyNavigationHandler: PropTypes.func -}; -SubMenu.defaultProps = { - disabled: false, - hoverDelay: 500, - attributes: {}, - className: '', - rtl: false, - selected: false, - onMouseMove: function onMouseMove() { - return null; - }, - onMouseOut: function onMouseOut() { - return null; - }, - forceOpen: false, - forceClose: function forceClose() { - return null; - }, - parentKeyNavigationHandler: function parentKeyNavigationHandler() { - return null; - } -}; -export default SubMenu; \ No newline at end of file diff --git a/es6/actions.js b/es6/actions.js deleted file mode 100644 index fdee9e67..00000000 --- a/es6/actions.js +++ /dev/null @@ -1,40 +0,0 @@ -import assign from 'object-assign'; - -import { store } from './helpers'; - -export var MENU_SHOW = 'REACT_CONTEXTMENU_SHOW'; -export var MENU_HIDE = 'REACT_CONTEXTMENU_HIDE'; - -export function dispatchGlobalEvent(eventName, opts) { - var target = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : window; - - // Compatibale with IE - // @see http://stackoverflow.com/questions/26596123/internet-explorer-9-10-11-event-constructor-doesnt-work - var event = void 0; - - if (typeof window.CustomEvent === 'function') { - event = new window.CustomEvent(eventName, { detail: opts }); - } else { - event = document.createEvent('CustomEvent'); - event.initCustomEvent(eventName, false, true, opts); - } - - if (target) { - target.dispatchEvent(event); - assign(store, opts); - } -} - -export function showMenu() { - var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var target = arguments[1]; - - dispatchGlobalEvent(MENU_SHOW, assign({}, opts, { type: MENU_SHOW }), target); -} - -export function hideMenu() { - var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var target = arguments[1]; - - dispatchGlobalEvent(MENU_HIDE, assign({}, opts, { type: MENU_HIDE }), target); -} \ No newline at end of file diff --git a/es6/connectMenu.js b/es6/connectMenu.js deleted file mode 100644 index f879bb75..00000000 --- a/es6/connectMenu.js +++ /dev/null @@ -1,82 +0,0 @@ -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - -import React, { Component } from 'react'; - -import ContextMenuTrigger from './ContextMenuTrigger'; -import listener from './globalEventListener'; - -// collect ContextMenuTrigger's expected props to NOT pass them on as part of the context -var ignoredTriggerProps = [].concat(_toConsumableArray(Object.keys(ContextMenuTrigger.propTypes)), ['children']); - -// expect the id of the menu to be responsible for as outer parameter -export default function (menuId) { - // expect menu component to connect as inner parameter - // is presumably a wrapper of - return function (Child) { - // return wrapper for that forwards the ContextMenuTrigger's additional props - return function (_Component) { - _inherits(ConnectMenu, _Component); - - function ConnectMenu(props) { - _classCallCheck(this, ConnectMenu); - - var _this = _possibleConstructorReturn(this, (ConnectMenu.__proto__ || Object.getPrototypeOf(ConnectMenu)).call(this, props)); - - _this.handleShow = function (e) { - if (e.detail.id !== menuId) return; - - // the onShow event's detail.data object holds all ContextMenuTrigger props - var data = e.detail.data; - - var filteredData = {}; - - for (var key in data) { - // exclude props the ContextMenuTrigger is expecting itself - if (!ignoredTriggerProps.includes(key)) { - filteredData[key] = data[key]; - } - } - _this.setState({ trigger: filteredData }); - }; - - _this.handleHide = function () { - _this.setState({ trigger: null }); - }; - - _this.state = { trigger: null }; - return _this; - } - - _createClass(ConnectMenu, [{ - key: 'componentDidMount', - value: function componentDidMount() { - this.listenId = listener.register(this.handleShow, this.handleHide); - } - }, { - key: 'componentWillUnmount', - value: function componentWillUnmount() { - if (this.listenId) { - listener.unregister(this.listenId); - } - } - }, { - key: 'render', - value: function render() { - return React.createElement(Child, _extends({}, this.props, { id: menuId, trigger: this.state.trigger })); - } - }]); - - return ConnectMenu; - }(Component); - }; -} \ No newline at end of file diff --git a/es6/globalEventListener.js b/es6/globalEventListener.js deleted file mode 100644 index 03492f0d..00000000 --- a/es6/globalEventListener.js +++ /dev/null @@ -1,48 +0,0 @@ -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -import { MENU_SHOW, MENU_HIDE } from './actions'; -import { uniqueId, hasOwnProp, canUseDOM } from './helpers'; - -var GlobalEventListener = function GlobalEventListener() { - var _this = this; - - _classCallCheck(this, GlobalEventListener); - - this.handleShowEvent = function (event) { - for (var id in _this.callbacks) { - if (hasOwnProp(_this.callbacks, id)) _this.callbacks[id].show(event); - } - }; - - this.handleHideEvent = function (event) { - for (var id in _this.callbacks) { - if (hasOwnProp(_this.callbacks, id)) _this.callbacks[id].hide(event); - } - }; - - this.register = function (showCallback, hideCallback) { - var id = uniqueId(); - - _this.callbacks[id] = { - show: showCallback, - hide: hideCallback - }; - - return id; - }; - - this.unregister = function (id) { - if (id && _this.callbacks[id]) { - delete _this.callbacks[id]; - } - }; - - this.callbacks = {}; - - if (canUseDOM) { - window.addEventListener(MENU_SHOW, this.handleShowEvent); - window.addEventListener(MENU_HIDE, this.handleHideEvent); - } -}; - -export default new GlobalEventListener(); \ No newline at end of file diff --git a/es6/helpers.js b/es6/helpers.js deleted file mode 100644 index 1b1e6b92..00000000 --- a/es6/helpers.js +++ /dev/null @@ -1,31 +0,0 @@ -export function callIfExists(func) { - for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - - return typeof func === 'function' && func.apply(undefined, args); -} - -export function hasOwnProp(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} - -export function uniqueId() { - return Math.random().toString(36).substring(7); -} - -export var cssClasses = { - menu: 'react-contextmenu', - menuVisible: 'react-contextmenu--visible', - menuWrapper: 'react-contextmenu-wrapper', - menuItem: 'react-contextmenu-item', - menuItemActive: 'react-contextmenu-item--active', - menuItemDisabled: 'react-contextmenu-item--disabled', - menuItemDivider: 'react-contextmenu-item--divider', - menuItemSelected: 'react-contextmenu-item--selected', - subMenu: 'react-contextmenu-submenu' -}; - -export var store = {}; - -export var canUseDOM = Boolean(typeof window !== 'undefined' && window.document && window.document.createElement); \ No newline at end of file diff --git a/es6/index.js b/es6/index.js deleted file mode 100644 index 623c1d2a..00000000 --- a/es6/index.js +++ /dev/null @@ -1,6 +0,0 @@ -export { default as ContextMenu } from './ContextMenu'; -export { default as ContextMenuTrigger } from './ContextMenuTrigger'; -export { default as MenuItem } from './MenuItem'; -export { default as SubMenu } from './SubMenu'; -export { default as connectMenu } from './connectMenu'; -export { hideMenu, showMenu } from './actions'; \ No newline at end of file diff --git a/modules/AbstractMenu.js b/modules/AbstractMenu.js deleted file mode 100644 index b229c74e..00000000 --- a/modules/AbstractMenu.js +++ /dev/null @@ -1,195 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _react = require('react'); - -var _react2 = _interopRequireDefault(_react); - -var _propTypes = require('prop-types'); - -var _propTypes2 = _interopRequireDefault(_propTypes); - -var _MenuItem = require('./MenuItem'); - -var _MenuItem2 = _interopRequireDefault(_MenuItem); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var AbstractMenu = function (_Component) { - _inherits(AbstractMenu, _Component); - - function AbstractMenu(props) { - _classCallCheck(this, AbstractMenu); - - var _this = _possibleConstructorReturn(this, (AbstractMenu.__proto__ || Object.getPrototypeOf(AbstractMenu)).call(this, props)); - - _initialiseProps.call(_this); - - _this.seletedItemRef = null; - _this.state = { - selectedItem: null, - forceSubMenuOpen: false - }; - return _this; - } - - return AbstractMenu; -}(_react.Component); - -AbstractMenu.propTypes = { - children: _propTypes2.default.node.isRequired -}; - -var _initialiseProps = function _initialiseProps() { - var _this2 = this; - - this.handleKeyNavigation = function (e) { - // check for isVisible strictly here as it might be undefined when this code executes in the context of SubMenu - // but we only need to check when it runs in the ContextMenu context - if (_this2.state.isVisible === false) { - return; - } - - switch (e.keyCode) { - case 37: // left arrow - case 27: - // escape - e.preventDefault(); - _this2.hideMenu(e); - break; - case 38: - // up arrow - e.preventDefault(); - _this2.selectChildren(true); - break; - case 40: - // down arrow - e.preventDefault(); - _this2.selectChildren(false); - break; - case 39: - // right arrow - _this2.tryToOpenSubMenu(e); - break; - case 13: - // enter - e.preventDefault(); - _this2.tryToOpenSubMenu(e); - { - // determine the selected item is disabled or not - var disabled = _this2.seletedItemRef && _this2.seletedItemRef.props && _this2.seletedItemRef.props.disabled; - - if (_this2.seletedItemRef && _this2.seletedItemRef.ref instanceof HTMLElement && !disabled) { - _this2.seletedItemRef.ref.click(); - } else { - _this2.hideMenu(e); - } - } - break; - default: - // do nothing - } - }; - - this.handleForceClose = function () { - _this2.setState({ forceSubMenuOpen: false }); - }; - - this.tryToOpenSubMenu = function (e) { - if (_this2.state.selectedItem && _this2.state.selectedItem.type === _this2.getSubMenuType()) { - e.preventDefault(); - _this2.setState({ forceSubMenuOpen: true }); - } - }; - - this.selectChildren = function (forward) { - var selectedItem = _this2.state.selectedItem; - - var children = []; - var childCollector = function childCollector(child) { - // child can be empty in case you do conditional rendering of components, in which - // case it should not be accounted for as a real child - if (!child) { - return; - } - - if ([_MenuItem2.default, _this2.getSubMenuType()].indexOf(child.type) < 0) { - // Maybe the MenuItem or SubMenu is capsuled in a wrapper div or something else - _react2.default.Children.forEach(child.props.children, childCollector); - } else if (!child.props.divider) { - children.push(child); - } - }; - _react2.default.Children.forEach(_this2.props.children, childCollector); - var currentIndex = children.indexOf(selectedItem); - if (currentIndex < 0) { - _this2.setState({ - selectedItem: forward ? children[children.length - 1] : children[0], - forceSubMenuOpen: false - }); - } else if (forward) { - _this2.setState({ - selectedItem: children[currentIndex - 1 < 0 ? children.length - 1 : currentIndex - 1], - forceSubMenuOpen: false - }); - } else { - _this2.setState({ - selectedItem: children[currentIndex + 1 < children.length ? currentIndex + 1 : 0], - forceSubMenuOpen: false - }); - } - }; - - this.onChildMouseMove = function (child) { - if (_this2.state.selectedItem !== child) { - _this2.setState({ selectedItem: child, forceSubMenuOpen: false }); - } - }; - - this.onChildMouseLeave = function () { - _this2.setState({ selectedItem: null, forceSubMenuOpen: false }); - }; - - this.renderChildren = function (children) { - return _react2.default.Children.map(children, function (child) { - var props = {}; - if (!_react2.default.isValidElement(child)) return child; - if ([_MenuItem2.default, _this2.getSubMenuType()].indexOf(child.type) < 0) { - // Maybe the MenuItem or SubMenu is capsuled in a wrapper div or something else - props.children = _this2.renderChildren(child.props.children); - return _react2.default.cloneElement(child, props); - } - props.onMouseLeave = _this2.onChildMouseLeave.bind(_this2); - if (child.type === _this2.getSubMenuType()) { - // special props for SubMenu only - props.forceOpen = _this2.state.forceSubMenuOpen && _this2.state.selectedItem === child; - props.forceClose = _this2.handleForceClose; - props.parentKeyNavigationHandler = _this2.handleKeyNavigation; - } - if (!child.props.divider && _this2.state.selectedItem === child) { - // special props for selected item only - props.selected = true; - props.ref = function (ref) { - _this2.seletedItemRef = ref; - }; - return _react2.default.cloneElement(child, props); - } - // onMouseMove is only needed for non selected items - props.onMouseMove = function () { - return _this2.onChildMouseMove(child); - }; - return _react2.default.cloneElement(child, props); - }); - }; -}; - -exports.default = AbstractMenu; \ No newline at end of file diff --git a/modules/ContextMenu.js b/modules/ContextMenu.js deleted file mode 100644 index 15b962f6..00000000 --- a/modules/ContextMenu.js +++ /dev/null @@ -1,275 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = require('react'); - -var _react2 = _interopRequireDefault(_react); - -var _propTypes = require('prop-types'); - -var _propTypes2 = _interopRequireDefault(_propTypes); - -var _classnames = require('classnames'); - -var _classnames2 = _interopRequireDefault(_classnames); - -var _objectAssign = require('object-assign'); - -var _objectAssign2 = _interopRequireDefault(_objectAssign); - -var _globalEventListener = require('./globalEventListener'); - -var _globalEventListener2 = _interopRequireDefault(_globalEventListener); - -var _AbstractMenu2 = require('./AbstractMenu'); - -var _AbstractMenu3 = _interopRequireDefault(_AbstractMenu2); - -var _SubMenu = require('./SubMenu'); - -var _SubMenu2 = _interopRequireDefault(_SubMenu); - -var _actions = require('./actions'); - -var _helpers = require('./helpers'); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var ContextMenu = function (_AbstractMenu) { - _inherits(ContextMenu, _AbstractMenu); - - function ContextMenu(props) { - _classCallCheck(this, ContextMenu); - - var _this = _possibleConstructorReturn(this, (ContextMenu.__proto__ || Object.getPrototypeOf(ContextMenu)).call(this, props)); - - _this.registerHandlers = function () { - document.addEventListener('mousedown', _this.handleOutsideClick); - document.addEventListener('touchstart', _this.handleOutsideClick); - document.addEventListener('scroll', _this.handleHide); - document.addEventListener('contextmenu', _this.handleHide); - document.addEventListener('keydown', _this.handleKeyNavigation); - window.addEventListener('resize', _this.handleHide); - }; - - _this.unregisterHandlers = function () { - document.removeEventListener('mousedown', _this.handleOutsideClick); - document.removeEventListener('touchstart', _this.handleOutsideClick); - document.removeEventListener('scroll', _this.handleHide); - document.removeEventListener('contextmenu', _this.handleHide); - document.removeEventListener('keydown', _this.handleKeyNavigation); - window.removeEventListener('resize', _this.handleHide); - }; - - _this.handleShow = function (e) { - if (e.detail.id !== _this.props.id || _this.state.isVisible) return; - - var _e$detail$position = e.detail.position, - x = _e$detail$position.x, - y = _e$detail$position.y; - - - _this.setState({ isVisible: true, x: x, y: y }); - _this.registerHandlers(); - (0, _helpers.callIfExists)(_this.props.onShow, e); - }; - - _this.handleHide = function (e) { - if (_this.state.isVisible && (!e.detail || !e.detail.id || e.detail.id === _this.props.id)) { - _this.unregisterHandlers(); - _this.setState({ isVisible: false, selectedItem: null, forceSubMenuOpen: false }); - (0, _helpers.callIfExists)(_this.props.onHide, e); - } - }; - - _this.handleOutsideClick = function (e) { - if (!_this.menu.contains(e.target)) (0, _actions.hideMenu)(); - }; - - _this.handleMouseLeave = function (event) { - event.preventDefault(); - - (0, _helpers.callIfExists)(_this.props.onMouseLeave, event, (0, _objectAssign2.default)({}, _this.props.data, _helpers.store.data), _helpers.store.target); - - if (_this.props.hideOnLeave) (0, _actions.hideMenu)(); - }; - - _this.handleContextMenu = function (e) { - if (process.env.NODE_ENV === 'production') { - e.preventDefault(); - } - _this.handleHide(e); - }; - - _this.hideMenu = function (e) { - if (e.keyCode === 27 || e.keyCode === 13) { - // ECS or enter - (0, _actions.hideMenu)(); - } - }; - - _this.getMenuPosition = function () { - var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; - var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - - var menuStyles = { - top: y, - left: x - }; - - if (!_this.menu) return menuStyles; - - var _window = window, - innerWidth = _window.innerWidth, - innerHeight = _window.innerHeight; - - var rect = _this.menu.getBoundingClientRect(); - - if (y + rect.height > innerHeight) { - menuStyles.top -= rect.height; - } - - if (x + rect.width > innerWidth) { - menuStyles.left -= rect.width; - } - - if (menuStyles.top < 0) { - menuStyles.top = rect.height < innerHeight ? (innerHeight - rect.height) / 2 : 0; - } - - if (menuStyles.left < 0) { - menuStyles.left = rect.width < innerWidth ? (innerWidth - rect.width) / 2 : 0; - } - - return menuStyles; - }; - - _this.menuRef = function (c) { - _this.menu = c; - }; - - _this.state = (0, _objectAssign2.default)({}, _this.state, { - x: 0, - y: 0, - isVisible: false - }); - return _this; - } - - _createClass(ContextMenu, [{ - key: 'getSubMenuType', - value: function getSubMenuType() { - // eslint-disable-line class-methods-use-this - return _SubMenu2.default; - } - }, { - key: 'componentDidMount', - value: function componentDidMount() { - this.listenId = _globalEventListener2.default.register(this.handleShow, this.handleHide); - } - }, { - key: 'componentDidUpdate', - value: function componentDidUpdate() { - var _this2 = this; - - if (this.state.isVisible) { - var wrapper = window.requestAnimationFrame || setTimeout; - - wrapper(function () { - var _state = _this2.state, - x = _state.x, - y = _state.y; - - var _getMenuPosition = _this2.getMenuPosition(x, y), - top = _getMenuPosition.top, - left = _getMenuPosition.left; - - wrapper(function () { - if (!_this2.menu) return; - _this2.menu.style.top = top + 'px'; - _this2.menu.style.left = left + 'px'; - _this2.menu.style.opacity = 1; - _this2.menu.style.pointerEvents = 'auto'; - }); - }); - } else { - if (!this.menu) return; - this.menu.style.opacity = 0; - this.menu.style.pointerEvents = 'none'; - } - } - }, { - key: 'componentWillUnmount', - value: function componentWillUnmount() { - if (this.listenId) { - _globalEventListener2.default.unregister(this.listenId); - } - - this.unregisterHandlers(); - } - }, { - key: 'render', - value: function render() { - var _props = this.props, - children = _props.children, - className = _props.className, - style = _props.style; - var isVisible = this.state.isVisible; - - var inlineStyle = (0, _objectAssign2.default)({}, style, { position: 'fixed', opacity: 0, pointerEvents: 'none' }); - var menuClassnames = (0, _classnames2.default)(_helpers.cssClasses.menu, className, _defineProperty({}, _helpers.cssClasses.menuVisible, isVisible)); - - return _react2.default.createElement( - 'nav', - { - role: 'menu', tabIndex: '-1', ref: this.menuRef, style: inlineStyle, className: menuClassnames, - onContextMenu: this.handleContextMenu, onMouseLeave: this.handleMouseLeave }, - this.renderChildren(children) - ); - } - }]); - - return ContextMenu; -}(_AbstractMenu3.default); - -ContextMenu.propTypes = { - id: _propTypes2.default.string.isRequired, - children: _propTypes2.default.node.isRequired, - data: _propTypes2.default.object, - className: _propTypes2.default.string, - hideOnLeave: _propTypes2.default.bool, - onHide: _propTypes2.default.func, - onMouseLeave: _propTypes2.default.func, - onShow: _propTypes2.default.func, - style: _propTypes2.default.object -}; -ContextMenu.defaultProps = { - className: '', - data: {}, - hideOnLeave: false, - onHide: function onHide() { - return null; - }, - onMouseLeave: function onMouseLeave() { - return null; - }, - onShow: function onShow() { - return null; - }, - - style: {} -}; -exports.default = ContextMenu; \ No newline at end of file diff --git a/modules/ContextMenuTrigger.js b/modules/ContextMenuTrigger.js deleted file mode 100644 index e705f1f4..00000000 --- a/modules/ContextMenuTrigger.js +++ /dev/null @@ -1,181 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = require('react'); - -var _react2 = _interopRequireDefault(_react); - -var _propTypes = require('prop-types'); - -var _propTypes2 = _interopRequireDefault(_propTypes); - -var _classnames = require('classnames'); - -var _classnames2 = _interopRequireDefault(_classnames); - -var _objectAssign = require('object-assign'); - -var _objectAssign2 = _interopRequireDefault(_objectAssign); - -var _actions = require('./actions'); - -var _helpers = require('./helpers'); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var ContextMenuTrigger = function (_Component) { - _inherits(ContextMenuTrigger, _Component); - - function ContextMenuTrigger() { - var _ref; - - var _temp, _this, _ret; - - _classCallCheck(this, ContextMenuTrigger); - - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = ContextMenuTrigger.__proto__ || Object.getPrototypeOf(ContextMenuTrigger)).call.apply(_ref, [this].concat(args))), _this), _this.touchHandled = false, _this.handleMouseDown = function (event) { - if (_this.props.holdToDisplay >= 0 && event.button === 0) { - event.persist(); - event.stopPropagation(); - - _this.mouseDownTimeoutId = setTimeout(function () { - return _this.handleContextClick(event); - }, _this.props.holdToDisplay); - } - (0, _helpers.callIfExists)(_this.props.attributes.onMouseDown, event); - }, _this.handleMouseUp = function (event) { - if (event.button === 0) { - clearTimeout(_this.mouseDownTimeoutId); - } - (0, _helpers.callIfExists)(_this.props.attributes.onMouseUp, event); - }, _this.handleMouseOut = function (event) { - if (event.button === 0) { - clearTimeout(_this.mouseDownTimeoutId); - } - (0, _helpers.callIfExists)(_this.props.attributes.onMouseOut, event); - }, _this.handleTouchstart = function (event) { - _this.touchHandled = false; - - if (_this.props.holdToDisplay >= 0) { - event.persist(); - event.stopPropagation(); - - _this.touchstartTimeoutId = setTimeout(function () { - _this.handleContextClick(event); - _this.touchHandled = true; - }, _this.props.holdToDisplay); - } - (0, _helpers.callIfExists)(_this.props.attributes.onTouchStart, event); - }, _this.handleTouchEnd = function (event) { - if (_this.touchHandled) { - event.preventDefault(); - } - clearTimeout(_this.touchstartTimeoutId); - (0, _helpers.callIfExists)(_this.props.attributes.onTouchEnd, event); - }, _this.handleContextMenu = function (event) { - _this.handleContextClick(event); - (0, _helpers.callIfExists)(_this.props.attributes.onContextMenu, event); - }, _this.handleContextClick = function (event) { - if (_this.props.disable) return; - - event.preventDefault(); - event.stopPropagation(); - - var x = event.clientX || event.touches && event.touches[0].pageX; - var y = event.clientY || event.touches && event.touches[0].pageY; - - if (_this.props.posX) { - x -= _this.props.posX; - } - if (_this.props.posY) { - y -= _this.props.posY; - } - - (0, _actions.hideMenu)(); - - var data = (0, _helpers.callIfExists)(_this.props.collect, _this.props); - var showMenuConfig = { - position: { x: x, y: y }, - target: _this.elem, - id: _this.props.id, - data: data - }; - if (data && typeof data.then === 'function') { - // it's promise - data.then(function (resp) { - showMenuConfig.data = resp; - (0, _actions.showMenu)(showMenuConfig); - }); - } else { - (0, _actions.showMenu)(showMenuConfig); - } - }, _this.elemRef = function (c) { - _this.elem = c; - }, _temp), _possibleConstructorReturn(_this, _ret); - } - - _createClass(ContextMenuTrigger, [{ - key: 'render', - value: function render() { - var _props = this.props, - renderTag = _props.renderTag, - attributes = _props.attributes, - children = _props.children; - - var newAttrs = (0, _objectAssign2.default)({}, attributes, { - className: (0, _classnames2.default)(_helpers.cssClasses.menuWrapper, attributes.className), - onContextMenu: this.handleContextMenu, - onMouseDown: this.handleMouseDown, - onMouseUp: this.handleMouseUp, - onTouchStart: this.handleTouchstart, - onTouchEnd: this.handleTouchEnd, - onMouseOut: this.handleMouseOut, - ref: this.elemRef - }); - - return _react2.default.createElement(renderTag, newAttrs, children); - } - }]); - - return ContextMenuTrigger; -}(_react.Component); - -ContextMenuTrigger.propTypes = { - id: _propTypes2.default.string.isRequired, - children: _propTypes2.default.node.isRequired, - attributes: _propTypes2.default.object, - collect: _propTypes2.default.func, - disable: _propTypes2.default.bool, - holdToDisplay: _propTypes2.default.number, - posX: _propTypes2.default.number, - posY: _propTypes2.default.number, - renderTag: _propTypes2.default.oneOfType([_propTypes2.default.node, _propTypes2.default.func]) -}; -ContextMenuTrigger.defaultProps = { - attributes: {}, - collect: function collect() { - return null; - }, - - disable: false, - holdToDisplay: 1000, - renderTag: 'div', - posX: 0, - posY: 0 -}; -exports.default = ContextMenuTrigger; \ No newline at end of file diff --git a/modules/MenuItem.js b/modules/MenuItem.js deleted file mode 100644 index f1da29e4..00000000 --- a/modules/MenuItem.js +++ /dev/null @@ -1,132 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = require('react'); - -var _react2 = _interopRequireDefault(_react); - -var _propTypes = require('prop-types'); - -var _propTypes2 = _interopRequireDefault(_propTypes); - -var _classnames = require('classnames'); - -var _classnames2 = _interopRequireDefault(_classnames); - -var _objectAssign = require('object-assign'); - -var _objectAssign2 = _interopRequireDefault(_objectAssign); - -var _actions = require('./actions'); - -var _helpers = require('./helpers'); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var MenuItem = function (_Component) { - _inherits(MenuItem, _Component); - - function MenuItem() { - var _ref; - - var _temp, _this, _ret; - - _classCallCheck(this, MenuItem); - - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = MenuItem.__proto__ || Object.getPrototypeOf(MenuItem)).call.apply(_ref, [this].concat(args))), _this), _this.handleClick = function (event) { - event.preventDefault(); - - if (_this.props.disabled || _this.props.divider) return; - - (0, _helpers.callIfExists)(_this.props.onClick, event, (0, _objectAssign2.default)({}, _this.props.data, _helpers.store.data), _helpers.store.target); - - if (_this.props.preventClose) return; - - (0, _actions.hideMenu)(); - }, _temp), _possibleConstructorReturn(_this, _ret); - } - - _createClass(MenuItem, [{ - key: 'render', - value: function render() { - var _cx, - _this2 = this; - - var _props = this.props, - disabled = _props.disabled, - divider = _props.divider, - children = _props.children, - attributes = _props.attributes, - selected = _props.selected; - - var menuItemClassNames = (0, _classnames2.default)(_helpers.cssClasses.menuItem, attributes.className, (_cx = {}, _defineProperty(_cx, (0, _classnames2.default)(_helpers.cssClasses.menuItemDisabled, attributes.disabledClassName), disabled), _defineProperty(_cx, (0, _classnames2.default)(_helpers.cssClasses.menuItemDivider, attributes.dividerClassName), divider), _defineProperty(_cx, (0, _classnames2.default)(_helpers.cssClasses.menuItemSelected, attributes.selectedClassName), selected), _cx)); - - return _react2.default.createElement( - 'div', - _extends({}, attributes, { className: menuItemClassNames, - role: 'menuitem', tabIndex: '-1', 'aria-disabled': disabled ? 'true' : 'false', - 'aria-orientation': divider ? 'horizontal' : null, - ref: function ref(_ref2) { - _this2.ref = _ref2; - }, - onMouseMove: this.props.onMouseMove, onMouseLeave: this.props.onMouseLeave, - onTouchEnd: this.handleClick, onClick: this.handleClick }), - divider ? null : children - ); - } - }]); - - return MenuItem; -}(_react.Component); - -MenuItem.propTypes = { - children: _propTypes2.default.node, - attributes: _propTypes2.default.object, - data: _propTypes2.default.object, - disabled: _propTypes2.default.bool, - divider: _propTypes2.default.bool, - preventClose: _propTypes2.default.bool, - onClick: _propTypes2.default.func, - selected: _propTypes2.default.bool, - onMouseMove: _propTypes2.default.func, - onMouseLeave: _propTypes2.default.func -}; -MenuItem.defaultProps = { - disabled: false, - data: {}, - divider: false, - attributes: {}, - preventClose: false, - onClick: function onClick() { - return null; - }, - - children: null, - selected: false, - onMouseMove: function onMouseMove() { - return null; - }, - onMouseLeave: function onMouseLeave() { - return null; - } -}; -exports.default = MenuItem; \ No newline at end of file diff --git a/modules/SubMenu.js b/modules/SubMenu.js deleted file mode 100644 index 3eb1d4eb..00000000 --- a/modules/SubMenu.js +++ /dev/null @@ -1,336 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = require('react'); - -var _react2 = _interopRequireDefault(_react); - -var _propTypes = require('prop-types'); - -var _propTypes2 = _interopRequireDefault(_propTypes); - -var _classnames = require('classnames'); - -var _classnames2 = _interopRequireDefault(_classnames); - -var _objectAssign = require('object-assign'); - -var _objectAssign2 = _interopRequireDefault(_objectAssign); - -var _AbstractMenu2 = require('./AbstractMenu'); - -var _AbstractMenu3 = _interopRequireDefault(_AbstractMenu2); - -var _helpers = require('./helpers'); - -var _globalEventListener = require('./globalEventListener'); - -var _globalEventListener2 = _interopRequireDefault(_globalEventListener); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var SubMenu = function (_AbstractMenu) { - _inherits(SubMenu, _AbstractMenu); - - function SubMenu(props) { - _classCallCheck(this, SubMenu); - - var _this = _possibleConstructorReturn(this, (SubMenu.__proto__ || Object.getPrototypeOf(SubMenu)).call(this, props)); - - _this.getMenuPosition = function () { - var _window = window, - innerWidth = _window.innerWidth, - innerHeight = _window.innerHeight; - - var rect = _this.subMenu.getBoundingClientRect(); - var position = {}; - - if (rect.bottom > innerHeight) { - position.bottom = 0; - } else { - position.top = 0; - } - - if (rect.right < innerWidth) { - position.left = '100%'; - } else { - position.right = '100%'; - } - - return position; - }; - - _this.getRTLMenuPosition = function () { - var _window2 = window, - innerHeight = _window2.innerHeight; - - var rect = _this.subMenu.getBoundingClientRect(); - var position = {}; - - if (rect.bottom > innerHeight) { - position.bottom = 0; - } else { - position.top = 0; - } - - if (rect.left < 0) { - position.left = '100%'; - } else { - position.right = '100%'; - } - - return position; - }; - - _this.hideMenu = function (e) { - // avoid closing submenus of a different menu tree - if (e.detail && e.detail.id && _this.menu && e.detail.id !== _this.menu.id) { - return; - } - - if (_this.props.forceOpen) { - _this.props.forceClose(); - } - _this.setState({ visible: false, selectedItem: null }); - _this.unregisterHandlers(); - }; - - _this.handleClick = function (event) { - event.preventDefault(); - - if (_this.props.disabled) return; - - (0, _helpers.callIfExists)(_this.props.onClick, event, (0, _objectAssign2.default)({}, _this.props.data, _helpers.store.data), _helpers.store.target); - }; - - _this.handleMouseEnter = function () { - if (_this.closetimer) clearTimeout(_this.closetimer); - - if (_this.props.disabled || _this.state.visible) return; - - _this.opentimer = setTimeout(function () { - return _this.setState({ - visible: true, - selectedItem: null - }); - }, _this.props.hoverDelay); - }; - - _this.handleMouseLeave = function () { - if (_this.opentimer) clearTimeout(_this.opentimer); - - if (!_this.state.visible) return; - - _this.closetimer = setTimeout(function () { - return _this.setState({ - visible: false, - selectedItem: null - }); - }, _this.props.hoverDelay); - }; - - _this.menuRef = function (c) { - _this.menu = c; - }; - - _this.subMenuRef = function (c) { - _this.subMenu = c; - }; - - _this.registerHandlers = function () { - document.removeEventListener('keydown', _this.props.parentKeyNavigationHandler); - document.addEventListener('keydown', _this.handleKeyNavigation); - }; - - _this.unregisterHandlers = function (dismounting) { - document.removeEventListener('keydown', _this.handleKeyNavigation); - if (!dismounting) { - document.addEventListener('keydown', _this.props.parentKeyNavigationHandler); - } - }; - - _this.state = (0, _objectAssign2.default)({}, _this.state, { - visible: false - }); - return _this; - } - - _createClass(SubMenu, [{ - key: 'componentDidMount', - value: function componentDidMount() { - this.listenId = _globalEventListener2.default.register(function () {}, this.hideMenu); - } - }, { - key: 'getSubMenuType', - value: function getSubMenuType() { - // eslint-disable-line class-methods-use-this - return SubMenu; - } - }, { - key: 'shouldComponentUpdate', - value: function shouldComponentUpdate(nextProps, nextState) { - this.isVisibilityChange = (this.state.visible !== nextState.visible || this.props.forceOpen !== nextProps.forceOpen) && !(this.state.visible && nextProps.forceOpen) && !(this.props.forceOpen && nextState.visible); - return true; - } - }, { - key: 'componentDidUpdate', - value: function componentDidUpdate() { - var _this2 = this; - - if (!this.isVisibilityChange) return; - if (this.props.forceOpen || this.state.visible) { - var wrapper = window.requestAnimationFrame || setTimeout; - wrapper(function () { - var styles = _this2.props.rtl ? _this2.getRTLMenuPosition() : _this2.getMenuPosition(); - - _this2.subMenu.style.removeProperty('top'); - _this2.subMenu.style.removeProperty('bottom'); - _this2.subMenu.style.removeProperty('left'); - _this2.subMenu.style.removeProperty('right'); - - if ((0, _helpers.hasOwnProp)(styles, 'top')) _this2.subMenu.style.top = styles.top; - if ((0, _helpers.hasOwnProp)(styles, 'left')) _this2.subMenu.style.left = styles.left; - if ((0, _helpers.hasOwnProp)(styles, 'bottom')) _this2.subMenu.style.bottom = styles.bottom; - if ((0, _helpers.hasOwnProp)(styles, 'right')) _this2.subMenu.style.right = styles.right; - _this2.subMenu.classList.add(_helpers.cssClasses.menuVisible); - - _this2.registerHandlers(); - _this2.setState({ selectedItem: null }); - }); - } else { - var cleanup = function cleanup() { - _this2.subMenu.removeEventListener('transitionend', cleanup); - _this2.subMenu.style.removeProperty('bottom'); - _this2.subMenu.style.removeProperty('right'); - _this2.subMenu.style.top = 0; - _this2.subMenu.style.left = '100%'; - _this2.unregisterHandlers(); - }; - this.subMenu.addEventListener('transitionend', cleanup); - this.subMenu.classList.remove(_helpers.cssClasses.menuVisible); - } - } - }, { - key: 'componentWillUnmount', - value: function componentWillUnmount() { - if (this.listenId) { - _globalEventListener2.default.unregister(this.listenId); - } - - if (this.opentimer) clearTimeout(this.opentimer); - - if (this.closetimer) clearTimeout(this.closetimer); - - this.unregisterHandlers(true); - } - }, { - key: 'render', - value: function render() { - var _cx; - - var _props = this.props, - children = _props.children, - attributes = _props.attributes, - disabled = _props.disabled, - title = _props.title, - selected = _props.selected; - var visible = this.state.visible; - - var menuProps = { - ref: this.menuRef, - onMouseEnter: this.handleMouseEnter, - onMouseLeave: this.handleMouseLeave, - className: (0, _classnames2.default)(_helpers.cssClasses.menuItem, _helpers.cssClasses.subMenu, attributes.listClassName), - style: { - position: 'relative' - } - }; - var menuItemProps = { - className: (0, _classnames2.default)(_helpers.cssClasses.menuItem, attributes.className, (_cx = {}, _defineProperty(_cx, (0, _classnames2.default)(_helpers.cssClasses.menuItemDisabled, attributes.disabledClassName), disabled), _defineProperty(_cx, (0, _classnames2.default)(_helpers.cssClasses.menuItemActive, attributes.visibleClassName), visible), _defineProperty(_cx, (0, _classnames2.default)(_helpers.cssClasses.menuItemSelected, attributes.selectedClassName), selected), _cx)), - onMouseMove: this.props.onMouseMove, - onMouseOut: this.props.onMouseOut, - onClick: this.handleClick - }; - var subMenuProps = { - ref: this.subMenuRef, - style: { - position: 'absolute', - transition: 'opacity 1ms', // trigger transitionend event - top: 0, - left: '100%' - }, - className: (0, _classnames2.default)(_helpers.cssClasses.menu, this.props.className) - }; - - return _react2.default.createElement( - 'nav', - _extends({}, menuProps, { role: 'menuitem', tabIndex: '-1', 'aria-haspopup': 'true' }), - _react2.default.createElement( - 'div', - _extends({}, attributes, menuItemProps), - title - ), - _react2.default.createElement( - 'nav', - _extends({}, subMenuProps, { role: 'menu', tabIndex: '-1' }), - this.renderChildren(children) - ) - ); - } - }]); - - return SubMenu; -}(_AbstractMenu3.default); - -SubMenu.propTypes = { - children: _propTypes2.default.node.isRequired, - attributes: _propTypes2.default.object, - title: _propTypes2.default.node.isRequired, - className: _propTypes2.default.string, - disabled: _propTypes2.default.bool, - hoverDelay: _propTypes2.default.number, - rtl: _propTypes2.default.bool, - selected: _propTypes2.default.bool, - onMouseMove: _propTypes2.default.func, - onMouseOut: _propTypes2.default.func, - forceOpen: _propTypes2.default.bool, - forceClose: _propTypes2.default.func, - parentKeyNavigationHandler: _propTypes2.default.func -}; -SubMenu.defaultProps = { - disabled: false, - hoverDelay: 500, - attributes: {}, - className: '', - rtl: false, - selected: false, - onMouseMove: function onMouseMove() { - return null; - }, - onMouseOut: function onMouseOut() { - return null; - }, - forceOpen: false, - forceClose: function forceClose() { - return null; - }, - parentKeyNavigationHandler: function parentKeyNavigationHandler() { - return null; - } -}; -exports.default = SubMenu; \ No newline at end of file diff --git a/modules/actions.js b/modules/actions.js deleted file mode 100644 index a564cd73..00000000 --- a/modules/actions.js +++ /dev/null @@ -1,54 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.MENU_HIDE = exports.MENU_SHOW = undefined; -exports.dispatchGlobalEvent = dispatchGlobalEvent; -exports.showMenu = showMenu; -exports.hideMenu = hideMenu; - -var _objectAssign = require('object-assign'); - -var _objectAssign2 = _interopRequireDefault(_objectAssign); - -var _helpers = require('./helpers'); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var MENU_SHOW = exports.MENU_SHOW = 'REACT_CONTEXTMENU_SHOW'; -var MENU_HIDE = exports.MENU_HIDE = 'REACT_CONTEXTMENU_HIDE'; - -function dispatchGlobalEvent(eventName, opts) { - var target = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : window; - - // Compatibale with IE - // @see http://stackoverflow.com/questions/26596123/internet-explorer-9-10-11-event-constructor-doesnt-work - var event = void 0; - - if (typeof window.CustomEvent === 'function') { - event = new window.CustomEvent(eventName, { detail: opts }); - } else { - event = document.createEvent('CustomEvent'); - event.initCustomEvent(eventName, false, true, opts); - } - - if (target) { - target.dispatchEvent(event); - (0, _objectAssign2.default)(_helpers.store, opts); - } -} - -function showMenu() { - var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var target = arguments[1]; - - dispatchGlobalEvent(MENU_SHOW, (0, _objectAssign2.default)({}, opts, { type: MENU_SHOW }), target); -} - -function hideMenu() { - var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var target = arguments[1]; - - dispatchGlobalEvent(MENU_HIDE, (0, _objectAssign2.default)({}, opts, { type: MENU_HIDE }), target); -} \ No newline at end of file diff --git a/modules/connectMenu.js b/modules/connectMenu.js deleted file mode 100644 index c895f3cb..00000000 --- a/modules/connectMenu.js +++ /dev/null @@ -1,98 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -exports.default = function (menuId) { - // expect menu component to connect as inner parameter - // is presumably a wrapper of - return function (Child) { - // return wrapper for that forwards the ContextMenuTrigger's additional props - return function (_Component) { - _inherits(ConnectMenu, _Component); - - function ConnectMenu(props) { - _classCallCheck(this, ConnectMenu); - - var _this = _possibleConstructorReturn(this, (ConnectMenu.__proto__ || Object.getPrototypeOf(ConnectMenu)).call(this, props)); - - _this.handleShow = function (e) { - if (e.detail.id !== menuId) return; - - // the onShow event's detail.data object holds all ContextMenuTrigger props - var data = e.detail.data; - - var filteredData = {}; - - for (var key in data) { - // exclude props the ContextMenuTrigger is expecting itself - if (!ignoredTriggerProps.includes(key)) { - filteredData[key] = data[key]; - } - } - _this.setState({ trigger: filteredData }); - }; - - _this.handleHide = function () { - _this.setState({ trigger: null }); - }; - - _this.state = { trigger: null }; - return _this; - } - - _createClass(ConnectMenu, [{ - key: 'componentDidMount', - value: function componentDidMount() { - this.listenId = _globalEventListener2.default.register(this.handleShow, this.handleHide); - } - }, { - key: 'componentWillUnmount', - value: function componentWillUnmount() { - if (this.listenId) { - _globalEventListener2.default.unregister(this.listenId); - } - } - }, { - key: 'render', - value: function render() { - return _react2.default.createElement(Child, _extends({}, this.props, { id: menuId, trigger: this.state.trigger })); - } - }]); - - return ConnectMenu; - }(_react.Component); - }; -}; - -var _react = require('react'); - -var _react2 = _interopRequireDefault(_react); - -var _ContextMenuTrigger = require('./ContextMenuTrigger'); - -var _ContextMenuTrigger2 = _interopRequireDefault(_ContextMenuTrigger); - -var _globalEventListener = require('./globalEventListener'); - -var _globalEventListener2 = _interopRequireDefault(_globalEventListener); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - -// collect ContextMenuTrigger's expected props to NOT pass them on as part of the context -var ignoredTriggerProps = [].concat(_toConsumableArray(Object.keys(_ContextMenuTrigger2.default.propTypes)), ['children']); - -// expect the id of the menu to be responsible for as outer parameter \ No newline at end of file diff --git a/modules/globalEventListener.js b/modules/globalEventListener.js deleted file mode 100644 index 32276107..00000000 --- a/modules/globalEventListener.js +++ /dev/null @@ -1,55 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _actions = require('./actions'); - -var _helpers = require('./helpers'); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var GlobalEventListener = function GlobalEventListener() { - var _this = this; - - _classCallCheck(this, GlobalEventListener); - - this.handleShowEvent = function (event) { - for (var id in _this.callbacks) { - if ((0, _helpers.hasOwnProp)(_this.callbacks, id)) _this.callbacks[id].show(event); - } - }; - - this.handleHideEvent = function (event) { - for (var id in _this.callbacks) { - if ((0, _helpers.hasOwnProp)(_this.callbacks, id)) _this.callbacks[id].hide(event); - } - }; - - this.register = function (showCallback, hideCallback) { - var id = (0, _helpers.uniqueId)(); - - _this.callbacks[id] = { - show: showCallback, - hide: hideCallback - }; - - return id; - }; - - this.unregister = function (id) { - if (id && _this.callbacks[id]) { - delete _this.callbacks[id]; - } - }; - - this.callbacks = {}; - - if (_helpers.canUseDOM) { - window.addEventListener(_actions.MENU_SHOW, this.handleShowEvent); - window.addEventListener(_actions.MENU_HIDE, this.handleHideEvent); - } -}; - -exports.default = new GlobalEventListener(); \ No newline at end of file diff --git a/modules/helpers.js b/modules/helpers.js deleted file mode 100644 index c160e9e1..00000000 --- a/modules/helpers.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.callIfExists = callIfExists; -exports.hasOwnProp = hasOwnProp; -exports.uniqueId = uniqueId; -function callIfExists(func) { - for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - - return typeof func === 'function' && func.apply(undefined, args); -} - -function hasOwnProp(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} - -function uniqueId() { - return Math.random().toString(36).substring(7); -} - -var cssClasses = exports.cssClasses = { - menu: 'react-contextmenu', - menuVisible: 'react-contextmenu--visible', - menuWrapper: 'react-contextmenu-wrapper', - menuItem: 'react-contextmenu-item', - menuItemActive: 'react-contextmenu-item--active', - menuItemDisabled: 'react-contextmenu-item--disabled', - menuItemDivider: 'react-contextmenu-item--divider', - menuItemSelected: 'react-contextmenu-item--selected', - subMenu: 'react-contextmenu-submenu' -}; - -var store = exports.store = {}; - -var canUseDOM = exports.canUseDOM = Boolean(typeof window !== 'undefined' && window.document && window.document.createElement); \ No newline at end of file diff --git a/modules/index.js b/modules/index.js deleted file mode 100644 index 60dcffa3..00000000 --- a/modules/index.js +++ /dev/null @@ -1,67 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _ContextMenu = require('./ContextMenu'); - -Object.defineProperty(exports, 'ContextMenu', { - enumerable: true, - get: function get() { - return _interopRequireDefault(_ContextMenu).default; - } -}); - -var _ContextMenuTrigger = require('./ContextMenuTrigger'); - -Object.defineProperty(exports, 'ContextMenuTrigger', { - enumerable: true, - get: function get() { - return _interopRequireDefault(_ContextMenuTrigger).default; - } -}); - -var _MenuItem = require('./MenuItem'); - -Object.defineProperty(exports, 'MenuItem', { - enumerable: true, - get: function get() { - return _interopRequireDefault(_MenuItem).default; - } -}); - -var _SubMenu = require('./SubMenu'); - -Object.defineProperty(exports, 'SubMenu', { - enumerable: true, - get: function get() { - return _interopRequireDefault(_SubMenu).default; - } -}); - -var _connectMenu = require('./connectMenu'); - -Object.defineProperty(exports, 'connectMenu', { - enumerable: true, - get: function get() { - return _interopRequireDefault(_connectMenu).default; - } -}); - -var _actions = require('./actions'); - -Object.defineProperty(exports, 'hideMenu', { - enumerable: true, - get: function get() { - return _actions.hideMenu; - } -}); -Object.defineProperty(exports, 'showMenu', { - enumerable: true, - get: function get() { - return _actions.showMenu; - } -}); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file From 5b8f7fb6a266b95d3350e6079e5ddf5625fc9f2c Mon Sep 17 00:00:00 2001 From: Akash Depra Date: Tue, 24 Jul 2018 11:57:20 +0530 Subject: [PATCH 214/258] Updated gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 637782bd..36f1f6d7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ node_modules/ public/ +dist/ +modules/ +es6/ +coverage/ .vscode .idea *.log From 3acac0aec5c5702357ec52518ebe72b590a199e6 Mon Sep 17 00:00:00 2001 From: Vivek Kumar Bansal Date: Thu, 26 Jul 2018 10:59:54 +0530 Subject: [PATCH 215/258] 2.9.3 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index d2627ea0..e686e1fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "react-contextmenu", - "version": "2.9.2", + "version": "2.9.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index e7c6372c..7fe2f710 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-contextmenu", - "version": "2.9.2", + "version": "2.9.3", "description": "Context Menu implemented in React", "main": "modules/index.js", "module": "es6/index.js", From e2d9eea54d562df5a8c5cb8fb37b60d2fd166933 Mon Sep 17 00:00:00 2001 From: William Hilton Date: Fri, 5 Oct 2018 12:11:27 -0400 Subject: [PATCH 216/258] publish missing index.d.ts file (fix #236) --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 7fe2f710..c34222b5 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "files": [ "es6", "modules", - "dist" + "dist", + "src/index.d.ts" ], "scripts": { "lint": "eslint ./src ./examples", From 1c976d6c14470e7793167f974a3e3f443da4d5c1 Mon Sep 17 00:00:00 2001 From: Vivek Kumar Bansal Date: Wed, 10 Oct 2018 18:51:57 +0530 Subject: [PATCH 217/258] 2.9.4 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index e686e1fc..a9cea8f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "react-contextmenu", - "version": "2.9.3", + "version": "2.9.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c34222b5..95ba4b20 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-contextmenu", - "version": "2.9.3", + "version": "2.9.4", "description": "Context Menu implemented in React", "main": "modules/index.js", "module": "es6/index.js", From e869e36299dbcfd1807d68b9af08d461eea0d38d Mon Sep 17 00:00:00 2001 From: Tryggvi Gylfason Date: Wed, 17 Oct 2018 12:10:02 +0200 Subject: [PATCH 218/258] Add rtl prop to the ContextMenu Component This allows the ContextMenu to render on the left side of the cursor. Useful to RTL directional pages --- examples/RTLSubMenu.js | 4 +- src/ContextMenu.js | 39 +++++++++++++++++++- tests/__snapshots__/ContextMenu.test.js.snap | 4 ++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/examples/RTLSubMenu.js b/examples/RTLSubMenu.js index 610c0eb0..65392d14 100644 --- a/examples/RTLSubMenu.js +++ b/examples/RTLSubMenu.js @@ -23,7 +23,7 @@ export default class RTLSubMenu extends Component { render() { return (
    -

    Right-to-Left Submenu Menu

    +

    Right-to-Left ContextMenu and Submenu Menu

    This demos usage of Right-to-Left submenus.

    right click to see the menu
    @@ -31,7 +31,7 @@ export default class RTLSubMenu extends Component {
    {this.state.logs.map((log, i) =>

    {log}

    )}
    - + Menu Item 1 Menu Item 2 diff --git a/src/ContextMenu.js b/src/ContextMenu.js index fbccb904..0610c958 100644 --- a/src/ContextMenu.js +++ b/src/ContextMenu.js @@ -16,6 +16,7 @@ export default class ContextMenu extends AbstractMenu { data: PropTypes.object, className: PropTypes.string, hideOnLeave: PropTypes.bool, + rtl: PropTypes.bool, onHide: PropTypes.func, onMouseLeave: PropTypes.func, onShow: PropTypes.func, @@ -26,6 +27,7 @@ export default class ContextMenu extends AbstractMenu { className: '', data: {}, hideOnLeave: false, + rtl: false, onHide() { return null; }, onMouseLeave() { return null; }, onShow() { return null; }, @@ -57,7 +59,9 @@ export default class ContextMenu extends AbstractMenu { wrapper(() => { const { x, y } = this.state; - const { top, left } = this.getMenuPosition(x, y); + const { top, left } = this.props.rtl + ? this.getRTLMenuPosition(x, y) + : this.getMenuPosition(x, y); wrapper(() => { if (!this.menu) return; @@ -178,6 +182,39 @@ export default class ContextMenu extends AbstractMenu { return menuStyles; } + getRTLMenuPosition = (x = 0, y = 0) => { + let menuStyles = { + top: y, + left: x + }; + + if (!this.menu) return menuStyles; + + const { innerWidth, innerHeight } = window; + const rect = this.menu.getBoundingClientRect(); + + // Try to position the menu on the left side of the cursor + menuStyles.left = x - rect.width; + + if (y + rect.height > innerHeight) { + menuStyles.top -= rect.height; + } + + if (menuStyles.left < 0) { + menuStyles.left += rect.width; + } + + if (menuStyles.top < 0) { + menuStyles.top = rect.height < innerHeight ? (innerHeight - rect.height) / 2 : 0; + } + + if (menuStyles.left + rect.width > innerWidth) { + menuStyles.left = rect.width < innerWidth ? (innerWidth - rect.width) / 2 : 0; + } + + return menuStyles; + } + menuRef = (c) => { this.menu = c; } diff --git a/tests/__snapshots__/ContextMenu.test.js.snap b/tests/__snapshots__/ContextMenu.test.js.snap index 6ecbd22d..ee944073 100644 --- a/tests/__snapshots__/ContextMenu.test.js.snap +++ b/tests/__snapshots__/ContextMenu.test.js.snap @@ -9,6 +9,7 @@ exports[`ContextMenu tests does not shows when event with incorrect "id" is trig onHide={[Function]} onMouseLeave={[Function]} onShow={[Function]} + rtl={false} style={Object {}} >