diff --git a/caravel/assets/javascripts/components/InfoTooltipWithTrigger.jsx b/caravel/assets/javascripts/components/InfoTooltipWithTrigger.jsx
index ffe1b8249ad62..39b5ff8f8b6f0 100644
--- a/caravel/assets/javascripts/components/InfoTooltipWithTrigger.jsx
+++ b/caravel/assets/javascripts/components/InfoTooltipWithTrigger.jsx
@@ -1,5 +1,6 @@
import React, { PropTypes } from 'react';
import { Tooltip, OverlayTrigger } from 'react-bootstrap';
+import { slugify } from '../modules/utils';
const propTypes = {
label: PropTypes.string.isRequired,
@@ -10,7 +11,7 @@ export default function InfoTooltipWithTrigger({ label, tooltip }) {
return (
{tooltip}}
+ overlay={{tooltip}}
>
diff --git a/caravel/assets/javascripts/explorev2/components/ControlLabelWithTooltip.jsx b/caravel/assets/javascripts/explorev2/components/ControlLabelWithTooltip.jsx
index f8d1b7ef426bb..6e499aace348a 100644
--- a/caravel/assets/javascripts/explorev2/components/ControlLabelWithTooltip.jsx
+++ b/caravel/assets/javascripts/explorev2/components/ControlLabelWithTooltip.jsx
@@ -3,12 +3,11 @@ import { ControlLabel } from 'react-bootstrap';
import InfoTooltipWithTrigger from '../../components/InfoTooltipWithTrigger';
const propTypes = {
- label: PropTypes.string,
+ label: PropTypes.string.isRequired,
description: PropTypes.string,
};
const defaultProps = {
- label: null,
description: null,
};
diff --git a/caravel/assets/javascripts/explorev2/components/ControlPanelSection.jsx b/caravel/assets/javascripts/explorev2/components/ControlPanelSection.jsx
index 0ba0102c0fc9f..a6fe2e3bb4a71 100644
--- a/caravel/assets/javascripts/explorev2/components/ControlPanelSection.jsx
+++ b/caravel/assets/javascripts/explorev2/components/ControlPanelSection.jsx
@@ -16,12 +16,12 @@ const defaultProps = {
};
export default class ControlPanelSection extends React.Component {
- header() {
+ renderHeader() {
const { label, tooltip } = this.props;
let header;
if (label) {
header = (
-
+
{label}
{tooltip && }
@@ -32,7 +32,7 @@ export default class ControlPanelSection extends React.Component {
render() {
return (
-
+
{this.props.children}
);
diff --git a/caravel/assets/javascripts/explorev2/components/FieldSet.jsx b/caravel/assets/javascripts/explorev2/components/FieldSet.jsx
index 2698952b63abe..c0aefeffa6556 100644
--- a/caravel/assets/javascripts/explorev2/components/FieldSet.jsx
+++ b/caravel/assets/javascripts/explorev2/components/FieldSet.jsx
@@ -40,22 +40,25 @@ export default class FieldSet extends React.Component {
render() {
const type = this.props.type;
- let html;
+ const selectTypes = [
+ 'SelectField',
+ 'SelectCustomMultiField',
+ 'SelectMultipleSortableField',
+ 'FreeFormSelectField',
+ ];
+ let field;
if (type === 'CheckboxField') {
- html = this.renderCheckBoxField();
- } else if (type === 'SelectField' ||
- type === 'SelectCustomMultiField' ||
- type === 'SelectMultipleSortableField' ||
- type === 'FreeFormSelectField') {
- html = this.renderSelectField();
- } else if (type === 'TextField' || type === 'IntegerField') {
- html = this.renderTextField();
+ field = this.renderCheckBoxField();
+ } else if (selectTypes.includes(type)) {
+ field = this.renderSelectField();
+ } else if (['TextField', 'IntegerField'].includes(type)) {
+ field = this.renderTextField();
} else if (type === 'TextAreaField') {
- this.renderTextAreaField();
+ field = this.renderTextAreaField();
}
- return html;
+ return field;
}
}
diff --git a/caravel/assets/javascripts/explorev2/components/SelectField.jsx b/caravel/assets/javascripts/explorev2/components/SelectField.jsx
index 97f1626eb57e5..6cbd09ac7792d 100644
--- a/caravel/assets/javascripts/explorev2/components/SelectField.jsx
+++ b/caravel/assets/javascripts/explorev2/components/SelectField.jsx
@@ -1,6 +1,7 @@
import React, { PropTypes } from 'react';
import { FormGroup, FormControl } from 'react-bootstrap';
import ControlLabelWithTooltip from './ControlLabelWithTooltip';
+import { slugify } from '../../modules/utils';
const propTypes = {
label: PropTypes.string,
@@ -14,7 +15,7 @@ const defaultProps = {
export default function SelectField({ label, description }) {
return (
-
+
diff --git a/caravel/assets/javascripts/modules/utils.js b/caravel/assets/javascripts/modules/utils.js
index 0c89875f8b82e..a4409bbe270f7 100644
--- a/caravel/assets/javascripts/modules/utils.js
+++ b/caravel/assets/javascripts/modules/utils.js
@@ -142,3 +142,13 @@ export function formatSelectOptions(options) {
[opt, opt]
);
}
+
+export function slugify(string) {
+ // slugify('My Neat Label! '); returns 'my-neat-label'
+ return string
+ .toString()
+ .toLowerCase()
+ .trim()
+ .replace(/[\s\W-]+/g, '-') // replace spaces, non-word chars, w/ a single dash (-)
+ .replace(/-$/, ''); // remove last floating dash
+}