From 6d4fdafc021ace5f6a3771b2e527278f9d8d664f Mon Sep 17 00:00:00 2001 From: Aaron Lindsay Date: Sat, 17 Jun 2017 14:24:02 -0400 Subject: [PATCH] reports: Move flattening tabulations into reducer This removes some circular control dependencies --- js/actions/ReportActions.js | 44 +----------------- js/components/ReportsTab.js | 10 +--- js/containers/ReportsTabContainer.js | 2 +- js/reducers/ReportReducer.js | 68 ++++++++++++++++++++++++++-- 4 files changed, 68 insertions(+), 56 deletions(-) diff --git a/js/actions/ReportActions.js b/js/actions/ReportActions.js index cb60f89..040dd31 100644 --- a/js/actions/ReportActions.js +++ b/js/actions/ReportActions.js @@ -87,10 +87,9 @@ function selectionCleared() { } } -function seriesSelected(flattenedTabulation, seriesTraversal) { +function seriesSelected(seriesTraversal) { return { type: ReportConstants.SERIES_SELECTED, - tabulation: flattenedTabulation, seriesTraversal: seriesTraversal } } @@ -228,45 +227,6 @@ function tabulate(report) { }; } -function selectSeries(tabulation, seriesTraversal) { - return function (dispatch) { - if (!seriesTraversal) - seriesTraversal = []; - - // Descend the tree to the right series to flatten - var series = tabulation; - for (var i=0; i < seriesTraversal.length; i++) { - if (!series.Series.hasOwnProperty(seriesTraversal[i])) { - dispatch(ErrorActions.clientError("Invalid series")); - return; - } - series = series.Series[seriesTraversal[i]]; - } - - // Actually flatten the data - var flattenedSeries = series.mapReduceChildren(null, - function(accumulator, currentValue, currentIndex, array) { - return accumulator + currentValue; - } - ); - - // Add back in any values from the current level - if (series.hasOwnProperty('Values')) - flattenedSeries[Tabulation.topLevelSeriesName()] = series.Values; - - var flattenedTabulation = new Tabulation(); - - flattenedTabulation.ReportId = tabulation.ReportId; - flattenedTabulation.Title = tabulation.Title; - flattenedTabulation.Subtitle = tabulation.Subtitle; - flattenedTabulation.Units = tabulation.Units; - flattenedTabulation.Labels = tabulation.Labels.slice(); - flattenedTabulation.FlattenedSeries = flattenedSeries; - - dispatch(seriesSelected(flattenedTabulation, seriesTraversal)); - }; -} - module.exports = { fetchAll: fetchAll, create: create, @@ -274,5 +234,5 @@ module.exports = { remove: remove, tabulate: tabulate, select: reportSelected, - selectSeries: selectSeries + selectSeries: seriesSelected }; diff --git a/js/components/ReportsTab.js b/js/components/ReportsTab.js index 029e9cc..750033a 100644 --- a/js/components/ReportsTab.js +++ b/js/components/ReportsTab.js @@ -156,10 +156,6 @@ class ReportsTab extends React.Component { nextProps.onTabulateReport(nextProps.reports.map[nextProps.reports.list[0]]); this.setState({initialized: true}); } - } else if (selected != -1 && - nextProps.reports.tabulations.hasOwnProperty(selected) && - nextProps.reports.selectedTabulation == null) { - nextProps.onSelectSeries(nextProps.reports.tabulations[selected]); } } handleSelectSeries(series) { @@ -167,8 +163,7 @@ class ReportsTab extends React.Component { return; var seriesTraversal = this.props.reports.seriesTraversal.slice(); seriesTraversal.push(series); - var selectedTabulation = this.props.reports.tabulations[this.props.reports.selected]; - this.props.onSelectSeries(selectedTabulation, seriesTraversal); + this.props.onSelectSeries(seriesTraversal); } handleSelectReport(report) { this.props.onSelectReport(report); @@ -214,10 +209,9 @@ class ReportsTab extends React.Component { var self = this; var navOnClick = function() { var onSelectSeries = self.props.onSelectSeries; - var tabulation = self.props.reports.tabulations[self.props.reports.selected]; var mySeriesTraversal = seriesTraversal.slice(); return function() { - onSelectSeries(tabulation, mySeriesTraversal); + onSelectSeries(mySeriesTraversal); }; }(); titleTracks.push(( diff --git a/js/containers/ReportsTabContainer.js b/js/containers/ReportsTabContainer.js index 84e3f93..48b451e 100644 --- a/js/containers/ReportsTabContainer.js +++ b/js/containers/ReportsTabContainer.js @@ -23,7 +23,7 @@ function mapDispatchToProps(dispatch) { onDeleteReport: function(report) {dispatch(ReportActions.remove(report))}, onSelectReport: function(report) {dispatch(ReportActions.select(report))}, onTabulateReport: function(report) {dispatch(ReportActions.tabulate(report))}, - onSelectSeries: function(tabulation, seriesTraversal) {dispatch(ReportActions.selectSeries(tabulation, seriesTraversal))} + onSelectSeries: function(seriesTraversal) {dispatch(ReportActions.selectSeries(seriesTraversal))} } } diff --git a/js/reducers/ReportReducer.js b/js/reducers/ReportReducer.js index 6405ec7..59f70bf 100644 --- a/js/reducers/ReportReducer.js +++ b/js/reducers/ReportReducer.js @@ -3,6 +3,9 @@ var assign = require('object-assign'); var ReportConstants = require('../constants/ReportConstants'); var UserConstants = require('../constants/UserConstants'); +var models = require('../models.js'); +var Tabulation = models.Tabulation; + const initialState = { map: {}, tabulations: {}, @@ -12,6 +15,40 @@ const initialState = { seriesTraversal: [] }; +function getFlattenedTabulation(tabulation, seriesTraversal) { + // Descend the tree to the right series to flatten + var series = tabulation; + for (var i=0; i < seriesTraversal.length; i++) { + if (!series.Series.hasOwnProperty(seriesTraversal[i])) { + dispatch(ErrorActions.clientError("Invalid series")); + return; + } + series = series.Series[seriesTraversal[i]]; + } + + // Actually flatten the data + var flattenedSeries = series.mapReduceChildren(null, + function(accumulator, currentValue, currentIndex, array) { + return accumulator + currentValue; + } + ); + + // Add back in any values from the current level + if (series.hasOwnProperty('Values')) + flattenedSeries[Tabulation.topLevelSeriesName()] = series.Values; + + var flattenedTabulation = new Tabulation(); + + flattenedTabulation.ReportId = tabulation.ReportId; + flattenedTabulation.Title = tabulation.Title; + flattenedTabulation.Subtitle = tabulation.Subtitle; + flattenedTabulation.Units = tabulation.Units; + flattenedTabulation.Labels = tabulation.Labels.slice(); + flattenedTabulation.FlattenedSeries = flattenedSeries; + + return flattenedTabulation; +} + module.exports = function(state = initialState, action) { switch (action.type) { case ReportConstants.REPORTS_FETCHED: @@ -33,6 +70,13 @@ module.exports = function(state = initialState, action) { }); case ReportConstants.REPORT_CREATED: case ReportConstants.REPORT_UPDATED: + var selectedTabulation = state.selectedTabulation; + var seriesTraversal = state.seriesTraversal; + if (state.selected == action.report.ReportId) { + selectedTabulation = initialState.selectedTabulation; + seriesTraversal = initialState.seriesTraversal; + } + var report = action.report; var reports = assign({}, state.map, { [report.ReportId]: report @@ -45,7 +89,9 @@ module.exports = function(state = initialState, action) { } return assign({}, state, { map: reports, - list: list + list: list, + selectedTabulation: selectedTabulation, + seriesTraversal: seriesTraversal }); case ReportConstants.REPORT_REMOVED: var selected = state.selected; @@ -58,22 +104,34 @@ module.exports = function(state = initialState, action) { selected: selected }); case ReportConstants.REPORT_SELECTED: + var selectedTabulation = null; + if (state.tabulations.hasOwnProperty(action.report.ReportId)) { + selectedTabulation = getFlattenedTabulation(state.tabulations[action.report.ReportId], initialState.seriesTraversal) + } return assign({}, state, { selected: action.report.ReportId, - selectedTabulation: null, - seriesTraversal: [] + selectedTabulation: selectedTabulation, + seriesTraversal: initialState.seriesTraversal }); case ReportConstants.REPORT_TABULATED: var tabulation = action.tabulation; var tabulations = assign({}, state.tabulations, { [tabulation.ReportId]: tabulation }); + var selectedTabulation = state.selectedTabulation; + var seriesTraversal = state.seriesTraversal; + if (tabulation.ReportId == state.selected) { + selectedTabulation = getFlattenedTabulation(tabulation, initialState.seriesTraversal) + seriesTraversal = initialState.seriesTraversal; + } return assign({}, state, { - tabulations: tabulations + tabulations: tabulations, + selectedTabulation: selectedTabulation, + seriesTraversal: seriesTraversal }); case ReportConstants.SERIES_SELECTED: return assign({}, state, { - selectedTabulation: action.tabulation, + selectedTabulation: getFlattenedTabulation(state.tabulations[state.selected], action.seriesTraversal), seriesTraversal: action.seriesTraversal }); case UserConstants.USER_LOGGEDOUT: