diff --git a/caravel/assets/javascripts/explorev2/components/TimeFilter.jsx b/caravel/assets/javascripts/explorev2/components/TimeFilter.jsx
index dfcbd4041d846..0903465f00ed7 100644
--- a/caravel/assets/javascripts/explorev2/components/TimeFilter.jsx
+++ b/caravel/assets/javascripts/explorev2/components/TimeFilter.jsx
@@ -1,13 +1,13 @@
import React from 'react';
-import Select from 'react-select';
import { bindActionCreators } from 'redux';
import * as actions from '../actions/exploreActions';
import { connect } from 'react-redux';
import { sinceOptions, untilOptions } from '../constants';
+import SelectArray from './SelectArray';
const propTypes = {
actions: React.PropTypes.object,
- datasourceClass: React.PropTypes.string,
+ datasourceType: React.PropTypes.string,
timeColumnOpts: React.PropTypes.array,
timeColumn: React.PropTypes.string,
timeGrainOpts: React.PropTypes.array,
@@ -25,92 +25,57 @@ const defaultProps = {
until: null,
};
-class TimeFilter extends React.Component {
- changeTimeColumn(timeColumnOpt) {
- const val = (timeColumnOpt) ? timeColumnOpt.value : null;
- this.props.actions.setTimeColumn(val);
- }
- changeTimeGrain(timeGrainOpt) {
- const val = (timeGrainOpt) ? timeGrainOpt.value : null;
- this.props.actions.setTimeGrain(val);
- }
- changeSince(sinceOpt) {
- const val = (sinceOpt) ? sinceOpt.value : null;
- this.props.actions.setSince(val);
- }
- changeUntil(untilOpt) {
- const val = (untilOpt) ? untilOpt.value : null;
- this.props.actions.setUntil(val);
- }
- render() {
- const timeColumnPlaceHolder =
- (this.props.datasourceClass === 'SqlaTable') ? 'Time Column' : 'Time Granularity';
- const timeGrainPlaceHolder =
- (this.props.datasourceClass === 'SqlaTable') ? 'Time Grain' : 'Origin';
- return (
-
-
Time Filter
-
-
-
Time Column & Grains
-
-
-
-
-
Since - Until
-
-
+const TimeFilter = (props) => {
+ const isDatasourceTypeTable = props.datasourceType === 'table';
+ const timeColumnTitle = isDatasourceTypeTable ? 'Time Column' : 'Time Granularity';
+ const timeGrainTitle = isDatasourceTypeTable ? 'Time Grain' : 'Origin';
+ const selects = [
+ {
+ key: 'timeColumn',
+ title: timeColumnTitle,
+ options: props.timeColumnOpts,
+ value: props.timeColumn,
+ },
+ {
+ key: 'timeGrain',
+ title: timeGrainTitle,
+ options: props.timeGrainOpts,
+ value: props.timeGrain,
+ },
+ {
+ key: 'since',
+ title: 'Since',
+ options: sinceOptions.map((s) => ({ value: s, label: s })),
+ value: props.since,
+ },
+ {
+ key: 'until',
+ title: 'Until',
+ options: untilOptions.map((u) => ({ value: u, label: u })),
+ value: props.until,
+ }];
+ return (
+
+
Time Filter
+
+
- );
- }
-}
+
+ );
+};
TimeFilter.propTypes = propTypes;
TimeFilter.defaultProps = defaultProps;
function mapStateToProps(state) {
return {
- datasourceClass: state.datasourceClass,
+ datasourceType: state.datasourceType,
timeColumnOpts: state.timeColumnOpts,
- timeColumn: state.timeColumn,
+ timeColumn: state.viz.formData.timeColumn,
timeGrainOpts: state.timeGrainOpts,
- timeGrain: state.timeGrain,
- since: state.since,
- until: state.until,
+ timeGrain: state.viz.formData.timeGrain,
+ since: state.viz.formData.since,
+ until: state.viz.formData.until,
};
}
diff --git a/caravel/assets/javascripts/explorev2/index.jsx b/caravel/assets/javascripts/explorev2/index.jsx
index 47f1e63ca922c..a3ef614da9545 100644
--- a/caravel/assets/javascripts/explorev2/index.jsx
+++ b/caravel/assets/javascripts/explorev2/index.jsx
@@ -17,15 +17,21 @@ const bootstrappedState = Object.assign(initialState, {
datasourceId: parseInt(bootstrapData.datasource_id, 10),
datasourceType: bootstrapData.datasource_type,
sliceName: bootstrapData.viz.form_data.slice_name,
- sliceId: bootstrapData.viz.form_data.slice_id,
- vizType: bootstrapData.viz.form_data.viz_type,
- timeColumn: bootstrapData.viz.form_data.granularity_sqla,
- timeGrain: bootstrapData.viz.form_data.time_grain_sqla,
- metrics: [bootstrapData.viz.form_data.metrics].map((m) => ({ value: m, label: m })),
- since: bootstrapData.viz.form_data.since,
- until: bootstrapData.viz.form_data.until,
- havingClause: bootstrapData.viz.form_data.having,
- whereClause: bootstrapData.viz.form_data.where,
+ viz: {
+ formData: {
+ sliceId: bootstrapData.viz.form_data.slice_id,
+ vizType: bootstrapData.viz.form_data.viz_type,
+ timeColumn: bootstrapData.viz.form_data.granularity_sqla,
+ timeGrain: bootstrapData.viz.form_data.time_grain_sqla,
+ metrics: [bootstrapData.viz.form_data.metrics].map((m) => ({ value: m, label: m })),
+ since: bootstrapData.viz.form_data.since,
+ until: bootstrapData.viz.form_data.until,
+ having: bootstrapData.viz.form_data.having,
+ where: bootstrapData.viz.form_data.where,
+ rowLimit: bootstrapData.viz.form_data.row_limit,
+ timeStampFormat: bootstrapData.viz.form_data.table_timestamp_format,
+ },
+ },
});
const store = createStore(exploreReducer, bootstrappedState,
compose(applyMiddleware(thunk))
diff --git a/caravel/assets/javascripts/explorev2/reducers/exploreReducer.js b/caravel/assets/javascripts/explorev2/reducers/exploreReducer.js
index 9e5d9d94f4ea5..8e397c7e52dcb 100644
--- a/caravel/assets/javascripts/explorev2/reducers/exploreReducer.js
+++ b/caravel/assets/javascripts/explorev2/reducers/exploreReducer.js
@@ -2,71 +2,50 @@ import { defaultFormData, defaultOpts } from '../stores/store';
import * as actions from '../actions/exploreActions';
import { addToArr, removeFromArr, alterInArr } from '../../../utils/reducerUtils';
+const setFormInViz = function (state, action) {
+ const newFormData = Object.assign({}, state);
+ newFormData[action.key] = action.value;
+ return newFormData;
+};
+
+const setVizInState = function (state, action) {
+ switch (action.type) {
+ case actions.SET_FORM_DATA:
+ return {
+ ...state,
+ formData: setFormInViz(state.formData, action),
+ };
+ default:
+ return state;
+ }
+};
+
export const exploreReducer = function (state, action) {
const actionHandlers = {
[actions.SET_DATASOURCE]() {
return Object.assign({}, state, { datasourceId: action.datasourceId });
},
- [actions.SET_VIZTYPE]() {
- return Object.assign({}, state, { vizType: action.vizType });
- },
[actions.SET_TIME_COLUMN_OPTS]() {
return Object.assign({}, state, { timeColumnOpts: action.timeColumnOpts });
},
[actions.SET_TIME_GRAIN_OPTS]() {
return Object.assign({}, state, { timeGrainOpts: action.timeGrainOpts });
},
- [actions.SET_TIME_COLUMN]() {
- return Object.assign({}, state, { timeColumn: action.timeColumn });
- },
- [actions.SET_TIME_GRAIN]() {
- return Object.assign({}, state, { timeGrain: action.timeGrain });
- },
- [actions.SET_SINCE]() {
- return Object.assign({}, state, { since: action.since });
- },
- [actions.SET_UNTIL]() {
- return Object.assign({}, state, { until: action.until });
- },
[actions.SET_GROUPBY_COLUMN_OPTS]() {
return Object.assign({}, state, { groupByColumnOpts: action.groupByColumnOpts });
},
- [actions.SET_GROUPBY_COLUMNS]() {
- return Object.assign({}, state, { groupByColumns: action.groupByColumns });
- },
[actions.SET_METRICS_OPTS]() {
return Object.assign({}, state, { metricsOpts: action.metricsOpts });
},
- [actions.SET_METRICS]() {
- return Object.assign({}, state, { metrics: action.metrics });
- },
[actions.SET_COLUMN_OPTS]() {
return Object.assign({}, state, { columnOpts: action.columnOpts });
},
- [actions.SET_NOT_GROUPBY_COLUMNS]() {
- return Object.assign({}, state, { columns: action.columns });
- },
[actions.SET_ORDERING_OPTS]() {
return Object.assign({}, state, { orderingOpts: action.orderingOpts });
},
- [actions.SET_ORDERINGS]() {
- return Object.assign({}, state, { orderings: action.orderings });
- },
- [actions.SET_TIME_STAMP_FORMAT]() {
- return Object.assign({}, state, { timeStampFormat: action.timeStampFormat });
- },
- [actions.SET_ROW_LIMIT]() {
- return Object.assign({}, state, { rowLimit: action.rowLimit });
- },
[actions.TOGGLE_SEARCHBOX]() {
return Object.assign({}, state, { searchBox: action.searchBox });
},
- [actions.SET_WHERE_CLAUSE]() {
- return Object.assign({}, state, { whereClause: action.whereClause });
- },
- [actions.SET_HAVING_CLAUSE]() {
- return Object.assign({}, state, { havingClause: action.havingClause });
- },
[actions.SET_FILTER_COLUMN_OPTS]() {
return Object.assign({}, state, { filterColumnOpts: action.filterColumnOpts });
},
@@ -94,6 +73,12 @@ export const exploreReducer = function (state, action) {
[actions.SET_DATASOURCE_TYPE]() {
return Object.assign({}, state, { datasourceType: action.datasourceType });
},
+ [actions.SET_FORM_DATA]() {
+ return {
+ ...state,
+ viz: setVizInState(state.viz, action),
+ };
+ },
};
if (action.type in actionHandlers) {
return actionHandlers[action.type]();
diff --git a/caravel/assets/javascripts/explorev2/stores/store.js b/caravel/assets/javascripts/explorev2/stores/store.js
index 236013c1dae0b..6ea89e6e3a148 100644
--- a/caravel/assets/javascripts/explorev2/stores/store.js
+++ b/caravel/assets/javascripts/explorev2/stores/store.js
@@ -1,21 +1,16 @@
-export const initialState = {
- datasources: null,
- datasourceId: null,
- datasourceType: null,
+// TODO: add datasource_type here after druid support is added
+export const defaultFormData = {
+ sliceId: null,
vizType: null,
- timeColumnOpts: [],
timeColumn: null,
- timeGrainOpts: [],
timeGrain: null,
- since: null,
- until: null,
- groupByColumnOpts: [],
groupByColumns: [],
- metricsOpts: [],
metrics: [],
- columnOpts: [],
+ since: null,
+ until: null,
+ having: null,
+ where: null,
columns: [],
- orderingOpts: [],
orderings: [],
timeStampFormat: 'smart_date',
rowLimit: 50000,
@@ -23,26 +18,27 @@ export const initialState = {
whereClause: '',
havingClause: '',
filters: [],
- filterColumnOpts: [],
};
-// TODO: add datasource_type here after druid support is added
-export const defaultFormData = {
- vizType: null,
- timeColumn: null,
+export const initialState = {
+ datasources: null,
+ datasourceId: null,
+ datasourceType: null,
+ timeColumnOpts: [],
+ timeGrainOpts: [],
timeGrain: null,
- since: null,
- until: null,
- groupByColumns: [],
- metrics: [],
- columns: [],
- orderings: [],
- timeStampFormat: 'smart_date',
- rowLimit: 50000,
+ groupByColumnOpts: [],
+ metricsOpts: [],
+ columnOpts: [],
+ orderingOpts: [],
searchBox: false,
whereClause: '',
havingClause: '',
filters: [],
+ filterColumnOpts: [],
+ viz: {
+ formData: defaultFormData,
+ },
};
export const defaultOpts = {
diff --git a/caravel/assets/spec/javascripts/explore/components/actions_spec.js b/caravel/assets/spec/javascripts/explore/components/actions_spec.js
index 6c18b2a0ee454..808822c3b8bf3 100644
--- a/caravel/assets/spec/javascripts/explore/components/actions_spec.js
+++ b/caravel/assets/spec/javascripts/explore/components/actions_spec.js
@@ -11,33 +11,6 @@ describe('reducers', () => {
expect(newState.datasourceId).to.equal(1);
});
- it('should return new state with viz type', () => {
- const newState = exploreReducer(initialState, actions.setVizType('bar'));
- expect(newState.vizType).to.equal('bar');
- });
-
- it('should return new state with not groupby columns', () => {
- const newColumn = ['col'];
- const newState = exploreReducer(initialState, actions.setNotGroupByColumns(newColumn));
- expect(newState.columns).to.deep.equal(['col']);
- });
-
- it('should return new state with orderings', () => {
- const newOrdering = ['ord'];
- const newState = exploreReducer(initialState, actions.setOrderings(newOrdering));
- expect(newState.orderings).to.deep.equal(['ord']);
- });
-
- it('should return new state with time stamp', () => {
- const newState = exploreReducer(initialState, actions.setTimeStampFormat(1));
- expect(newState.timeStampFormat).to.equal(1);
- });
-
- it('should return new state with row limit', () => {
- const newState = exploreReducer(initialState, actions.setRowLimit(10));
- expect(newState.rowLimit).to.equal(10);
- });
-
it('should return new state with search box toggled', () => {
const newState = exploreReducer(initialState, actions.toggleSearchBox(true));
expect(newState.searchBox).to.equal(true);