diff --git a/ui/src/chronograf/components/Panel.js b/ui/src/chronograf/components/Panel.js index df04fc1682..1e39bd373b 100644 --- a/ui/src/chronograf/components/Panel.js +++ b/ui/src/chronograf/components/Panel.js @@ -3,6 +3,7 @@ import classNames from 'classnames'; import QueryEditor from './QueryEditor'; import QueryTabItem from './QueryTabItem'; import RenamePanelModal from './RenamePanelModal'; +import SimpleDropdown from 'src/shared/components/SimpleDropdown'; const {shape, func, bool, arrayOf} = PropTypes; const Panel = React.createClass({ @@ -32,7 +33,6 @@ const Panel = React.createClass({ getInitialState() { return { - showAddQueryOptions: false, activeQueryId: null, }; }, @@ -41,18 +41,12 @@ const Panel = React.createClass({ this.setState({activeQueryId: query.id}); }, - toggleAddQueryOptions() { - this.setState({showAddQueryOptions: !this.state.showAddQueryOptions}); - }, - handleAddQuery() { this.props.actions.addQuery(); - this.setState({showAddQueryOptions: false}); }, handleAddRawQuery() { this.props.actions.addQuery({rawText: `SELECT "fields" from "db"."rp"."measurement"`}); - this.setState({showAddQueryOptions: false}); }, handleDeleteQuery(query) { @@ -163,22 +157,24 @@ const Panel = React.createClass({ ); }, - renderAddQuery() { - const {showAddQueryOptions} = this.state; - if (showAddQueryOptions) { - return ( -
- - - -
- ); + onChoose(item) { + switch (item.text) { + case 'Builder': + this.handleAddQuery(); + break; + case 'Raw': + this.handleAddRawQuery(); + break; } + }, + renderAddQuery() { return ( -
- -
+ +
+ +
+
); }, }); diff --git a/ui/src/shared/components/SimpleDropdown.js b/ui/src/shared/components/SimpleDropdown.js new file mode 100644 index 0000000000..5ca70f30d4 --- /dev/null +++ b/ui/src/shared/components/SimpleDropdown.js @@ -0,0 +1,56 @@ +import React, {PropTypes} from 'react'; +import OnClickOutside from 'shared/components/OnClickOutside'; + +const Dropdown = React.createClass({ + propTypes: { + children: PropTypes.node.isRequired, + items: PropTypes.arrayOf(PropTypes.shape({ + text: PropTypes.string.isRequired, + })).isRequired, + onChoose: PropTypes.func.isRequired, + className: PropTypes.string, + }, + getInitialState() { + return { + isOpen: false, + }; + }, + handleClickOutside() { + this.setState({isOpen: false}); + }, + handleSelection(item) { + this.toggleMenu(); + this.props.onChoose(item); + }, + toggleMenu(e) { + if (e) { + e.stopPropagation(); + } + this.setState({isOpen: !this.state.isOpen}); + }, + render() { + const self = this; + const {items, className} = self.props; + + return ( +
+
+ {this.props.children} +
+ {self.state.isOpen ? + + : null} +
+ ); + }, +}); + +export default OnClickOutside(Dropdown);