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 ?
+
+ {items.map((item, i) => {
+ return (
+ - self.handleSelection(item)}>
+ {item.text}
+
+ );
+ })}
+
+ : null}
+
+ );
+ },
+});
+
+export default OnClickOutside(Dropdown);