'use strict'; /*global document, Tether*/ import PopoverContent from './popover_content.react' export default React.createClass({ displayName: 'PopoverWithTrigger', getInitialState: function() { return { modalOpen: false }; }, componentWillMount: function() { var popoverContainer = document.createElement('span'); popoverContainer.className = 'PopoverContainer'; this._popoverElement = popoverContainer; // TODO: we probably should put this somewhere other than body because then // its outside our ng-view and could cause lots of issues document.querySelector('body').appendChild(this._popoverElement); }, componentDidMount: function() { this._renderPopover(); }, componentDidUpdate: function() { this._renderPopover(); }, componentWillUnmount: function() { this._tether.destroy(); React.unmountComponentAtNode(this._popoverElement); if (this._popoverElement.parentNode) { this._popoverElement.parentNode.removeChild(this._popoverElement); } this._tether = undefined; }, toggleModal: function() { var modalOpen = !this.state.modalOpen; this.setState({ modalOpen: modalOpen }); }, _popoverComponent: function() { return ( <PopoverContent handleClickOutside={this.toggleModal}> <div className={this.props.className}> {this.props.children} </div> </PopoverContent> ); }, _tetherOptions: function() { // sensible defaults for most popovers return { attachment: 'bottom right', targetAttachment: 'top right', targetOffset: '10px 0', optimizations: { moveElement: false // always moves to <body> anyway! } }; }, _renderPopover: function() { if (this.state.modalOpen) { // modal is open, lets do this! React.render(this._popoverComponent(), this._popoverElement); var tetherOptions = (this.props.tetherOptions) ? this.props.tetherOptions : this._tetherOptions(); // NOTE: these must be set here because they relate to OUR component and can't be passed in tetherOptions.element = this._popoverElement; tetherOptions.target = this.getDOMNode(); if (this._tether !== undefined && this._tether !== null) { this._tether.setOptions(tetherOptions); } else { this._tether = new Tether(tetherOptions); } } else { // if the modal isn't open then actively unmount our popover React.unmountComponentAtNode(this._popoverElement); } }, render: function() { return ( <span> <a className="mx1" href="#" onClick={this.toggleModal}> {this.props.triggerElement} </a> </span> ); } });