From 7a5115a2d0c2960738dee1babbb9366ccedc847d Mon Sep 17 00:00:00 2001 From: Maxime Beauchemin Date: Mon, 10 Jul 2017 23:51:22 -0700 Subject: [PATCH] [bugfix] only filterable columns should show up in FilterBox list --- .../explore/components/ControlPanelsContainer.jsx | 12 ++++++++++-- .../assets/javascripts/explore/stores/visTypes.js | 11 ++++++++--- superset/connectors/base/models.py | 4 +++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/superset/assets/javascripts/explore/components/ControlPanelsContainer.jsx b/superset/assets/javascripts/explore/components/ControlPanelsContainer.jsx index 9227390d12516..ac82bb490c31d 100644 --- a/superset/assets/javascripts/explore/components/ControlPanelsContainer.jsx +++ b/superset/assets/javascripts/explore/components/ControlPanelsContainer.jsx @@ -4,7 +4,7 @@ import PropTypes from 'prop-types'; import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; import { Alert } from 'react-bootstrap'; -import { sectionsToRender } from '../stores/visTypes'; +import { sectionsToRender, visTypes } from '../stores/visTypes'; import ControlPanelSection from './ControlPanelSection'; import ControlRow from './ControlRow'; import Control from './Control'; @@ -28,7 +28,15 @@ class ControlPanelsContainer extends React.Component { this.getControlData = this.getControlData.bind(this); } getControlData(controlName) { - const mapF = controls[controlName].mapStateToProps; + // Identifying mapStateToProps function to apply (logic can't be in store) + let mapF = controls[controlName].mapStateToProps; + + // Looking to find mapStateToProps override for this viz type + const controlOverrides = visTypes[this.props.controls.viz_type.value].controlOverrides || {}; + if (controlOverrides[controlName] && controlOverrides[controlName].mapStateToProps) { + mapF = controlOverrides[controlName].mapStateToProps; + } + // Applying mapStateToProps if needed if (mapF) { return Object.assign({}, this.props.controls[controlName], mapF(this.props.exploreState)); } diff --git a/superset/assets/javascripts/explore/stores/visTypes.js b/superset/assets/javascripts/explore/stores/visTypes.js index bdebf076420ae..7d3f26284bbca 100644 --- a/superset/assets/javascripts/explore/stores/visTypes.js +++ b/superset/assets/javascripts/explore/stores/visTypes.js @@ -75,7 +75,7 @@ export const sections = { ], }; -const visTypes = { +export const visTypes = { dist_bar: { label: 'Distribution - Bar Chart', controlPanelSections: [ @@ -742,8 +742,13 @@ const visTypes = { controlOverrides: { groupby: { label: 'Filter controls', - description: 'The controls you want to filter on', - default: [], + description: ( + 'The controls you want to filter on. Note that only columns ' + + 'checked as "filterable" will show up on this list.' + ), + mapStateToProps: state => ({ + options: (state.datasource) ? state.datasource.columns.filter(c => c.filterable) : [], + }), }, }, }, diff --git a/superset/connectors/base/models.py b/superset/connectors/base/models.py index e203ef4401200..9869ec9805567 100644 --- a/superset/connectors/base/models.py +++ b/superset/connectors/base/models.py @@ -222,7 +222,9 @@ def expression(self): @property def data(self): - attrs = ('column_name', 'verbose_name', 'description', 'expression') + attrs = ( + 'column_name', 'verbose_name', 'description', 'expression', + 'filterable') return {s: getattr(self, s) for s in attrs}