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 +}